(immernoch) Newbee: Bitmap in Fenster laden
-
Hi!
Jetzt möchte ich eine Bitmap in ein Fenster reinladen und habe dazu extra folgende Funktion eingetippt:int ShowBitmapResource(HDC hDestDC, int xDest, int yDest, int nResID) { // used names HBITMAP hBitmap; HDC hSrcDC; BITMAP bmp; int bmpHeight, bmpWidth; // load bitmap from file into bitmap handle hBitmap = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(nResID), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE); if(hBitmap == 0) return(0); // create source dc if(!(hSrcDC = CreateCompatibleDC(NULL))) return(0); // get the Bitmap into a DC if(!(SelectObject(hSrcDC, hBitmap))) return(0); // get image dimensions if(!(GetObject(hBitmap, sizeof(BITMAP), &bmp))) return(0); bmpWidth = bmp.bmWidth; bmpHeight = bmp.bmHeight; // copy one DC into an other if(!(BitBlt(hDestDC, xDest, yDest, bmpWidth, bmpHeight, hSrcDC, 0, 0, SRCCOPY))) return(0); // kill the memory DC DeleteDC(hSrcDC); // hat alles geklappt? return(TRUE); }
Der Aufruf der Funktin steht in WndProc und schaut so aus:
case WM_PAINT: hdc = BeginPaint(hWnd, &ps); if(ShowBitmapResource(hdc, nHeight, nWidth, IMG_BMP2) == NULL) return(0); EndPaint(hWnd, &ps); return(0); break;
nHeight und nWidth sind Globale Vars.
Das Problem liegt darin, dass ich keinen Fehler bekomme aber auch keine Bitmap.
Whats the matter??
Liegt es vielleicht an einem falschen Handle?
thx @alle die den code mal anschauen!!
edit: Codetags hinzugefügt.
[ Dieser Beitrag wurde am 22.12.2002 um 15:54 Uhr von cd9000 editiert. ]
-
Also, erstens würde ich _nie_ eine Bitmap in WM_PAINT laden, das wird viel zu oft ausgeführt!
cya
-
So, hab mal ne Beispiel-WndProc geschrieben, kannst dich ja vielleicht daran orientieren:
LRESULT CALLBACK MainProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { static HBITMAP hBitmap; static BITMAP bmp; static int bmpWidth,bmpHeight; switch(uMsg) { case WM_PAINT: { PAINTSTRUCT ps; HDC hDC = BeginPaint(hWnd,&ps); HDC hMemDC = CreateCompatibleDC(hDC); SelectObject(hMemDC,hBitmap); BitBlt(hDC,0,0,bmpWidth,bmpHeight,hMemDC,0,0,SRCCOPY); DeleteDC(hMemDC); EndPaint(hWnd,&ps); return 0; } break; case WM_CREATE: { hBitmap = LoadBitmap(hInst,TEXT("my_bitmap")); GetObject(hBitmap,sizeof(BITMAP),&bmp); bmpWidth = bmp.bmWidth; bmpHeight = bmp.bmHeight; return 0; } break; case WM_DESTROY: { PostQuitMessage(0); // Programm beenden return 0; } break; } return DefWindowProc(hWnd,uMsg,wParam,lParam); }
cya
-
wo kann ich den die position des Bitmaps festlegen
-
BitBlt(hDC,0,0,bmpWidth,bmpHeight,hMemDC,0,0,SRCCOPY);
-
suuper!
Du hast recht gehabt, by the way...ich war ja wohl auch zu blöd die fkt-beschreibung richtig zu lesen...
wenn ich BitBlt(hDestDC, 0, 0, bmpWidth, bHeight, hScrDC, 0, 0, SRCCOPY) übergebe dann bekomme ich die Bitmapis ja klar!
aber...
wenn ich die Fkt ShowBitmapResource() NICHT in WM_PAINT aufrufe, erscheint die Bitmap nur für einen kurzen Moment und ist danach gleich wieder mim Hintergrund überpinselt...
Naja, aber das krieg ich auch noch raus.
thx auf alle Fälle![ Dieser Beitrag wurde am 22.12.2002 um 17:39 Uhr von ultraschatten editiert. ]
-
Ja, das geht auch ganz einfach. Du machst einfach zwei Funktionen!
z.B.:
HBITMAP us_CreateBitmap(int nResID);
und
void us_ShowBitmap(HBITMAP hBitmap);evtl. könntest du noch die Höhe/Breite des Bitmaps bei us_ShowBitmap übergeben.
cya
EDIT: us steht für ultraschatten
[ Dieser Beitrag wurde am 22.12.2002 um 17:37 Uhr von MagiC Creator editiert. ]
-
@MagiC Creator
Wo gibst Du in Deinem Code die Bitmap mit DeleteObject wieder frei?
Wo restaurierst Du den Gerätekontext nachdem Du mit SelectObject etwas ihn eingetragen hast?
Wenn man Speicher anfordert, sollte man ihn auch wieder freigeben. Den Gerätekontext so verlassen, wie man ihn vorgefunden hat.Rallod
-
Heftige Anschuldigungen.
-
OOPs... muss ich wohl übersehen haben... naja, wird nicht wieder vorkommen, master!
cya
-
NENN MICH NIE NIE WIEDER master
Gruß Rallod
-
Der vorhergehende Text stammt nicht von mir.
Mfg Rallod