C#MDI - 如何阻止滚动条?

时间:2011-10-27 11:22:58

标签: c# winforms mdi

最好用图像显示,我可以将表格拖离MDI父项的边缘,然后出现滚动条。

更确切地说,子表单被锁定到父表单的区域。

我已经找到了解决方案,(其中很多都是在2年多前回答的,所以我希望它们已经过时了)只会遇到人们检查Move事件的坐标......很棒,但是什么如果我有20个表格..或100个表格。我不能编码所有这些,它有点傻。当然,我可以在父表单上设置一个属性。

MDI Scrollbar problem

3 个答案:

答案 0 :(得分:1)

你可以做这样的事......

Step!:你必须制作基本形式(如用户控制)

并将此代码放在该表单中

 namespace Controls
 {
  public partial class BaseForm : Form
  {
    public BaseForm()
    {
      InitializeComponent();
      StartPosition = FormStartPosition.WindowsDefaultLocation;
      MaximizeBox = false;
      Width = 806;
      //Width = 850;
      //Height = 760;
      Height = 730;
      //Width = 790;
      //Height = 617;
    }


    protected override void WndProc(ref Message m)
    {
      const int WM_SYSCOMMAND = 0x0112;
      const int SC_MOVE = 0xF010;
      //ShowScrollBar(this.Handle, (int)ScrollBarDirection.SB_BOTH, false);
      switch (m.Msg)
      {
        case WM_SYSCOMMAND:
          int command = m.WParam.ToInt32() & 0xfff0;
          if (command == SC_MOVE)
            return;
          break;
      }
      base.WndProc(ref m);
    }
  }
}

然后在每种形式中你必须像这样指定......

public partial class childform : BaseForm
{
   .......
}

确保您的所有子表单大小都应该以基本格式指定

  • minsize是0,0

  • max sixze也是0,0

  • startposition - windowsdefaultlocation

  • windowstate - 正常

我希望它会帮助你......

答案 1 :(得分:1)

第1步: 您应该创建一个继承自NativeWindow类的新类,并覆盖其WndProc方法。

第2步: 在MDI表单中,创建这个新类的新对象,并将MDIClient控件传递给它的构造函数。

第1步代码:

  internal class MyNativeMDIclient : NativeWindow
    {
        private MdiClient mdiClient;

        public MyNativeMDIclient(MdiClient parent)
        {
            mdiClient = parent;
            ReleaseHandle();
            AssignHandle(mdiClient.Handle);            
        }
        internal void OnHandleDestroyed(object sender, EventArgs e)
        {
            ReleaseHandle();
        }
        private const int SB_BOTH = 3;
        [DllImport("user32.dll")]
        private static extern int ShowScrollBar(IntPtr hWnd, int wBar, int bShow);
        protected override void WndProc(ref Message m)
        {
            ShowScrollBar(m.HWnd, SB_BOTH, 0 /*false*/);
            base.WndProc(ref m);
        }
    }

第2步代码:

  foreach (Control control in this.Controls)
            {
                if (control is MdiClient)
                {
                    MyNativeMDIclient nw = new MyNativeMDIclient(control);
                    break;
                }
            }

答案 2 :(得分:0)

您可以始终覆盖父类中的移动功能,然后让所有表单都从该类继承。

没有神奇的API /属性(我知道,如果我错了就道歉)告诉MDI父母将孩子锁定在其范围内。