如下图所示:
实际做需求的时候,可能会遇到需要禁用最大化和最小化按钮的场景;
Windows提供了接口可以对此处进行修改;
// 注意下述两个标志位:[官方文档](https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles)
WS_MAXIMIZEBOX
WS_MINIMIZEBOX
/// \brief 修改HWND窗口的属性
/// 参数1: dwRemove 表示需要移除的属性
/// 参数2: dwAdd 标识需要新增的属性
/// 参数3: nFlags 为窗口大小和位置标志(可以不填入)
BOOL ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0)
{
ASSERT(::IsWindow(m_hWnd));
DWORD dwStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);
DWORD dwNewStyle = (dwStyle & ~dwRemove) | dwAdd;
if(dwStyle == dwNewStyle)
return FALSE;
// 文档链接:[SetWindowLongPtrA](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowlongptra)
::SetWindowLong(m_hWnd, GWL_STYLE, dwNewStyle);
if(nFlags != 0)
{
// 文档链接:[SetWindowPos](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowpos)
::SetWindowPos(m_hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | nFlags);
}
return TRUE;
}
// 使用方式
ModifyStyle(WS_MAXIMIZEBOX, 0); // 屏蔽最大化功能
ModifyStyle(WS_MINIMIZEBOX, 0); // 屏蔽最小化功能
附注Qt处理此问题的标志位:(Qt自身提供了一个demo可以用于查看这些标志位的不同表现形式:)
Qt::WindowMaximizeButtonHint
Qt::WindowSystemMenuHint
// 设置无边框的方式
setWindowFlags(Qt::FramelessWindowHint);