Probleme mit Bitmap-Zeichnen
-
Moin,
ich habe folgendes Problem:
ich erstelle 2 Fenster mit der gleichen Klasse, sie bekommen per Message ein Bild zugewiesen, das sie per Funktion laden, den RGB-Wert 100/100/100 durchsichtig machen (Regions) und dann bei jedem WM_PAINT das Bild zeichnen.
Alles in allem lässt sich das als Skinning zusammenfassen.
Dabei hielt ich mich an das FLIPCODE-Tutorial.
DAS PROBLEM: Die Regions werden zwar richtig erstellt, allerdings werden die Bitmaps nicht richtig gezeichnet: immer das zuletzt geladene erscheint. Deshalb tippe ich auf ein HDC-Problem
Im Folgenden die wichtigsten Ausschnitte, den aufs wesentliche zusammengeschnitte Code samt Bildern:
http://hometown.aol.de/HENGE01/Forum/frage.zipLRESULT CALLBACK HauptProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hW1; static HWND hW2; switch(message) { case WM_CREATE: { hW1 = CreateWindow(szFiguren, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL); SendMessage(hW1, UM_SET_ID, ID_W1, 0); hW2 = CreateWindow(szFiguren, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL); SendMessage(hW2, UM_SET_ID, ID_W2, 0); return(0); } case WM_SIZE: { MoveWindow(hW1, 5, 5, 64, 64, true); MoveWindow(hW2, 5 + 64 + 5, 5, 64, 64, true); return(0); } //und so weiter } //----------------------------------------------- LRESULT CALLBACK FigurenProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HANDLE hFigur; static HDC hDCBitmap; switch(message) { case WM_CREATE: { return(0); } case UM_SET_ID: { hDCBitmap = LIAndSOAndCCDC(&hFigur, wParam, hWnd); HRGN hRGN = ScanRegion((HBITMAP)hFigur, TRANSPARENTR, TRANSPARENTG, TRANSPARENTB); SetWindowRgn(hWnd, hRGN, true); DeleteObject(hRGN); return(0); } case WM_PAINT: { PAINTSTRUCT ps; BeginPaint(hWnd, &ps); { if(!BitBlt(ps.hdc, 0, 0, 64, 64, hDCBitmap, 0, 0, SRCCOPY)) { //fehler } } EndPaint(hWnd, &ps); return(0); } //und so weiter } //----------------------------------------------- HDC LIAndSOAndCCDC(HANDLE *hHandle, int ID, HWND hWnd) { switch(ID) { case ID_W1: { *hHandle = LoadImage(GetModuleHandle(NULL), "1.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE); break; } case ID_W2: { *hHandle = LoadImage(GetModuleHandle(NULL), "2.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE); break; } } HDC hDC = CreateCompatibleDC(0); SelectObject(hDC, *hHandle); return(hDC); }Ich hoffe ihr könnt mir helfen,
Euer ItsNotYou
-
Wo speicherst Du denn den "hDCBitmap"? Es sieht so aus als ob dies nur eine Variable ist, somit gewinnt immer der Letztere...
-
? ich dachte bei solchen procs wird eine art "kopie" für jedes fenster angelegt...
-
lol
-
was heißt hier "lol"?
entweder nenn sinnvollen komentar oder du verkneifst es dir!
-
lern erstmal die c grundlagen.
-
Wenn Du keine separate Variable für *eine* Variable angegst, dann hast Du halt nur eine und keine zwei Variablen...
-
lol schrieb:
lern erstmal die c grundlagen.
oho, da spricht der meister der zu feige ist, sich zu registrieren
-
lol
-
ItsNotYou schrieb:
lol schrieb:
lern erstmal die c grundlagen.
oho, da spricht der meister der zu feige ist, sich zu registrieren
Einfach ignorieren. Wenn jemand schon lol heisst... ;-).
-
lol du bis plöd
leg dir erst mal nen richtigen nick zuund damit ich ontopic bleib: kennt einer vlt ein tutorial zu bitmaps zeichen + winapi?
-
http://win-api.de
Für die WinApi.