Problem z SendMessage

0

Witam!
Mam problem z niedziałającym SendMessage. Chcę napisać program, który po kliknięciu myszką narysuje w tym miejscu prostokąt. Zrobiłem to w taki sposób:

 #include <windows.h>


static TCHAR lpszAppName[]=TEXT("Program 1");
bool czyRysowac=true;
int x=0;
int y=0;
HPEN pioro;

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

	HDC hdc;
	PAINTSTRUCT ps;

	switch (uMsg)
	{

		case WM_PAINT:
			pioro=CreatePen(PS_SOLID,5,RGB(0,0,255));
			hdc=BeginPaint(hWnd,&ps);
			SelectObject(hdc,pioro);
			if(czyRysowac) Rectangle(hdc,x,y,x+100,y+100);   
			EndPaint(hWnd,&ps);
		break;

		case WM_LBUTTONDOWN:
			czyRysowac=true;
			x=LOWORD(lParam);
			y=HIWORD(lParam);
			SendMessage(hWnd,WM_PAINT,0,0);
		break;

		case WM_CREATE: break;

		case WM_DESTROY:
			PostQuitMessage(0);
			break;

		case WM_KEYDOWN:
			switch(wParam)
			{
				case VK_ESCAPE:
					PostQuitMessage(0);
					break;
			}
			break;

		default: return (DefWindowProc(hWnd, uMsg, wParam, lParam));
	}

return(0L);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ 
	MSG msg;
	WNDCLASS wndclass;
	HWND hWnd;

	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = MainWndProc; 
	wndclass.cbClsExtra = 0; 
	wndclass.cbWndExtra = 0; 
	wndclass.hInstance = hInstance; 
	wndclass.hIcon = NULL; 
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); 
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
	wndclass.lpszMenuName = NULL; 
	wndclass.lpszClassName = lpszAppName; 

	if(RegisterClass(&wndclass) == 0) return FALSE;

	hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, lpszAppName, lpszAppName, 
	WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_EX_CLIENTEDGE | WS_VSCROLL | WS_HSCROLL,
	CW_USEDEFAULT, CW_USEDEFAULT,
	CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

	if(hWnd == NULL) return FALSE;

	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);

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

	return msg.wParam;
} 

Niestety, dopiero po zasłonięciu okna innym i ponownym odsłonięciu widać efekt. Wygląda to tak, jakby SendMessage nie wysyłał w ogóle komunikatu WM_PAINT. Co z tym począć?

1

Zamień SendMessage na:
BOOL InvalidateRect(hWnd,NULL,1); // usunie poprzednie
BOOL InvalidateRect(hWnd,NULL,0); // zostawi poprzednie
http://msdn.microsoft.com/en-us/library/dd145002%28v=vs.85%29.aspx

0

Zajrzeć do dokumentacji - WM_PAINT Message:

The WM_PAINT message is sent when the system or another application makes a request to paint a portion of an application's window. The message is sent when the UpdateWindow or RedrawWindow function is called [...] The WM_PAINT message is generated by the system and should not be sent by an application.

1 użytkowników online, w tym zalogowanych: 0, gości: 1