0

我在 Win7-Aero 上有一个基于对话框的 Win32-app,它只显示一个对话框。对话框应该有一个标题栏。我不希望用户可以在屏幕上移动对话框。

到目前为止我没有运气......处理WM_NCHITTESTWM_SYSCOMMAND......设置SWP_NOMOVE

实现的最佳方法是NoMove什么?我认为 DWM 在 Win7 上有所改变。

4

1 回答 1

1

您可以通过处理来做到这一点WM_WINDOWPOSCHANGING,当您看到尝试移动时,将坐标更改回它们应该在的位置。例如

switch (uMsg)
{
    case WM_WINDOWPOSCHANGING:
        if (!(reinterpret_cast<LPWINDOWPOS>(lParam)->flags & SWP_NOMOVE))
        {
            reinterpret_cast<LPWINDOWPOS>(lParam)->x = g_iMyXCoord;
            reinterpret_cast<LPWINDOWPOS>(lParam)->y = g_iMyYCoord;
        }
        return 0;
}

您可能需要为此添加一些智能,以区分用户尝试的移动和您自己的程序进行的移动(或系统在必要时进行的移动 - 例如,如果监视器消失)。

即使你说它不起作用,我也会认为你也可以通过捕获WM_NCHITTEST并返回HTBORDER任何时候HTCAPTION返回来做到这一点 - 但是你必须通过子类化窗口而不是DialogProc(因为你会需要先调用默认处理程序,然后处理/更改返回值)。相同WM_SYSCOMMAND(通过系统菜单捕捉用户尝试的移动)。

于 2013-04-23T19:41:34.603 回答