最好用图像显示,我可以将表格拖离MDI父项的边缘,然后出现滚动条。
更确切地说,子表单被锁定到父表单的区域。
我已经找到了解决方案,(其中很多都是在2年多前回答的,所以我希望它们已经过时了)只会遇到人们检查Move事件的坐标......很棒,但是什么如果我有20个表格..或100个表格。我不能编码所有这些,它有点傻。当然,我可以在父表单上设置一个属性。
答案 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父母将孩子锁定在其范围内。