停止在Form Load上的父容器内漫游MdiChild表单

时间:2014-04-09 05:55:32

标签: c# winforms visual-studio-2010 mdi

每当我在MdiParent容器内重新打开表单时,子表单向下并向右移动少量(~20像素)。

有没有办法阻止表单在表单加载时执行此操作,而不会阻止它在父表单中自由移动?

以下是一个例子:

enter image description here

然后重新加载子表单:

enter image description here

1 个答案:

答案 0 :(得分:3)

更改子表单上的StartPosition属性:

StartPosition = FormStartPosition.Manual

默认值为WindowsDefaultLocation,这会导致子表单的每个实例每次向下和向右漂移。


当表单是Form表单时,将调用MdiChild类中的以下代码块,并且最初显示表单。 (我修剪了一些不相关的部分。)

对于StartPosition旁边的所有其他Manual值,有关于表单位置的一些计算,但它对StartPosition.Manual没有任何作用。

 // Adjusts the CreateParams to reflect the window bounds and start position.
 private void FillInCreateParamsStartPosition(CreateParams cp) { 
    switch ((FormStartPosition)formState[FormStateStartPos]) {
        case FormStartPosition.WindowsDefaultBounds: 
            cp.Width = NativeMethods.CW_USEDEFAULT;
            cp.Height = NativeMethods.CW_USEDEFAULT; 
            ...
        case FormStartPosition.WindowsDefaultLocation: 
        case FormStartPosition.CenterParent:
            ...
            cp.X = NativeMethods.CW_USEDEFAULT;
            cp.Y = NativeMethods.CW_USEDEFAULT;
            break;
        case FormStartPosition.CenterScreen: 
            if (IsMdiChild) {
                ...
                cp.X = Math.Max(clientRect.X,clientRect.X + (clientRect.Width - cp.Width)/2); 
                cp.Y = Math.Max(clientRect.Y,clientRect.Y + (clientRect.Height - cp.Height)/2);
            }
            else {
                ...
                if (WindowState != FormWindowState.Maximized) { 
                    cp.X = Math.Max(screenRect.X,screenRect.X + (screenRect.Width - cp.Width)/2); 
                    cp.Y = Math.Max(screenRect.Y,screenRect.Y + (screenRect.Height - cp.Height)/2);
                } 
            }
            break;
    }
}