WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
WM_CTLCOLORSTATIC is never triggered in WIN32 app
我正在用C++做一个Win32应用程序。我有一个静态窗口,我想改变背景的颜色。
我遵循了这里的建议:如何通过程序设置静态控件的背景色
但在我的情况下,WM_CTLCOLORSTATIC从未被触发。你知道怎么会发生什么吗?
这是我的一些代码:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case WM_CTLCOLORSTATIC:
hdc = reinterpret_cast<HDC>(wParam);
SetTextColor(hdc, RGB(2000, 50, 100));
SetBkColor(hdc, RGB(20, 150, 100));
if (!hBrushLabel) hBrushLabel = CreateSolidBrush(RGB(20, 150, 100));
return reinterpret_cast<LRESULT>(hBrushLabel);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_CREATE:
hBrushLabel = NULL;
AddBuyButtons(hWnd);
AddText(hWnd);
AddCartonesSlots(hWnd);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code that uses hdc here...
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
if (hBrushLabel) DeleteObject(hBrushLabel);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
我检查过的变化函数叫做:
DWORD WINAPI changecolor(HWND h)
{
if (hBrushLabel) {
DeleteObject(hBrushLabel);
hBrushLabel = NULL;
}
InvalidateRect(h, NULL, TRUE);
return 0;
}
希望你能帮助我!
WM_CTLCOLORSTATIC
是它自己的窗口消息,但您正在处理它,就好像它是WM_COMMAND
消息的菜单ID一样。您需要将case WM_CTLCOLORSTATIC
处理程序从内部switch
块移动到外部switch
块:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
}
}
break;
// MOVED HERE!!!
case WM_CTLCOLORSTATIC:
hdc = reinterpret_cast<HDC>(wParam);
SetTextColor(hdc, RGB(2000, 50, 100));
SetBkColor(hdc, RGB(20, 150, 100));
if (!hBrushLabel) hBrushLabel = CreateSolidBrush(RGB(20, 150, 100));
return reinterpret_cast<LRESULT>(hBrushLabel);
break;
case WM_CREATE:
hBrushLabel = NULL;
AddBuyButtons(hWnd);
AddText(hWnd);
AddCartonesSlots(hWnd);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code that uses hdc here...
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
if (hBrushLabel) DeleteObject(hBrushLabel);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
相关文章:
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- 将 Win32/WinAPI 应用程序移植到 wxWidgets
- 如何在 Win32 C++控制台应用程序中调用 UWP 类库
- 如何在 Win32 控制台应用程序中注册不可见的窗口类?
- 是否可以将键盘输入绑定到 Win32 中的单个应用程序?
- VS2017 中缺少 Win32 控制台应用程序.如何创建C++空项目?
- 在通用 Windows 应用程序C++上使用 win32 DLL 库
- C++ Win32 列表框和滑块创建 Windows 应用程序
- 如何在 Linux/Apache 虚拟主机上运行 win32 控制台应用程序?
- SWIG和Mingw-64与Python一起使用...不是有效的 Win32 应用程序
- 在 Win32 应用程序中承载 GTK+3 上下文
- Electron应用程序和Win32本机桌面应用程序之间的进程间通信
- 开发如何解决错误193:%1不是Dev C 中的Win32应用程序
- 您如何使用Winrt创建经典的Win32应用程序窗口
- 是否有一种简单的方法可以从普通的 win32 C++代码向应用程序见解提供数据?
- 链接错误时,使用CLION/CMAKE/MSVC 2015编译WIN32应用程序
- 如何在VS 2017 C++Win32应用程序中打印出gethostname结果
- 我如何将Win32应用程序迁移到X64
- 从"Resource Files"文件夹加载文件C++ Windows 应用程序 (win32)