支持为 Windows 11 上的桌面应用使用贴靠布局

贴靠布局是 Windows 11 中的一项新功能,用户可通过该布局了解强大的窗口贴靠功能。 通过将鼠标悬停在窗口的最大化按钮上或按 Win + Z,可以轻松访问对齐布局。调用显示可用布局的菜单后,用户可以单击布局中的区域,将窗口对齐到该特定区域,然后使用“贴靠助手”完成整个窗口布局的生成。 对齐布局根据当前屏幕大小和方向定制,包括支持大型横向屏幕上的三个并排窗口,以及纵向屏幕上的上/下堆叠窗口。

The Notepad app on Windows 11 with rounded corners.

如果应用窗口中有最大化标题按钮可用,则当用户将鼠标悬停在窗口的最大化按钮上时,系统将自动显示贴靠布局。 对于大多数应用,系统会自动显示贴靠布局,但某些桌面应用可能不会显示贴靠布局。 本主题介绍在系统未自动显示贴靠布局菜单的情况下,如何确保应用显示该菜单。

为什么我的应用不显示贴靠布局菜单?

如果应用的主窗口提供了“最大化”标题按钮,但没有显示贴靠布局菜单,这可能是由于你已经以阻止标题按钮或标题栏的方式自定义了标题按钮或标题栏。

如何解决问题?

如果有自定义标题栏,则可以:

  • 使用 Windows 应用 SDK 窗口化 API(请参阅管理应用窗口),并让平台绘制和实现标题按钮。

  • 对于 Win32 应用,请确保你正确响应了 WM_NCHITTEST(“最大化/还原”按钮的返回值为 HTMAXBUTTON)。

    LRESULT CALLBACK TestWndProc(HWND window, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch (msg)
        {
              case WM_NCHITTEST:
            {
                // Get the point in screen coordinates.
                // GET_X_LPARAM and GET_Y_LPARAM are defined in windowsx.h
                POINT point = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
                // Map the point to client coordinates.
                ::MapWindowPoints(nullptr, window, &point, 1);
                // If the point is in your maximize button then return HTMAXBUTTON
                if (::PtInRect(&m_maximizeButtonRect, point))
                {
                    return HTMAXBUTTON;
                }
            }
            break;
        }
        return ::DefWindowProcW(window, msg, wParam, lParam);
    }
    
  • 如果应用使用 Electron,请更新到 Electron 的 v13 稳定版本,以启用贴靠布局。

如果我的应用窗口显示了贴靠布局,但未正确贴靠怎么办?

如果应用可以调用贴靠布局菜单,但无法正确按区域大小贴靠,则可能是应用的最小化窗口太大,导致窗口无法容纳所选区域。

应用支持的最小窗口宽度应不超过 500 个有效像素 (epx),这样可以支持在大多数常见尺寸的屏幕上使用贴靠布局。 但是,建议支持更小的最小宽度(330epx 或更小),以便可以与更多设备和贴靠布局兼容。