Я задал вопрос вчера, но не смог получить правильный ответ. Теперь я задам этот вопрос более ясно.
используя 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);
}
это компилируется без ошибок. но ничего не происходит при нажатии кнопки
Ну проблема в том, что ты всегда рисуешь зеленой кистью. Посмотри на свой код
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;
...
}
...
}
Других решений пока нет …