我昨天问了我的问题,但无法得到正确的答案。现在生病更清楚地问。使用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);
...
在此代码中,当您进入WM_PAINT
时,brusha
总是将是绿色刷子。
您似乎认为,仅仅因为您将红色刷子分配给brusha
变量的WM_COMMAND
部分中,这将以某种方式记住下一幅油漆,但这不是事实。请记住,每次输入功能时,在C 变量中都会重新创建,并在每次退出功能时都会破坏。因此,您编写代码无法正常工作的方式。
最简单的方法可能是使hbrusha
变量static
。每次您输入并退出Funciton时,静态变量不是不是创建和破坏的。像这样的东西
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;
...
}
...
}