边框出现在无框窗口上

时间:2018-03-22 14:58:26

标签: windows winapi

我有一个用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;
    }

    ...

我得到一个功能齐全的无框窗口但是当我点击任务栏时出现边框,我不想要。 那么有人知道为什么会发生这种情况以及如何绕过它吗?

顺便说一下,如果我没有从样式中删除标题,我也有一个无框窗口,这个问题不会出现但是我遇到了其他问题。

1 个答案:

答案 0 :(得分:1)

来自SetWindowLong reference

  

某些窗口数据已缓存,因此您使用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区域。