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
Sprite in Speicherbitmap kopieren klappt nicht
-
- Beiträge: 8
- Registriert: So 25. Jan 2015, 18:11
-
- Beiträge: 6914
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
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.
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 grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 8
- Registriert: So 25. Jan 2015, 18:11
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
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
- af0815
- Lazarusforum e. V.
- Beiträge: 6776
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Sprite in Speicherbitmap kopieren klappt nicht
BTW: In Lazarus gibt es auch ein Spriteexample.
Menü Tools/Example Projects -> dort Sprite bei Projects eingeben.
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).