如果使用WM_PAINT样式创建 Window,则永远不会传递WS_POPUP消息
WM_PAINT message is never delivered if Window is created with WS_POPUP style
我正在尝试使用"WS_POPUP">样式创建一个没有标题栏的窗口,我还需要在边框上进行一些绘画。
当我收到">WM_PAINT">消息时,我正在"WndProc">中实现我的绘图逻辑。但是,它从未交付。
我尝试过弄乱样式,但每当使用WS_POPUP样式时,WM_PAINT永远不会始终如一地交付。
当您使用 Visual Studio Community 2019 创建新的"Windows 桌面应用程序"项目时,这是从自动生成的代码中复制的,仅更改了一件事:
WS_OVERLAPPEDWINDOW --> WS_POPUP
创建窗口:
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_POPUP | WS_VISIBLE,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
注册窗口类:
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT2));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT2);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
消息循环:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
进程窗口消息:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
{
PAINTSTRUCT ps; // NEVER CALLED !!!
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code that uses hdc here...
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
我希望传递WM_PAINT的信息,这样我就可以画一些画。但是,它从未交付。
如果您修改 CreateWindow 调用,您将在启动时收到一个 WM_PAINT 事件,如下所示:
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_POPUP | WS_VISIBLE,
0, 0, 800, 600, nullptr, nullptr, hInstance, nullptr);
您只需要放置一些有效的宽度和高度。 不过,下次您会收到WM_PAINT时,将是当您使窗口失效时。 或者,例如,如果您单击"显示桌面"按钮(右下角)并恢复窗口(从最小化恢复)。 请注意,当您的窗口重新获得焦点(alt-tab)时,您不会收到WM_PAINT,除非您使它失效,如下所示:
case WM_ACTIVATE:
InvalidateRect(hWnd, NULL, TRUE);
break;
相关文章:
- 为什么是谷神星协方差.计算()似乎永远运行而不返回?
- 密码登录程序将永远循环并显示不正确的结果
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- SFML 碰撞永远不会在我的系统中注册
- 先进先出:一个进程永远不会从管道读取
- 移动构造函数永远不会被调用
- 程序永远不会进入虚拟析构函数
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?
- 指针永远不会在链表深层复制构造函数中达到 null
- 为什么我的 while 循环永远不会在 C++ 中的数字猜测游戏中结束?
- 类似函数的宏参数名称替换是否保证永远不会发生?
- curl_slist->next 永远不会为空,因此当循环卡住时
- 我应该使用无符号字符而不是 int 来存储永远不会大于 255 的值吗?
- cudaMemcpyToSymbol只是挂起,永远不会返回.GPU 处理速度为 100%.代码在 K40 上工作正常,但
- 暂停功能,它永远循环
- 字符串迭代器永远不会达到 std::string::end()
- C++多线程应用程序将永远挂起
- Linux 从永远在线的应用程序中创建和删除文件
- 为什么我的线程永远不会结束
- 无法从串行端口读取.WaitCommEvent() 永远不会返回