Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi nonVCL - Bitmap in Bitmap kopieren (https://www.delphipraxis.net/53913-nonvcl-bitmap-bitmap-kopieren.html)

turboPASCAL 25. Sep 2005 11:00


nonVCL - Bitmap in Bitmap kopieren
 
Hi,

wie kann man ein Bitmap in ein anderes kopieren ? Diese Procedure zeichnet nur darüber:

Delphi-Quellcode:
procedure SetBitmap(hWnd: HWND);
begin
  h_DC := GetDC(GetDlgItem(hwnd, IDC_IMG1));

  hBitmapDC := CreateCompatibleDC(h_DC);
  hOldBitmap := SelectObject(hBitmapDC, Bitmap);

  BitBlt(h_DC, 0, 0, 32, 32, hBitmapDC, 0, 0, SRCCOPY);
                                           
  SelectObject(hBitmapDC, hOldBitmap);
  DeleteDC(hBitmapDC);
  ReleaseDC(hwnd, h_DC);
end;
Ich möchte in einem Dialog enth. Bitmap mein eigenes einsetzen.

VCL:
Delphi-Quellcode:
ImageX.Picture.Assign(MyBitmap);

Olli 25. Sep 2005 12:24

Re: nonVCL - Bitmap in Bitmap kopieren
 
Ich weiß zwar nicht genau was du willst, aber entweder mußt du wohl ein anderes Flag in BitBlt() einsetzen als SRCCOPY - damit kannst du zwei Bitmaps "mischen".

Zitat:

Zitat von turboPASCAL
VCL:
Delphi-Quellcode:
ImageX.Picture.Assign(MyBitmap);

Das gibt es so ohne VCL nicht. Im Grunde macht diese Zuweisung intern nur, daß das alte Handle (und assoziierter Speicher) freigegeben wird und ein neues Handle zugewiesen wird. Es sorgt also im Gegensatz zu einer fälschlichen Direktzuweisung ala "Bitmap1 := Bitmap2" dafür, daß keine Speicherlecks auftreten.

Flocke 25. Sep 2005 13:07

Re: nonVCL - Bitmap in Bitmap kopieren
 
Wenn's ein STATIC-Element ist dann suchst du vielleicht nach der Meldung MSDN-Library durchsuchenSTM_SETIMAGE.

turboPASCAL 25. Sep 2005 15:58

Re: nonVCL - Bitmap in Bitmap kopieren
 
Zitat:

Zitat von Olli
...entweder mußt du wohl ein anderes Flag in BitBlt() einsetzen als SRCCOPY - damit kannst du zwei Bitmaps "mischen".

"Mischen" will ich die Bitmaps nicht. :wink:

Zitat:

Zitat von Olli
Zitat:

Zitat von turboPASCAL
Delphi-Quellcode:
ImageX.Picture.Assign(MyBitmap);

Das gibt es so ohne VCL nicht.

Ja, ne ist klar. Das sollte ein Beispiel zum Verstäntnis sein, was ich machen möchte. :wink:

Zitat:

Zitat von Olli
Im Grunde macht diese Zuweisung intern nur, daß das alte Handle (und assoziierter Speicher) freigegeben wird und ein neues Handle zugewiesen wird. Es sorgt also im Gegensatz zu einer fälschlichen Direktzuweisung ala "Bitmap1 := Bitmap2" dafür, daß keine Speicherlecks auftreten.

Ja und das möchte ich ohne VCL machen.

Zitat:

Zitat von Flocke
Wenn's ein STATIC-Element ist dann suchst du vielleicht nach der Meldung MSDN-Library durchsuchenSTM_SETIMAGE.

Das habe ich gesucht.


Doch nun stecke ich wieder fest.
Also ich möchte ein vorhandenes Image (Bitmap) auf einem Dialog durch ein selbst erstelltes (aus einer Bitmap-Resource) ersetzen.

Delphi-Quellcode:
// var ResBitmap: HBITMAP ist global def.
// ResBitmap := LoadBitmap(hInstance, MAKEINTRESOURCE(1));

procedure SetBitmap(hWnd: HWND);
var
  myBitmapDC: HDC;
  ResBitmapDC: HDC;
  myBitmap: HBITMAP;
  hOldBitmap: HBITMAP;
begin
  // DC von DlgItem (Image) holen
  myBitmapDC := GetDC(GetDlgItem(hwnd, IDC_IMG1));
  // DC für ResBitmap erstellen
  ResBitmapDC := CreateCompatibleDC(myBitmapDC);

  // Mem-Bitmap erzeugen
  myBitmap  := CreateCompatibleBitmap(myBitmapDC, 32, 32);

  // dem Mem-Bitmap einen DC zuweisen
  SelectObject(myBitmapDC, myBitmap);

  // dem ResBitmap einen DC zuweisen
  hOldBitmap := SelectObject(ResBitmapDC, ResBitmap);

  // Bild von ResBitmap zu Mem-Bitmap kopieren
  BitBlt(myBitmapDC, 0, 0, 32, 32, ResBitmapDC, 0, 0, SRCCOPY);

  // dem DlgItem-Image das neue (Mem)Bitmap senden
  SendDlgItemMessage(hwnd, IDC_IMG1, STM_SETIMAGE, IMAGE_BITMAP, myBitmap);

  SelectObject(ResBitmapDC, hOldBitmap);
  DeleteDC(ResBitmapDC);
  ReleaseDC(GetDlgItem(hwnd, IDC_IMG1), myBitmapDC);
end;
So funktioniert das nicht. Irgendwie habe ich den Durchblick verloren... :gruebel:

Olli 25. Sep 2005 16:18

Re: nonVCL - Bitmap in Bitmap kopieren
 
Laß den Rest weg und weise einfach ResBitmap über SendDlgItemMessage(hwnd, IDC_IMG1, STM_SETIMAGE, IMAGE_BITMAP, ResBitmap); zu. Dazu vorher mit ResBitmap := LoadBitmap(hInstance, MAKEINTRESOURCE(1)); laden.

turboPASCAL 25. Sep 2005 16:28

Re: nonVCL - Bitmap in Bitmap kopieren
 
Das geht nicht, äh.. schon aber ich will nur einen Ausschnitt aus dem ResBitmap auf/in das "DlgItem-Image" machen. :wink:

Delphi-Quellcode:
BitBlt(myBitmapDC, 0, 0, 32, 32, ResBitmapDC, count * 32 - 32,
    Animation[AnimType].Offset * 32, SRCCOPY);
Sonst wäre es ja zu einfach. :zwinker:

Olli 25. Sep 2005 16:41

Re: nonVCL - Bitmap in Bitmap kopieren
 
Aha, na das kann man ja nicht wissen :zwinker:

In diesem Falle holst du dir den DC des (Client-)Fensters, erstellst einen kompatiblen (Mem-)DC. Dann selektierst du deine Ressourcen-Bitmap in den Mem-DC. Danach blittest du von dem Mem-DC auf den des Fensters mit den entsprechenden von dir vorgesehenen Offsets. An deiner Stelle würde ich die Ressourcen-Bitmap aber immer geladen lassen!!!

Flocke 25. Sep 2005 16:46

Re: nonVCL - Bitmap in Bitmap kopieren
 
Zitat:

Zitat von Olli
Aha, na das kann man ja nicht wissen :zwinker:

In diesem Falle holst du dir den DC des (Client-)Fensters, erstellst einen kompatiblen (Mem-)DC. Dann selektierst du deine Ressourcen-Bitmap in den Mem-DC. Danach blittest du von dem Mem-DC auf den des Fensters mit den entsprechenden von dir vorgesehenen Offsets. An deiner Stelle würde ich die Ressourcen-Bitmap aber immer geladen lassen!!!

Müsste er das dann nicht bei jedem WM_PAINT machen? :gruebel:

Ansonsten: mit STM_GETIMAGE die Bitmap des fremden Fensters holen, modifizieren (wie von Olli beschrieben), und mit STM_SETIMAGE wieder setzen.

Olli 25. Sep 2005 17:49

Re: nonVCL - Bitmap in Bitmap kopieren
 
Zitat:

Zitat von Flocke
Müsste er das dann nicht bei jedem WM_PAINT machen? :gruebel:

Ich denke schon.

turboPASCAL 25. Sep 2005 19:48

Re: nonVCL - Bitmap in Bitmap kopieren
 
Ich auch. :wink:

Auf die Gefahr hin, dass ihr mich auf den Hof fegen schickt, hänge ich den Sourcecode mal an, in der Hoffnung, das ihr mal ein (oder auch zwei) Auge(n) drauf werft.

Ich komme einfach nicht weiter. Es geht um die Procedure SetBitmap(hWnd: HWND);.

[Edit=turboPASCAL] Anhang entfernt, kommt aber wo anders wieder. :tongue: [/Edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 Uhr.
Seite 1 von 3  1 23      

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