AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi nonVCL - Bitmap in Bitmap kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

nonVCL - Bitmap in Bitmap kopieren

Ein Thema von turboPASCAL · begonnen am 25. Sep 2005 · letzter Beitrag vom 28. Sep 2005
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#1

nonVCL - Bitmap in Bitmap kopieren

  Alt 25. Sep 2005, 12:00
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:ImageX.Picture.Assign(MyBitmap);
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#2

Re: nonVCL - Bitmap in Bitmap kopieren

  Alt 25. Sep 2005, 13:24
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 von turboPASCAL:
VCL: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.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: nonVCL - Bitmap in Bitmap kopieren

  Alt 25. Sep 2005, 14:07
Wenn's ein STATIC-Element ist dann suchst du vielleicht nach der Meldung MSDN-Library durchsuchenSTM_SETIMAGE.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: nonVCL - Bitmap in Bitmap kopieren

  Alt 25. Sep 2005, 16:58
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.

Zitat von Olli:
Zitat von turboPASCAL:
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.

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 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...
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#5

Re: nonVCL - Bitmap in Bitmap kopieren

  Alt 25. Sep 2005, 17:18
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.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#6

Re: nonVCL - Bitmap in Bitmap kopieren

  Alt 25. Sep 2005, 17:28
Das geht nicht, äh.. schon aber ich will nur einen Ausschnitt aus dem ResBitmap auf/in das "DlgItem-Image" machen.

Delphi-Quellcode:
BitBlt(myBitmapDC, 0, 0, 32, 32, ResBitmapDC, count * 32 - 32,
    Animation[AnimType].Offset * 32, SRCCOPY);
Sonst wäre es ja zu einfach.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#7

Re: nonVCL - Bitmap in Bitmap kopieren

  Alt 25. Sep 2005, 17:41
Aha, na das kann man ja nicht wissen

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!!!
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: nonVCL - Bitmap in Bitmap kopieren

  Alt 25. Sep 2005, 17:46
Zitat von Olli:
Aha, na das kann man ja nicht wissen

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?

Ansonsten: mit STM_GETIMAGE die Bitmap des fremden Fensters holen, modifizieren (wie von Olli beschrieben), und mit STM_SETIMAGE wieder setzen.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#9

Re: nonVCL - Bitmap in Bitmap kopieren

  Alt 25. Sep 2005, 18:49
Zitat von Flocke:
Müsste er das dann nicht bei jedem WM_PAINT machen?
Ich denke schon.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#10

Re: nonVCL - Bitmap in Bitmap kopieren

  Alt 25. Sep 2005, 20:48
Ich auch.

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. [/Edit]
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 Uhr.
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