使用无效()更改GDI形状
use InvalideRect() to change a GDI shape
我昨天问了我的问题,但无法得到正确的答案。现在生病更清楚地问。使用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;
...
}
...
}
相关文章:
- 如何在Qt C++中更改光标
- 为什么++(*p)更改指针值
- 如何通过派生类函数更改基类中的向量
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- TDateTime格式在C++Builder中不会更改
- 查找后更改类变量
- 为什么我无法更改"set<set>"循环中的值<int>
- Xaudio2在更改缓冲区或循环时弹出声音
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 在更改for循环的第三部分后,未使用for循环结果
- C++.我想将更改后的特定字符行保存在字符串中
- 使用窗口中的QSlider更改背景音量
- c++方法参数只能在linux的发布模式下自行更改
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 可以使用移动语义更改或改进此C++代码吗?
- C++继承更改成员
- 如何定义更改car类中car位置的方法
- 为什么我的排序算法会更改数组值
- 使用无效()更改GDI形状