我目前正在开发一个带有标题栏控件的Qt gui应用程序,为此,我的程序会处理WM_NCCALCSIZE
消息并保证一个没有圆角的窗口我的程序调用{{1}} WinAPI 。
除了以下问题外,一切都按预期工作:
如果我更改了我的窗口标题(总是),请更改我的程序图标(总是)或调用系统菜单(有时),在我的自定义扩展框架上绘制原生标题栏。
我尝试了什么:
我尝试删除SetWindowRgn
窗口标志并解决了这个问题,但是这会导致另一个问题:当启用DWM时,我的窗口会丢失最小化动画。
我试图在Qt窗口和本机Win32窗口上执行此操作。两种情况都会出现此问题。
我的问题:
为什么在这种情况下我的自定义扩展框架上绘制了原生标题栏,我该如何防止它呢?
示例图片:
更改标题前的窗口:(预期)
更改标题后:(不预期)
我的代码:(最相关的部分)
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);
}
结果如下:(更改标题时,原生标题栏会继续覆盖我的自定义框架)