gpt4 book ai didi

c - 为什么发送 WM_NCDESTROY 后窗口画得很奇怪(没有视觉样式)?

转载 作者:太空宇宙 更新时间:2023-11-04 05:52:18 24 4
gpt4 key购买 nike

在我手动发送 WM_NCDESTROY 后,我得到了奇怪的窗口绘画。这仅在启用视觉样式时发生。当“经典风格”开启时,它似乎不会影响窗口。当我手动发送它时,我没有将 WM_NCDESTROY 传递给 DefWindowProc(),但窗口仍然被奇怪地绘制。似乎 SendMessage() 正在处理 WM_NCDESTROY。为什么 WM_NCDESTROY 得到处理,即使我没有将它传递给 DefWindowProc()

#include <windows.h>

HINSTANCE g_hInst;

LRESULT CALLBACK WndProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static BOOL bProcessMsg = FALSE;

switch(msg)
{
case WM_RBUTTONUP:
SendMessage(hwnd, WM_NCDESTROY, 0, 0);
//Size window manually after this message is processed to see the effects
break;

case WM_DESTROY:
bProcessMsg = TRUE;
break;

case WM_NCDESTROY:
if(!bProcessMsg) return 0;
MessageBox(0, L"Message processed", 0, MB_OK);
return DefWindowProc(hwnd, msg, wParam, lParam);
break;

default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}

LRESULT CALLBACK WndProc1(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_MBUTTONUP:
{
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof(WNDCLASSEX);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hInstance = g_hInst;
wc.lpfnWndProc = WndProc2;
wc.lpszClassName = L"Testclass2";
if(!RegisterClassEx(&wc)) return 0;
CreateWindowEx(0, L"Testclass2", L"Test2", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 40, 40, 200, 200, hwnd, 0, g_hInst, 0);
}
break;

case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc = { 0 };
HWND hwnd;
MSG msg;

wc.cbSize = sizeof(WNDCLASSEX);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc1;
wc.lpszClassName = L"Testclass";
if(!RegisterClassEx(&wc)) return 0;

g_hInst = hInstance;
hwnd = CreateWindowEx(0, L"Testclass", L"Test1", WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, 0, 0, hInstance, 0);
if(!hwnd) return 0;

ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);

while(GetMessage(&msg, 0, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return (int)msg.wParam;
}

在右击Test2之前

enter image description here

右键点击Test2后

enter image description here

最佳答案

WM_NCDESTROY 消息比较特殊,它保证是窗口在销毁之前收到的最后 消息。它由 DestroyWindow() 函数生成。

排在最后给了它一个相当崇高的地位。它表示“停止做你一直在做的事情”。例如,当您子类化一个窗口时总是使用它;此消息告诉您停止对其进行子类化。您总是会在窗口的 C++ 包装器类中使用它,它会告诉您何时需要销毁 C++ 对象。它很可能是视觉样式渲染器用来停止使窗口看起来不同的通知,因为它不再存在了。

糟糕。

这样的消息是发生了一些有趣的事情的通知。与旨在发生一些有趣的事情的消息类型相反,例如 WM_LBUTTONDOWN、WM_KEYDOWN、WM_COMMAND。在 WM_CLOSE 与 WM_DESTROY 消息中最为明显。 WM_CLOSE 是“请关闭窗口”。您可以随意使用它并拒绝关闭窗口,通常会显示“数据未保存,您确定吗”消息。 WM_DESTROY 是“它已关闭”。那是一 block 石头,它确实被摧毁了,没有必要拿那 block 石头开玩笑。

如果您生成虚假通知,那么您应该准备好获得虚假结果。不要打扰重要的。

关于c - 为什么发送 WM_NCDESTROY 后窗口画得很奇怪(没有视觉样式)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37447996/

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