[C++/WinAPI] Frage zu DIB Funktionen

kickerxy123

Erfahrenes Mitglied
Guten Abend,
C++:
void set(HDC hdc)
				{
					memset(&bmInfo, 0, sizeof(BITMAPINFO));
					bmInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
					bmInfo.bmiHeader.biWidth = GetDeviceCaps(hdc, HORZRES);
					bmInfo.bmiHeader.biHeight = GetDeviceCaps(hdc, VERTRES); 
					bmInfo.bmiHeader.biPlanes = 1;
					bmInfo.bmiHeader.biBitCount = 32;
					bmInfo.bmiHeader.biCompression = BI_RGB;
					HBITMAP m_hBmp = CreateDIBSection(hdc, &bmInfo, DIB_RGB_COLORS, (void**)&pixel, NULL, NULL);
					
					if(!m_hBmp)
					{
						//failed
					}
				//	ReleaseDC(NULL, hdc);
 				
					
				}
				
				void updateModificationsToHDC(HDC hdc)
				{
					SetDIBitsToDevice(hdc, 0, 0, bmInfo.bmiHeader.biWidth, bmInfo.bmiHeader.biHeight, 0, 0, 0, bmInfo.bmiHeader.biHeight, pixel, &bmInfo, DIB_RGB_COLORS);
				}

private:
BITMAPINFO bmInfo;
BYTE* pixel;

Dies ist ein Auszug aus einer Klasse. Leider funktioniert der folgende Code (Minimalbeispiel) nicht:
C++:
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) 
{
	switch(Message)
	{
		case WM_PAINT: //Zeichnen beginnt
		{       
      		hdc = BeginPaint(hwnd, &ps); 
						CImage* a = new CImage();
						a->set(hdc);
 
						a->updateModificationsToHDC(hdc);
 
						delete a;
      		EndPaint(hwnd, &ps);
 			break;
}}return 0;}

Es ist nur ein Minimalbeispiel (ich weiß, dass WM_PAINT so aussehen sollte: Begin, Bitsplt, End und nichts weiter, aber das ist hier egal). Das Problem liegt ja schon beim: HDC->Pixeldata -> HDC ohne jegliche Modifikationen an den Daten.
Ich würde erwarten, dass dadurch nichts verändert wird. De Facto aber erhalte ich ein schwarzes Bild mit einigen Linien drauf (Linien, die ich in der Tat einzeichne. Diese sind korrekt enthalten. Der Rest außer den Linien (also der Hintergrund) war aber eigentlich weiß mit gestrichelten schwarzen Rasterlinien und nicht komplett schwarz).

Könnt ihr mir auf die schnelle helfen? Ich denke es ist nur eine Kleinigkeit. Ich habe mich noch nie wirklich intensiv mit GDI beschäftigt.


Ich danke vielmals
 
Zuletzt bearbeitet:
Du lässt hier ein paar Details weg: Wo kommen diese Linien her? In dem Code werden keine gezeichnet.

Generell: Bei CreateDIBSection wird nicht initialisiert, da hast du erstmal Datenmüll drin. Evtl. kommt da das unerwartete her?

In deinem Code generierst du in jedem(!) WM_PAINT-Aufruf eine DIBSection, klatschst die dann auf dein Fenster. Da siehst du dann irgendwelche Daten, die da grade im Speicher waren.

Dann lässt du die DIBSection liegen (Resource Leak!)
 
Danke für deine Antwort. Wie gesagt, sollte es nur ein kurzes Beispiel sein. Mir ist klar, dass man es nicht so macht, aber ok - hier ein korrekterer Aufbau...

#edit: Nun funktioniert alles korrekt. Ich verwende jetzt: Erzeugung hdc, memHdc, dann bestimmte Zeichnungen werden extern in memHdc gezeichnet, dann GetDIBits -> **pixel im byte array bearbeiten** -> SetDIBits und bin zufrieden (vor allem mit der Performance im Ggs zu GetPixel+SetPixel für jeden einzelnen Pixel).
Die Paint Methode sieht im übrigen so aus:
C++:
		case WM_PAINT: 
		{       
      		hdc = BeginPaint(hwnd, &ps); 
        	BitBlt(hdc, 0, 0, cx, cy, memHdc, 0, 0, SRCCOPY); 
      		EndPaint(hwnd, &ps);
 			break;
		}


vg kickerxy123
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück