[C++/GDI]Farbe wird bei FillRect nicht übernommen

RedWraith

Mitglied
Guten Abend liebe Forenmenschen !

Ich habe ein kleines WINAPI Programm in C++ geschrieben um darin ein bisschen mit den GDI Funktionen zu üben. Leider bin ich gleich bei der ersten Funktion, FillRect, gescheitert. Selbiges weigert sich standhaft, die im letzten Parameter definierte Farbe zu übernehmen und besteht sturerweise darauf sämtliche Rechtecke stattdessen in weiß zu zeichnen. Ich weiß bereits, dass das Problem mit dem weißen Rechteck nur dann auftritt, wenn ich die Farbe selber definiere, wenn ich eine von den predefined Farben wie zum Beispiel COLOR_WINDOW benutze, so klappt alles perfekt. Leider habe ich nicht die geringste Ahnung warum das so ist und hoffe, dass ich hier mein Debüt in diesem Forum mit einem hoffentlich einfach zu lösenden Problem mache.

Code:
#include <windows.h>

LRESULT CALLBACK MsgHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	MSG messages;
	HWND MainWnd;
	
	WNDCLASSEX wincl;
	wincl.hInstance = hThisInstance;
	wincl.lpszClassName = "GDITest";
	wincl.lpfnWndProc = MsgHandler;
	wincl.style = CS_DBLCLKS;
	wincl.cbSize = sizeof(WNDCLASSEX);
	wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
	wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
	wincl.lpszMenuName = NULL;
	wincl.cbClsExtra = 0;
	wincl.cbWndExtra = 0;
	wincl.hbrBackground = (HBRUSH)COLOR_BACKGROUND;

	if(!RegisterClassEx(&wincl))
	{
		MessageBox(NULL, "Fensterklasse konnte nicht registriert werden.", "Fehler !", MB_OK);
		PostQuitMessage(0);
	}

	MainWnd = CreateWindowEx(0, "GDITest", "GDITest", WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, HWND_DESKTOP, NULL, hThisInstance, NULL);

	while(GetMessage(&messages, NULL, 0, 0))
	{
		TranslateMessage(&messages);
		DispatchMessage(&messages);
	}
}

LRESULT CALLBACK MsgHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC display;
	RECT rechteck;

	switch(message)
	{
		case WM_PAINT: // <--- Hier wird gezeichnet
			display = GetDC(hWnd); 
			rechteck.top = rechteck.left = 0;
			rechteck.bottom = rechteck.right = 150;
			FillRect(display, &rechteck, (HBRUSH)RGB(255,0,0));
			DeleteDC(display);
		break;

		case WM_DESTROY:
			PostQuitMessage(0);
		break;

		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		break;
	}
	return 0;
}

Wie gesagt, ich möchte, dass FillRect auch Farben, die mit (HBRUSH) RGB(x,y,z) definiert werden zeichnen. Besagtes FillRect ist in der Callback Funktion bei der Windowsnachricht WM_PAINT zu finden.


Erstellt mit Visual Studio 2005 mit installierter PlatformSDK unter Vista Business.

Viel Spaß und danke im Vorraus für die Hilfe
 
Hallo,

der Cast mit HBRUSH erzeugt keinen gültigen Brush. Du solltest stattdessen schreiben:
C++:
FillRect(display, &rechteck, CreateSolidBrush(RGB(255,0,0)));
Außerdem wird bei einer WM_PAINT - Message grundsätzlich immer mit BeginPaint() und EndPaint() gearbeitet:
C++:
PAINTSTRUCT ps;
HDC display = BeginPaint(hWnd, &ps);

// ...

EndPaint(hWnd, &ps);
Gruß
MCoder
 
Hallo MCoder,

Danke für die Hilfe, das hat geholfen :)

Kannst du mir sagen worin der Unterscheid zwischen dem BeginPaint/EndPaint und dem was ich gebastelt habe liegt ?
 
Kannst du mir sagen worin der Unterscheid zwischen dem BeginPaint/EndPaint und dem was ich gebastelt habe liegt ?
"GetDC()" liefert nur den HDC während "BeginPaint()" noch einige Aktionen durchführt (Clipping-Region festlegen, ggf. WM_ERASEBKND senden) um die Zeichenoperationen optimal vorzubereiten.

Gruß
MCoder
 
Zurück