我最近用 C++ 和 Win32 API 创建了一个窗口。我想为其制作一个自定义标题栏(我覆盖了
WM_NCHITTEST
以便能够将其拖动到任何地方):
#include <windows.h>
LRESULT CALLBACK window_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (uMsg == WM_NCHITTEST) {
LRESULT hit = DefWindowProc(hWnd, uMsg, wParam, lParam);
if (hit == HTCLIENT) hit = HTCAPTION;
return hit;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) {
WNDCLASSW window_class = {
NULL, window_proc, NULL,NULL, hInstance,
NULL, LoadCursor(NULL, IDC_ARROW),
NULL, NULL, L"minimal_example_window"
}; RegisterClassW(&window_class);
HWND hWnd = CreateWindowW(
L"minimal_example_window", L"",
WS_VISIBLE | WS_POPUP | WS_SIZEBOX | WS_MAXIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,
1200,
800,
NULL,NULL,
hInstance,
NULL
);
MSG msg; while (GetMessageW(&msg, NULL, 0, 0) > 0)
{ TranslateMessage(&msg); DispatchMessageW(&msg); }
return 0;
}
但是,当我窗口上没有
WS_SIZEBOX
(或 WS_THICKFRAME
)和 WS_MAXIMIZEBOX
样式时,将其拖动到屏幕顶部不会触发 Windows 11 的 Dock 弹出窗口。
我尝试了Window Styles Win32 Docs中列出的许多不同的窗口样式,但没有成功。
作为记录,我使用
clang++ 17.0.6 x86_64-w64-windows-gnu posix
有什么帮助吗?
看起来 Windows 的对接系统要求窗口可调整大小。 解决方案是在原始标题栏上绘制并创建自定义 HitTest 函数,以便能够正常调整窗口大小。 这篇文章非常详细: https://learn.microsoft.com/en-us/windows/win32/dwm/customframe