我在 Win7-Aero 上有一个基于对话框的 Win32-app,它只显示一个对话框。对话框应该有一个标题栏。我不希望用户可以在屏幕上移动对话框。
到目前为止我没有运气......处理WM_NCHITTEST
,WM_SYSCOMMAND
......设置SWP_NOMOVE
。
实现的最佳方法是NoMove
什么?我认为 DWM 在 Win7 上有所改变。
我在 Win7-Aero 上有一个基于对话框的 Win32-app,它只显示一个对话框。对话框应该有一个标题栏。我不希望用户可以在屏幕上移动对话框。
到目前为止我没有运气......处理WM_NCHITTEST
,WM_SYSCOMMAND
......设置SWP_NOMOVE
。
实现的最佳方法是NoMove
什么?我认为 DWM 在 Win7 上有所改变。
您可以通过处理来做到这一点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
(通过系统菜单捕捉用户尝试的移动)。