首页 > 解决方案 > 通过从顶部选择弹出窗口使其可移动

问题描述

我正在使用 C 中的 win32 api 使用以下窗口样式为我的游戏创建一个“无边界”窗口:

WS_POPUP | WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX | WS_THICKFRAME

当我试图移动它时,它仍然静止。由于我添加了样式WS_THICKFRAME,因此我可以调整它的大小并且可以稍微“移动”它,但我想知道是否有另一种样式/方式可以通过像普通窗口一样从顶部选择它来使窗口(弹出窗口)移动。

标签: cwinapi

解决方案


该系统允许您根据鼠标输入自定义窗口行为。它正在向窗口的窗口过程发送WM_NCHITTEST消息,允许客户端代码根据需要进行响应。

HTCAPTION从消息处理程序返回WM_NCHITTEST请求系统响应就像单击窗口标题一样,从而允许移动它。

为了保留正常功能,客户端通常会将WM_NCHITTEST消息转发到DefWindowProc,并HTCAPTION在默认处理返回时返回HTCLIENT

case WM_NCHITTEST:
{
    LRESULT position = DefWindowProc(hWnd, Msg, wParam, lParam);
    return position == HTCLIENT ? HTCAPTION : position;
}

推荐阅读