Sprite in Speicherbitmap kopieren klappt nicht

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Weatherman
Beiträge: 8
Registriert: So 25. Jan 2015, 18:11

Sprite in Speicherbitmap kopieren klappt nicht

Beitrag von Weatherman »

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
(2.54 KiB) 79-mal heruntergeladen

Mathias
Beiträge: 6162
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

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

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

Re: Sprite in Speicherbitmap kopieren klappt nicht

Beitrag von Weatherman »

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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

Beitrag von af0815 »

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).

Antworten