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.zip

    LRESULT 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 zu

    und damit ich ontopic bleib: kennt einer vlt ein tutorial zu bitmaps zeichen + winapi?



  • http://win-api.de
    Für die WinApi.


Anmelden zum Antworten