无边界 C++ 窗口不会触发 Windows 11 的停靠面板

问题描述 投票:0回答:1

我最近用 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

有什么帮助吗?

c++ winapi
1个回答
0
投票

看起来 Windows 的对接系统要求窗口可调整大小。 解决方案是在原始标题栏上绘制并创建自定义 HitTest 函数,以便能够正常调整窗口大小。 这篇文章非常详细: https://learn.microsoft.com/en-us/windows/win32/dwm/customframe

© www.soinside.com 2019 - 2024. All rights reserved.