Desktop in SpeicherDC kopieren



  • Guten Morgen,

    Ich versuche gerade ein Programm zu schreiben, dass den Bildschirm einfriert und auf dem man dann malen kann. Eigentlich ganz einfach, habe allerdings länger nichts in c++ gemacht und steh jetzt ein wenig aufn Schlauch. Meine Idee ist, dass ich in WM_CREATE mir den HDC vom Desktop hole, einen passenden Speicher HDC erstelle, ein Bitmap anlege, es in den Speicher HDC lade und dann in WM_PAINT das Bild vom Desktop DC in den Speicher HDC lade. Später lege ich dann das Kopieren von Desktop in Speicher in einen anderen Aufruf, per Tastendruck z.b.... Aber zum Test soll es auch WM_PAINT machen.

    int wmId, wmEvent;
    	static int iHi,iWi;
    	PAINTSTRUCT ps;
    	HDC hdc,hdcScreen;
    	static HDC hdcMem=NULL;
    	static HBITMAP hBitmap;
    	HWND hDesktop;
    
    	switch (message)
    	{
    	case WM_CREATE:
    		iWi=GetSystemMetrics(SM_CXSCREEN);
    		iHi=GetSystemMetrics(SM_CYSCREEN);
    
    		hdcScreen = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);;
    		hdcMem=CreateCompatibleDC(hdcScreen);
    		hBitmap = CreateCompatibleBitmap(hdcMem,iWi, iHi);
    		SelectObject(hdcMem,hBitmap);
    		DeleteDC(hdcScreen);
    		break;
    	case WM_PAINT:	
    		hdcScreen = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
    		BitBlt(hdcMem,0,0,iHi,iWi,hdcScreen,0,0,SRCCOPY); //Kommt später in WM_COMMAND, um das Einfrieren per Hotkey zu machen
    
    		hdc = BeginPaint(hWnd, &ps);
    		BitBlt(hdc,0,0,iWi,iHi,hdcMem,0,0,SRCCOPY);
    		EndPaint(hWnd, &ps);
    
    		DeleteDC(hdcScreen);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		DeleteObject(hBitmap);
    		DeleteDC(hdcMem);
    		break;
    

    So aber das einzige was ich jetzt in meinem Fenster sehe ist eine schwarze Fläche. Wenn ich in der Zeile BitBlt(hdc,0,0,iWi,iHi,hdcMem,0,0,SRCCOPY); vom hdcScreen aus kopiere erhalte ich das aktuelle Bild. Also iwie will mein Speicher DC nicht. Sieht da jemand ein Fehler?

    Danke, Gruß Simon



  • Änder hier mal hdcMem in hdcScreen:

    hBitmap = CreateCompatibleBitmap(hdcMem,iWi, iHi);
    

    Grund wird hier genannt: CreateCompatibleBitmap



  • arrr, das Kleingedruckte mal wieder^^ Danke für die Antwort, hätte den Fehler bestimmt sonst nie gefunden 🙂

    Schönes We Gruß Simon


Anmelden zum Antworten