我有一个带有按钮的窗口,点击时会将整个窗口描绘为红色,但我的代码会绘制整个窗口,甚至是按钮。当我调整窗口大小或导致按钮重绘的窗口部分时,按钮将返回。我只能在绘制窗口后将按钮绘制为纯色,但这只会使其看起来像一个没有任何内容的正方形。
那么如何将按钮绘制为默认颜色?
//WinMain
hmain = CreateWindowEx (0, L"Window", L"Window", WS_OVERLAPPEDWINDOW, 0, 0, 200, 200,
NULL, NULL, hinstance, NULL);
HWND hwnd2 = CreateWindowEx (0, L"Button", L"Red", WS_CHILD | BS_PUSHBUTTON, 0, 0, 50, 50,
hmain, (HMENU) redbtt, hinstance, NULL);
//Winmain
//WndProc
COLORREF red = RGB (255, 0, 0);
HBRUSH redbrush = CreateSolidBrush (red);
switch (msg) {
case WM_COMMAND: {
if (LOWORD (wparam) == redbtt) {
color = 'r';
RECT rect;
GetClientRect (hmain, &rect);
HDC hdc = GetDC (hmain);
FillRect (hdc, &rect, redbrush);
ReleaseDC (hmain, hdc);
/*GetClientRect ((HWND) lparam, &rect);
hdc = GetDC ((HWND) lparam);
COLORREF color = GetBkColor (hdc);
HBRUSH brush = CreateSolidBrush (color);
FillRect (hdc, &rect, brush);
ReleaseDC ((HWND) lparam, hdc);*/
}
break;
}
case WM_PAINT: {
HBRUSH brush;
if (color == ' ') {
brush = (HBRUSH) (COLOR_WINDOW + 1);
} else if (color == 'r') {
brush = redbrush;
}
PAINTSTRUCT ps;
HDC hdc = BeginPaint (hmain, &ps);
FillRect (hdc, &ps.rcPaint, brush);
EndPaint (hmain, &ps);
break;
}
//WndProc
答案 0 :(得分:1)
自从我完成Win32以来已经有一段时间了,但在我看来,你的绘画内容会更好WM_ERASEBKGND
,因为这似乎就是你正在做的事情。你在那里试过吗? (您必须查看并查看,但我不确定BeginPaint
是否适合WM_ERASEBKGND
)
此外,您应该在DeleteObject
的结果上致电CreateSolidBrush
。我也要等到绘画内部分配它 - 我不会在你的窗口得到的每条消息上分配画笔。
答案 1 :(得分:1)
这是因为您没有为主窗口打开WS_CLIPCHILDREN样式。修正:
hmain = CreateWindowEx (0, L"Window", L"Window",
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, 0, 0, 200, 200,
NULL, NULL, hinstance, NULL);
'color'变量是一个hack,在实际代码中避免这种情况。你正在泄漏刷子。
答案 2 :(得分:0)
WM_PAINT
是在背景上绘制内容的时间。如果您希望窗口为纯红色而不是在默认背景和reg之间闪烁,那么您可能希望使用WM_ERASEBKGND
。
您可能还会考虑裁剪矩形,以免在实体控制下进行绘制。
最后,您始终可以使WM_PAINT
无效或发送给您想要强制重绘的控件。
答案 3 :(得分:0)
WS_CLIPCHILDREN
样式设置为您的窗口。这样,按钮的按钮将自动从绘图区域中排除,因此您的按钮不会被“覆盖”。InvalidateRect
,`函数来实现所需的效果。