gpt4 book ai didi

c++ - 如果使用 WS_POPUP 样式创建 Window,则永远不会传递 WM_PAINT 消息

转载 作者:行者123 更新时间:2023-11-30 03:16:02 24 4
gpt4 key购买 nike

我正在尝试使用 "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 时,将是您 InvalidateRect你的 window 。或者,例如,如果您单击“显示桌面”按钮(右下角)并恢复窗口(从最小化恢复)。请注意,当您的窗口重新获得焦点(alt-tab)时,您不会收到 WM_PAINT,除非您 InvalidateRect 它,如下所示:

case WM_ACTIVATE:
InvalidateRect(hWnd, NULL, TRUE);
break;

关于c++ - 如果使用 WS_POPUP 样式创建 Window,则永远不会传递 WM_PAINT 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56618391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com