MSV-Studio中对“Locked”的描述是:“Locked属性确定是否可以移动或调整控件”,因此我将winforms中的Locked属性设置为true,但是窗体仍然可以移动。
防止窗体移动的正确方法是什么?
MSV-Studio中对“Locked”的描述是:“Locked属性确定是否可以移动或调整控件”,因此我将winforms中的Locked属性设置为true,但是窗体仍然可以移动。
防止窗体移动的正确方法是什么?
最大化它。谢谢,JackN. ;-)
/// <seealso href="http://msdn.microsoft.com/en-us/library/ms633548(v=vs.85).aspx"/>
/// <seealso href="http://msdn.microsoft.com/en-us/library/ms633545(v=vs.85).aspx"/>
public class ShowMessage
{
const int SW_SHOWMAXIMIZED = 3; //for maximising (if desired)
const int SW_SHOW = 5; //for simply activating the form (not needed)
const int SW_SHOWNORMAL = 1; //displays form at original size and position (what we use here)
const UInt32 SWP_NOSIZE = 0x0001; //cannot be resized
const UInt32 SWP_NOMOVE = 0x0002; //cannot be moved
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); //always lives at the top
const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE; //sets the flags for no resize / no move
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
/// <summary>
/// Displays the passed form using the parameters set in the base ShowMessage class
/// </summary>
/// <param name="frm">A Windows Form object</param>
/// <example><code>ShowMessage.ShowTopmost(new myForm());</code></example>
public static void ShowTopmost(Form frm)
{
ShowWindow(frm.Handle, SW_SHOWNORMAL); //shows the form
SetWindowPos(frm.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); //sets the form position as topmost, centered
}
}
ShowMessage.ShowTopmost(new frmMessage());
我不是说这是唯一的方法或正确的方法,但这是一种做法。
一般来说,阻止用户移动窗口是不好的做法。用户应该能够将窗口放在任何他想要的地方。防止调整大小是一回事,防止移动是另一回事。我不知道有没有C#本地的方法可以做到这一点,但你可能可以钩入Win32来防止窗口移动。
你可以尝试使用窗体的Move事件,并将窗体设置回起始位置。你需要捕获并存储(在内存中)起始位置。