BITMAP' in 'HGDIOBJ' nicht möglich



  • Hmm ich bin mir nicht sicher,

    ich habe eine kleine Schleife gebaut:

    for(int i=0; i<32; i++){
    		for(int i2=0; i2<32; i2++)
    			cout << "Pixel NR " << i << "Wert: " << GetPixel(bmpDC2, i2, i) << "\n";
    }
    

    Es kommt immer nur 4294967295 als Wert raus, da stimmt noch nicht alles...

    Gruß
    Alex



  • Ist Dir bewusst, das Dein Code haufenweise GDI-Leaks erzeugt?

    Gib die Farben mal Komponentenweise aus (R,G,B) via GetRColor, GetGColor, ... .



  • CodeFinder schrieb:

    Ist Dir bewusst, das Dein Code haufenweise GDI-Leaks erzeugt?

    Gib die Farben mal Komponentenweise aus (R,G,B) via GetRColor, GetGColor, ... .

    Hm?



  • HDC hDC = GetDC( NULL ) ;
    
    //- Einen MemoryDC erzeugen (CreateCompatibleDC)
    HDC bmpDC = CreateCompatibleDC(hDC);
    
    //- Eine Bitmap der Größe des Icons erzeugen (CreateCompatibleBitmap)
    HBITMAP myBMP = CreateCompatibleBitmap ( bmpDC, 32, 32 );
    
    //- Bitmap in den MemoryDC selektieren (SelectObject, dessen Rückgabewert speichern!)
    HGDIOBJ fallback;
    fallback = SelectObject(bmpDC, myBMP);
    
    //- Das Icon auf das MemoryDC und somit in die Bitmap zeichnen (DrawIcon)
    DrawIcon(bmpDC, 1, 1, hIconLarge);
    
    //- SelectObject() und den gespeicherten Rückgabewert als HGDIOBJ einsetzen
    SelectObject(bmpDC, myBMP);
    
    //- Die HBITMAP von CreateCompatibleBitmap enthält jetzt dein Icon.
    //- Sofern das HICON sonst nicht mehr gebraucht wird: DestroyIcon
    
    	for(int i=0; i<32; i++){
    		for(int i2=0; i2<32; i2++)
    			cout << "Pixel NR " << i << "Wert: " << GetPixel(bmpDC, i2, i) << "\n";
    	}
    
    }
    

    So scheint es zu funktionieren, was mich aber wundert, ist dass immer wieder nur die gleiche Farbe vorzukommen scheint:

    Pixel NR 7Wert: 16777215
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 16777215
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 16777215
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 16777215
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 0
    Pixel NR 7Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 16777215
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 0
    Pixel NR 8Wert: 16777215

    ...usw.
    Warum ist es so? Wähle ich ein anderes Icon aus, dann kommt auch jeweils nur dieser Wert oben vor.

    16777215 ist ja der RGB Wert für weiß...

    EDIT:
    Ich habe mal Probehalber folgendes gemacht:

    for(int i=0; i<32; i++){
    		for(int i2=0; i2<=32; i2++)
    		{
    			if(GetPixel(bmpDC, i2, i)==16777215)
    				cout << "X";
    			else
    				cout << ".";
    			if(i2==32)
    				cout << "\n";
    		}
    	}
    

    Es wird dann tatsächlich das Icon gezeichnet. Also es scheint "16777215" an den Stellen zu stehen, wo sich nicht weiße Pixel befinden 😕

    Gruß
    Alex



  • CodeFinder schrieb:

    Ist Dir bewusst, das Dein Code haufenweise GDI-Leaks erzeugt?

    ➡

    [u]Du Verwendet:[/u]            [u]Benötigt allerdings noch...:[/u]
     CreateCompatibleDC       DeleteDC
     CreateCompatibleBitmap   DeleteObject
     SelectObject             SelectObject ('reselect', siehe MSDN)
    

    CodeFinder schrieb:

    Gib die Farben mal Komponentenweise aus (R,G,B) via GetRColor, GetGColor, ... .

    Oh sorry, es war nicht GetRColor, sondern GetRValue etc. ...; also something like this:

    cout << "RGB(" << GetRValue(color) << "," << GetGValue(color) << "," << GetBValue(color) << ")" << endl;
    


  • Oh, Du hast natürlich Recht. Vielen Dank. Habe noch keine Erfahrung.

    Zu meinem letzten Posting:
    Ich glaube ich weiß, wieso das Bitmap monochrom ist:

    Note: When a memory device context is created, it initially has a 1-by-1 monochrome bitmap selected into it. If this memory device context is used in CreateCompatibleBitmap, the bitmap that is created is a monochrome bitmap. To create a color bitmap, use the hDC that was used to create the memory device context, as shown in the following code:

    HDC memDC = CreateCompatibleDC ( hDC );
    HBITMAP memBM = CreateCompatibleBitmap ( hDC, nWidth, nHeight );
    SelectObject ( memDC, memBM );

    Das Problem ist wahrscheinlich hier:

    HDC hDC = GetDC( NULL ) ;
    //- Einen MemoryDC erzeugen (CreateCompatibleDC)
    HDC bmpDC = CreateCompatibleDC(hDC);
    //- Eine Bitmap der Größe des Icons erzeugen (CreateCompatibleBitmap)
    HBITMAP myBMP = CreateCompatibleBitmap ( bmpDC, 32, 32 );
    

    Aber meine Anwendung hat kein hDC, weil es als Win32 Consolenanwendung erstellt wurde (ich hoffe ich bringe jetzt nicht komplett alles durcheinander...)

    Gruß
    Alex



  • Öhm, ne bringst nix durcheinander (sogar lobenswert, dass hier entlich mal einer in die MSDN guckt 😉 !), aber daran liegts trotzdem nicht, denn:

    MSDN zu GetDC schrieb:

    Handle to the window whose DC is to be retrieved. If this value is NULL, GetDC retrieves the DC for the entire screen.

    (Bezogen auf den Parameter; Quelle: http://msdn.microsoft.com/en-us/library/ms533241.aspx)
    Sie ist also nicht mono.

    Ich schau mir -falls es nicht jemand anderes bis dahin schon getan hat- Deinen Code Morgen Abend mal an.



  • Vielen Dank.

    Hier der ganze Codeabschnitt, damit es einfacher mit dem Angucken ist:

    //ICON auslesen
    	ExtractIconEx((LPCTSTR)"c:\\CtrlSrv.exe", 0, &hIconLarge, NULL, 1);
    	GetIconInfo(hIconLarge, &IconInfo);  
    
    HDC hDC = GetDC( NULL ) ;
    
    //- Einen MemoryDC erzeugen (CreateCompatibleDC)
    HDC bmpDC = CreateCompatibleDC(hDC);
    
    //- Eine Bitmap der Größe des Icons erzeugen (CreateCompatibleBitmap)
    HBITMAP myBMP = CreateCompatibleBitmap ( bmpDC, 32, 32 );
    
    //- Bitmap in den MemoryDC selektieren (SelectObject, dessen Rückgabewert speichern!)
    HGDIOBJ fallback;
    fallback = SelectObject(bmpDC, myBMP);
    
    //- Das Icon auf das MemoryDC und somit in die Bitmap zeichnen (DrawIcon)
    DrawIcon(bmpDC, 0, 0, hIconLarge);
    
    //- SelectObject() und den gespeicherten Rückgabewert als HGDIOBJ einsetzen
    SelectObject(bmpDC, myBMP);
    
    	for(int i=0; i<32; i++){
    		for(int i2=0; i2<=32; i2++)
    		{
    			//cout << "Pixel NR " << i << "Wert: " << GetPixel(bmpDC, i2, i) << "\n";
    			if(GetPixel(bmpDC, i2, i)==16777215)
    				cout << "X";
    			else
    				cout << ".";
    			if(i2==32)
    				cout << "\n";
    		}
    	}
    
    	DeleteDC(hDC);
    	DeleteDC(bmpDC);
    	DeleteObject(myBMP); 
    	DeleteObject(fallback); 
    	DestroyIcon(hIconLarge);
    

    Grüße
    Alex



  • Jo gib bei CreateCompatibleDC() nicht bmpDC (welches monochrom ist anfangs) sondern hDC an.



  • geeky schrieb:

    Jo gib bei CreateCompatibleDC() nicht bmpDC (welches monochrom ist anfangs) sondern hDC an.

    Danke, jetzt klappt es!


Anmelden zum Antworten