Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmap auf Bildschirm zeichnen (https://www.delphipraxis.net/38725-bitmap-auf-bildschirm-zeichnen.html)

jfheins 23. Jan 2005 13:35


Bitmap auf Bildschirm zeichnen
 
Ich habe eine Animation, in der ich ein Bitmap habe, da draufzeichne, und dann das Bitmap ausgebe. kann ich das auch irgendwie direkt aufden Bildschirm zeichen ???
Also sowas wie Screen.Assign(Bitmap) ???

Dani 23. Jan 2005 13:43

Re: Bitmap auf Bildschirm zeichnen
 
Hi,

worauf willst du die Bitmap zeichnen lassen? Man kann nicht auf TScreen zeichnen, sondern nur auf Zeichenflächen (also TCanvas bzw. ein HDC). Wenn du auf dem gesamten Bildschirm zeichnen willst helfen dir die Funktionen MSDN-Library durchsuchenGetDesktopWindow und MSDN-Library durchsuchenGetDC weiter =)

jfheins 23. Jan 2005 13:59

Re: Bitmap auf Bildschirm zeichnen
 
Ich möchte das Bitmap auf den ganzen Bildschirm zeichnen, ja.
Es muss nicht z.B. Spiele "überzeichnen", aber sowas wie eine Fullscreen-Ansicht meines Bitmaps.

P.S. Könntest du mir das mit dem GETDC mal erklären ? Ich versteh' das irgendwie nicht do richtig ... :? :(

Dani 23. Jan 2005 14:08

Re: Bitmap auf Bildschirm zeichnen
 
GetDC liefert dir die zu einem Fenster gehörige Zeichenfläche (in Form eines Handles).

Delphi-Quellcode:
//Bitmap auf Desktop ausgeben
procedure DrawBMPOnDesktop(BMP: TBitmap; XOffset, YOffset: Integer);
var hdcDesktop: HDC;
begin
  hdcDesktop := GetDC(GetDesktopWindow);
  If hdcDesktop <> 0 then
   (**Schnelles kopieren des Bitmaps auf die Desktop-Zeichenfläche**)
   BitBlt(hdcDesktop, XOffset, YOffset BMP.Width, BMP.Height,
          BMP.Canvas.Handle, 0, 0, SRCCOPY);
end;
ist aber ungetestet, alle Angaben ohn.... :mrgreen:

//Edit: Delphi-Tags

jfheins 27. Jan 2005 19:42

Re: Bitmap auf Bildschirm zeichnen
 
Funktioniert super, hab' Sie noch ein wenig abgewandelt ...

Delphi-Quellcode:
procedure DrawBMPFullScreen(BMP: TBitmap32);
var hdcDesktop: HDC;
begin
  hdcDesktop := GetDC(0);
  If hdcDesktop <> 0 then
    StretchBlt(hdcDesktop,
               0,
               0,
               GetSystemMetrics(SM_CXSCREEN),  // Screenbreite
               GetSystemMetrics(SM_CYSCREEN),  // Screenhöhe
               BMP.Canvas.Handle,
               0,
               0,
               BMP.Width,
               BMP.Height,
               SRCCOPY);
end;

jfheins 28. Jan 2005 18:51

Re: Bitmap auf Bildschirm zeichnen
 
Zu früh gefreut ... Jetzt muss man das immer wieder wegwischen ...

Kann man alles neuzeichenen lassen ???

Mit
Delphi-Quellcode:
SendMessage (HWND_BROADCAST, WM_PAINT, 0, 0);
geht's irgendwie nicht ... :gruebel:

Sollte Non-VCL sein ...

Edit:

Lösung:
Delphi-Quellcode:
 InvalidateRect (0, nil, TRUE);

jfheins 11. Mär 2005 21:26

Re: Bitmap auf Bildschirm zeichnen
 
Mittlerweile habe ich folgendes Problem: Wenn ich mein tolles Bitmap zeiche (mitunter 60 mal /sek) und dann mit der Maus unten in Richtung Taskleiste gehe, dann flimmert die Taskleiste da durch, also mal wird mein Bitmap auf die Taskbar gezeichnet, und mal andersrum. kann ich irgendwie mein Desktop-Fenster (Handle: 0) nach oben holen, dass die Taskbar dadrunter gezeichnet wird ???

Oder kann ich gar einen DC dafür anlegen, der alles überdeckt ?

jfheins 17. Mär 2005 16:24

Re: Bitmap auf Bildschirm zeichnen
 
*piep*

Hospi 17. Mär 2005 19:57

Re: Bitmap auf Bildschirm zeichnen
 
Wo zeichnest du das Bild rein, direckt auf die Form? Wenn du das Bild in einem Image zeichnen würdest, könntest du das Image löschen und danach neu erzeugen. :gruebel:

