处理WM_NCCALCSIZE消息时出现问题

时间:2014-07-13 01:48:46

标签: c++ windows

我目前正在开发一个带有标题栏控件的Qt gui应用程序,为此,我的程序会处理WM_NCCALCSIZE消息并保证一个没有圆角的窗口我的程序调用{​​{1}} WinAPI 。

除了以下问题外,一切都按预期工作:

如果我更改了我的窗口标题(总是),请更改我的程序图标(总是)或调用系统菜单(有时),在我的自定义扩展框架上绘制原生标题栏。

我尝试了什么:

我尝试删除SetWindowRgn窗口标志并解决了这个问题,但是这会导致另一个问题:当启用DWM时,我的窗口会丢失最小化动画。 我试图在Qt窗口和本机Win32窗口上执行此操作。两种情况都会出现此问题。

我的问题:

为什么在这种情况下我的自定义扩展框架上绘制了原生标题栏,我该如何防止它呢?

示例图片:

更改标题前的窗口:(预期)

enter image description here

更改标题后:(不预期)

enter image description here

我的代码:(最相关的部分)

WS_BORDER

更新

根据@Raymond Chen的回复,我将我的代码更改为以下内容:(为了绘制非客户区域)

bool MainWindow::winEvent(MSG *message, long *result)
{
    switch (message->message)
    {
    case WM_NCCALCSIZE: //Change the client area size
    case WM_NCACTIVATE: //Solve a problem with the borders drawing over my window
        return true;
    default:
        break;
    }

    return QMainWindow::winEvent(message, result);
}

void MainWindow::resizeEvent(QResizeEvent*)
{
    HWND hWnd = (HWND)winId();
    HRGN region;

    RECT rect;
    GetWindowRect(hWnd, &rect);
    int w = rect.right - rect.left;
    int h = rect.bottom - rect.top;

    region = CreateRectRgn(0, 0, w, h);

    SetWindowRgn(hWnd, region, TRUE);
}

结果如下:(更改标题时,原生标题栏会继续覆盖我的自定义框架)

enter image description here

0 个答案:

没有答案