используйте InvalideRect (), чтобы изменить форму GDI

Я задал вопрос вчера, но не смог получить правильный ответ. Теперь я задам этот вопрос более ясно.
используя win api, я создал окно и кнопку. перед кнопкой есть круг, нарисованный зеленым цветом. После нажатия кнопки круг должен перейти в красный цвет.

(Я использую C ++ и Mingw компилятор.)

вот мой код

LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hDC;
HBRUSH brusha;
brusha=CreateSolidBrush(RGB(0,255,0));

switch(msg)
{
case WM_CREATE:
{

b=CreateWindowEx(WS_EX_CLIENTEDGE,
"BUTTON",
"red",
WS_CHILD|WS_VISIBLE|
BS_DEFPUSHBUTTON,
350,
100,
100,
40,
hWnd,
(HMENU)BUTTON,
GetModuleHandle(NULL),
NULL);
}
break;case WM_PAINT:
{hDC=BeginPaint(hWnd,&ps);
SelectObject(hDC,brusha);
Ellipse(hDC, 20, 20, 100, 100);
EndPaint(hWnd, &ps);

}

case WM_COMMAND:
switch(LOWORD(wParam))
{
case BUTTON:
{
brusha=CreatSolideBrush(RGB(255,0,0));
InvalidateRect( hWnd,0,false);

}
}
break;case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
break;
}

return DefWindowProc(hWnd,msg,wParam,lParam);

}

это компилируется без ошибок. но ничего не происходит при нажатии кнопки

0

Решение

Ну проблема в том, что ты всегда рисуешь зеленой кистью. Посмотри на свой код

HBRUSH brusha;
brusha=CreateSolidBrush(RGB(0,255,0));

switch(msg)
{
...
case WM_PAINT:
{
hDC=BeginPaint(hWnd,&ps);
SelectObject(hDC,brusha);
...

В этом коде brusha всегда будет зеленой кистью, когда вы идете в WM_PAINT,

Вы, кажется, думаете, что только потому, что вы назначаете красную кисть brusha переменная в WM_COMMAND часть, которая каким-то образом запомнится для следующей краски, но это не так. Помните, что в C ++ переменные создаются заново каждый раз, когда вы вводите функцию, и уничтожаются при каждом выходе из функции. То, как вы написали код, не может работать.

Вероятно, самый простой способ сделать hbrusha переменная static, Статические переменные не создается и уничтожается каждый раз, когда вы входите и выходите из функции. Что-то вроде этого

LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static HBRUSH brusha;

switch(msg)
{
case WM_CREATE:
brusha=CreateSolidBrush(RGB(0,255,0)); // set the brush green on create

...

break;case WM_COMMAND:
switch(LOWORD(wParam))
{
case BUTTON:
brusha=CreatSolideBrush(RGB(255,0,0));
InvalidateRect( hWnd,0,false);
}
break;

...

}

...
}
0

Другие решения

Других решений пока нет …