z.B. so:
Delphi-Quellcode:
Image1.Free;
Image1:=TImage.Create(Self);
with Image1 do
 begin
  Name:='Image1';
  Parent:=self;
  Left:=336;
  Top:=40;
  height:=273;
  width:=489;
 end;
Gruß
Hospi

jfheins 17. Mär 2005 21:30

Re: Bitmap auf Bildschirm zeichnen
 
Nene, ist schon Vollbild, aber es flackert halt, wenn ich mit der Maus z.B. über si Taskleiste gehe ... :?

Luckie 17. Mär 2005 21:32

Re: Bitmap auf Bildschirm zeichnen
 
Zitat:

Zitat von jfheins
Delphi-Quellcode:
  hdcDesktop := GetDC(0);

Zitat:

Zitat von PSDK
the ReleaseDC function must be called to release the DC.


jfheins 17. Mär 2005 21:53

Re: Bitmap auf Bildschirm zeichnen
 
Du meinst so:
Delphi-Quellcode:
var
  hdcDesktop: HDC;
begin
  hdcDesktop := GetDC(0);
  If hdcDesktop <> 0 then
    StretchBlt(hdcDesktop,
               0,
               0,
               GetSystemMetrics(SM_CXSCREEN),  // Screenbreite
               GetSystemMetrics(SM_CYSCREEN),  // Screenhöhe
               Bitmap.Canvas.Handle,
               0,
               0,
               Bitmap.Width,
               Bitmap.Height,
               SRCCOPY);

  ReleaseDC (0, hdcDesktop);
end;
Geht aber auch nicht, das flimmern bleibt ...

Hospi 18. Mär 2005 07:47

Re: Bitmap auf Bildschirm zeichnen
 
Zitat:

Geht aber auch nicht, das flimmern bleibt ...
Wie wäre es wenn du mit zwei Bildern arbeitest. Einem positiv und einen negativ.

Delphi-Quellcode:
BitBlt(hdcDesktop, XOffset, YOffset BMP.Width, BMP.Height, BMPnegativ.Canvas.Handle, 0, 0, SRCCOPY);
BitBlt(hdcDesktop, XOffset, YOffset BMP.Width, BMP.Height, BMPpositiv.Canvas.Handle, 0, 0, SRCCOPY);

jfheins 18. Mär 2005 16:07

Re: Bitmap auf Bildschirm zeichnen
 
Zitat:

Zitat von Hospi
Wie wäre es wenn du mit zwei Bildern arbeitest. Einem positiv und einen negativ.

Was soll das den bringen ? :gruebel:

Desweiteren sei gesagt, dass dieses Zeichen aus einem Simulationsthread heraus geschieht, es muss also möglichst performant sein, und nicht die VCL benutzen ...

Hospi 19. Mär 2005 13:26

Re: Bitmap auf Bildschirm zeichnen
 
Schon Gut,
Frage: Lädtst du ein und das selbe Bild mehrmals(dadurch würde ein Flimmern auftreten)? :?: :?:
Wenn ja, wie währe es wenn du dir einfach eine Variable(vom Typ boolean) schaffst die das abfängt, dann hast du auch kein flimmern mehr.

jfheins 19. Mär 2005 15:10

Re: Bitmap auf Bildschirm zeichnen
 
Nein, ich zeichne immer meine Simulation auf einen Bitmap, dann den Bitmap auf den Bildschirm.
Das Flimmern tritt ja auch nur auf, wenn ich ein anderes Fenster habe, das meint, sich zeichnen zu müssen, wie z.B. Die Taskbuttons, wenn ma auf die draufgeht, dann gibts ja diesen Hovereffekt, dass die son bisschen leuchten, das zeichnet sich halt neu, und kommt dann ab und zu über mein tolles Bitmap, und weil das zig mal pro Sekunde gezeichnet wird, ist an dieser Stelle mal das Fenster, und mal mein Bitmap zu sehen, also flimmeert es ...)

Hospi 19. Mär 2005 19:10

Re: Bitmap auf Bildschirm zeichnen
 
Zitat:

Zitat von jfheins
und weil das zig mal pro Sekunde gezeichnet wird, ist an dieser Stelle mal das Fenster, und mal mein Bitmap zu sehen, also flimmeert es ...)

Und wenn du nun das immer-neu-zeichnen abfängst, indem du dir eine Funktion schaffst, die ausgibt ob das Bild nochmal zu zeichnen ist oder nicht? :gruebel:

jfheins 19. Mär 2005 20:27

Re: Bitmap auf Bildschirm zeichnen
 
Dann ist das Fenster, dass meint, sich zeichnen zu müssen länger zu sehen ...

Aber das Bitmap ist eh jedesmal ein anderes, weil sich meine Objekte immer bewegen ...

Kann man das DesktopWindow vielleicht so wie fsAlwaysOnTop machen ???


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz