【问题标题】:c# how can I make a windows form non movable and movable againc#如何使窗口窗体不可移动且再次可移动
【发布时间】:2013-08-21 12:26:43
【问题描述】:

我有一个 Windows 窗体,我想在用户单击按钮时使其不可移动,并在用户再次单击按钮时使其再次可移动。

我在这里找到了这个解决方案:How do you prevent a windows from being moved?

但它是一种覆盖,所以我认为这是为了使表单永远不可移动。

有什么线索吗? 谢谢

【问题讨论】:

  • 只需在覆盖的代码中粘贴一个标志,当设置为一种方式时跳过代码,或者在设置另一种方式时运行它(链接的代码只是忽略 SC_MOVE 消息,您仍然可以覆盖并选择性地维护如果您保持对 base.WndProc()) 的调用,则原始功能
  • 使用您找到的解决方案,然后添加另一个条件(单击您的按钮)
  • 我认为该解决方案应该适合您
  • IMO 不会阻止用户移动表单。最终用户会觉得应用挂了!

标签: c# winforms


【解决方案1】:

只要有一面旗帜:

private bool _preventMove = false;

protected override void WndProc(ref Message message)
{
    const int WM_SYSCOMMAND = 0×0112;
    const int SC_MOVE = 0xF010;

    if(_preventMove) 
    {
        switch(message.Msg)
        {
            case WM_SYSCOMMAND:
               int command = message.WParam.ToInt32() & 0xfff0;
               if (command == SC_MOVE)
                  return;
               break;
        }
    }

    base.WndProc(ref message);
}

将标志设置为 true/false 以禁用/启用移动

【讨论】:

  • 我将把它放在我的 BaseForm 类中,所以 MainForm 是 BaseForm 我必须执行 MainForm.Invalidate() 才能执行它吗?
  • 不知道 - 之前没有尝试挂钩 WndProc,但我认为消息是从队列中连续不断地抽取的,所以我想它自己就足够了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多