Sprite in Speicherbitmap kopieren klappt nicht

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...

Sprite in Speicherbitmap kopieren klappt nicht

Beitragvon Weatherman » 12. Feb 2016, 18:12 Sprite in Speicherbitmap kopieren klappt nicht

Hallo,
versuche einen eigenen Bildschirmschoner zu programmieren, dabei wird der ursprügliche Bildschirm gespeichert, danach das neue Bitmap per StretchBlt auf den Bildschirm kopiert.
Dieser neue Hintergrund wird wiederum in ein Speicherbitmap kopiert, quasi als Ursprungskopie für ein weiteres Speicherbitmap, in das ständig ein kleines transparentes Bitmap an anderer
Position kopiert wird. Danach wird die gesamte Speicherbitmap wieder auf den Bildschirm kopiert. Das funktioneirt auch soweit ganz gut, nur die kleine Bitmap oder Sprite, die sich über den Bildschirm bewegen soll, erscheint nicht. Nur wenn ich es direkt auf den Bildschirm kopiere gehts. Mein Problem liegt wahrscheinlich zwischen meinen Ohren und lautet zusammengefasst: Warum kann ich nicht in die Speicherbitmap zeichnen? Im angefügten Codeausschnitt ist es der Gerätekontext DCTemp. Vielleicht entdeckt ja jemand den Fehler und klärt mich auf.
Gruß
HP
Myscreensaver.txt
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Weatherman
 
Beiträge: 8
Registriert: 25. Jan 2015, 18:11

Beitragvon Mathias » 12. Feb 2016, 20:49 Re: Sprite in Speicherbitmap kopieren klappt nicht

Wieso machst du das ganzen Windows-Zeugs, Lazarus hat alles eigene Komponenten für solche Bitmap-Manipulationen.
Das einzig DC, das du brauchst ist der ScreenDC, welcher dir aber Lazarus zu Verfügung stellt.

Es ist nicht das gebe vom Ei was die Geschwindigkeit betrifft, ab das kleine Programm demonstriert dir wie man es machen kann.

Code: Alles auswählen
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  LCLType, LCLIntf, ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    MyBitmap: Graphics.TBitmap;
    ScreenDC: LCLType.HDC;
    IconPos, IconPosAlt: TPoint;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  MyBitmap := Graphics.TBitmap.Create;
  ScreenDC := LCLIntf.GetDC(0);
  MyBitmap.LoadFromDevice(ScreenDC);
  DoubleBuffered := True;
 
  LCLIntf.ReleaseDC(0, ScreenDC);
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(MyBitmap);
end;
 
procedure TForm1.FormPaint(Sender: TObject);
var
  s: TPoint;
begin
  s.x := MyBitmap.Width;
  s.y := MyBitmap.Height;
  Canvas.Draw(0,0,MyBitmap);
//  Canvas.CopyRect(Rect(IconPosAlt.x, IconPosAlt.y, s.x, s.y), MyBitmap.Canvas, Rect(IconPosAlt.x, IconPosAlt.y, s.x, s.y));
  Canvas.Draw(IconPos.x, IconPos.y, Image1.Picture.Bitmap);
  IconPosAlt := IconPos;
  IconPos.x += 1;
  IconPos.y += 1;
  if IconPos.x > ClientWidth - 50 then begin
    IconPos.x := 0;
  end;
  if IconPos.y > ClientHeight - 50 then begin
    IconPos.y := 0;
  end;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Repaint;
end;
 
end.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Weatherman » 12. Feb 2016, 21:55 Re: Sprite in Speicherbitmap kopieren klappt nicht

Vielen Dank Mathias,

wahrscheinlich ist es das Vernünftigste sich da von Windows zu lösen, ich werd's mal mit den Lazarus - Komponenten entsprechend deinem Beispiel probieren.

HP
Weatherman
 
Beiträge: 8
Registriert: 25. Jan 2015, 18:11

Beitragvon af0815 » 12. Feb 2016, 22:12 Re: Sprite in Speicherbitmap kopieren klappt nicht

BTW: In Lazarus gibt es auch ein Spriteexample.

Menü Tools/Example Projects -> dort Sprite bei Projects eingeben.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3488
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

• Themenende •

Zurück zu Multimedia



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried