我有一个用Qt和Windows编写的应用程序我自己处理本机事件,有一个原生感觉的自定义窗口。
我正在删除这样的标题,以便在任务栏自动隐藏选项打开时实现窗口正确定位。
DWORD style = GetWindowLong (hwnd, GWL_STYLE);
style &= ~WS_CAPTION;
style |= (WS_MAXIMIZEBOX | WS_THICKFRAME);
SetWindowLong (hwnd, GWL_STYLE, style);
..我隐藏边框,如MSDN文档中建议的那样:
switch (msg)
{
case WM_NCCALCSIZE:
{
// this removes the window frame and title bar we added with WS_THICKFRAME and
// WS_CAPTION
*result = 0;
return true;
}
...
我得到一个功能齐全的无框窗口但是当我点击任务栏时出现边框,我不想要。 那么有人知道为什么会发生这种情况以及如何绕过它吗?
顺便说一下,如果我没有从样式中删除标题,我也有一个无框窗口,这个问题不会出现但是我遇到了其他问题。
答案 0 :(得分:1)
某些窗口数据已缓存,因此您使用SetWindowLong进行更改 在调用SetWindowPos函数之前,它不会生效。 具体来说,如果您更改任何框架样式,则必须调用 具有SWP_FRAMECHANGED标志的SetWindowPos用于缓存 正确更新。
像这样调用SetWindowPos
来解决问题:
SetWindowPos( hwnd, NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE );
这也会导致Windows向您的窗口发送WM_NCCALCSIZE
消息以重新计算NC区域。