# Bitmap laden und mit BitBlt anzeigen



## AckiB (10. Januar 2005)

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 !!



```
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


----------



## Trendy Andy (10. Januar 2005)

Probier erstmal:


```
CDC *pDC = GetDC();

pDC->BitBlt(...);
```


----------



## AckiB (12. Januar 2005)

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


```
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


----------



## Shaijan (12. Januar 2005)

Hi ...

Eine *.bmp-Datei lädst du mit:

```
HBITMAP hBmp = (HBITMAP)LoadImage(...);

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

Gruß
Shai


----------



## Endurion (12. Januar 2005)

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


----------



## AckiB (12. Januar 2005)

Super, das sieht vielversprechend aus !   
Werde ich gleich testen !     

Vielen Dank, Acki


----------



## norbertX (27. Februar 2010)

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


----------

