Bitmap laden und mit BitBlt anzeigen

AckiB

Mitglied
Hallo,
ich möchte eine Bitmap laden und in einem Fenster anzeigen.
Dafür möchte ich BitBlt verwenden, aber das funktioniert nicht so richtig...
Das Fenster wird gefunden, die Bitmap geladen, aber BitBlt gibt immer False zurück !!


Code:
void wndAnfang::drawSchein(){
  HWND hnd_Window;
  HANDLE hnd_BMP;
  
  if(hnd_Window = FindWindow("fltk", "AB-Sys")){
    if(hnd_BMP = LoadImage(NULL, "F:\\Sources\\DevCpp\\Sys\\out\\Schein-Small.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)){
  
      bool b = BitBlt((HDC)hnd_Window, 0, 0, 300, 300, (HDC)hnd_BMP, 0, 0, SRCCOPY);

      DeleteObject(hnd_BMP);
  
      message("%d %d %d",b,hnd_Picture,hnd_Schein);  
    }  
  }  
}

Danke, Acki
 
Also, ich habe es soweit geschaft, dass ich den Inhalt von einem Fenster zu einem anderen Fenster kopieren kann:

Code:
void wndAnfang::drawSchein(){
  HWND hnd_Dest, hnd_Source;

 
  if(hnd_Dest = FindWindow("fltk", "AB-Win1")){
    if(hnd_Source = FindWindow("fltk", "AB-Win2")){
  
      bool b = BitBlt(GetDC(hnd_Dest), 0, 0, 300, 390, GetDC(hnd_Source), 0, 0, SRCCOPY);
      
      message("%d %d %d",b,hnd_Picture,hnd_Schein);  
    }  
  }  
}

Aber wie bekomme ich eine Grafikdatei (.bmp) in den Speicher geladen ?
Das Problem ist, dass BitBlt eindn HDC-Handle verlangt !
Mit LoadImage() bekomme ich zwar die Bitmap eingeladen, ich erhalte aber leider einen HANDLE-Handle...
Ich brauche also eine Möglichkeit, eine Bitmap als HDC oder HWND einzuladen !

Die GUI erstelle ich mit FLTK (Fast Light Tool Kit) - falls jemand damit eine Möglichkeit sieht...


danke, Acki
 
Zuletzt bearbeitet:
Hi ...

Eine *.bmp-Datei lädst du mit:
Code:
HBITMAP hBmp = (HBITMAP)LoadImage(...);

Beispiel:
HBITMAP hBmp = (HBITMAP)LoadImage(NULL,"path/mybmp.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

Gruß
Shai
 
Zuletzt bearbeitet:
Genau, mit LoadImage erhältst du ein HANDLE, das du aber zu einem HBITMAP casten darfst/sollst.

Dann musst du einen DC erstellen, der mit deiner Bitmap arbeitet. Von diesem DC kannst du dann zu dem DC vom Fenster BitBlt-en. Und dann IMMER die DCs wieder zernichten bzw. freigeben, je nachdem, wie sie erstellt worden sind.

Sollte so aussehen:

HBITMAP hbm = (HBITMAP)LoadImage( .... );

HDC hdcTarget = GetDC( hwndZielFenster );

HDC hdcBitmap = CreateCompatibleDC( hdcTarget );
HBITMAP hbmOld = (HBITMAP)SelectObject( hdcBitmap, hbm );

BitBlt( hdcTarget, ...., hdcBitmap, ... , SRCCOPY );

// und aufräumen
SelectObject( hdcBitmap, hbmOld );

DeleteDC( hdcBitmap );
ReleaseDC( hdcTarget );
 
Hi,

kann man das auch in VBA Syntax mal aufschreiben? Ich suche seit 2 Wochen und finde nix.
Ich tu mir schwer die VB Befehle in VBA zu transferieren.

Also in Excel als VBA

bild.imagesource.picture = Loadpicture("D:\mypic.bmp")
bild.imagetarget.picture



BitBlt(taget, 0, 0, w, h, source, x,y, vbSrcCopy)

?

Danke!

Norbert
 
Zurück