如何禁用Windows/C++窗口调整时出现的透明预览矩形?
禁用Windows窗口大小调整预览矩形的方法
你遇到的这个透明矩形是Windows系统默认的窗口大小调整预览框,针对自定义无边框GUI,可通过以下几种方式禁用:
方法一:自定义窗口大小调整逻辑,拦截系统默认处理
在窗口过程(WndProc)中处理WM_NCHITTEST和WM_SIZING消息,完全接管窗口大小调整的逻辑,系统就不会触发默认的预览框:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_NCHITTEST: { // 自定义边缘检测,返回对应区域让系统允许拖动调整大小 POINT pt = { LOWORD(lParam), HIWORD(lParam) }; ScreenToClient(hWnd, &pt); RECT rc; GetClientRect(hWnd, &rc); const int edgeSize = 8; // 边缘触发区域大小 if (pt.x <= edgeSize && pt.y <= edgeSize) return HTTOPLEFT; if (pt.x >= rc.right - edgeSize && pt.y <= edgeSize) return HTTOPRIGHT; if (pt.x <= edgeSize && pt.y >= rc.bottom - edgeSize) return HTBOTTOMLEFT; if (pt.x >= rc.right - edgeSize && pt.y >= rc.bottom - edgeSize) return HTBOTTOMRIGHT; if (pt.x <= edgeSize) return HTLEFT; if (pt.x >= rc.right - edgeSize) return HTRIGHT; if (pt.y <= edgeSize) return HTTOP; if (pt.y >= rc.bottom - edgeSize) return HTBOTTOM; return HTCAPTION; // 允许拖动窗口区域 } case WM_SIZING: { // 拦截此消息,阻止系统绘制预览框 return 0; } // 其他消息处理... default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
方法二:使用DWM属性禁用非客户区渲染
如果窗口依赖DWM(桌面窗口管理器),可通过DwmSetWindowAttribute设置DWMWA_NCRENDERING_POLICY为DWMNCRP_DISABLED,禁用系统默认的非客户区渲染(包括大小调整预览):
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_POPUP | WS_VISIBLE, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } // 禁用DWM非客户区渲染 DWMNCRENDERINGPOLICY policy = DWMNCRP_DISABLED; DwmSetWindowAttribute(hWnd, DWMWA_NCRENDERING_POLICY, &policy, sizeof(policy)); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }
注意事项
- 方法一需完全接管窗口的拖动和大小调整逻辑,适合高度自定义的无边框窗口;
- 方法二会禁用所有DWM相关的非客户区效果(如窗口阴影),需根据GUI需求选择;
- 确保窗口样式设置为
WS_POPUP(无边框),避免系统默认边框干扰。
内容的提问来源于stack exchange,提问作者Cesar
相关产品推荐
相关产品推荐

