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ąć?