CSharp - Form.Parent 和 StartPosition.CenterParent

  显示原文与译文双语对照的内容
0 0

我需要将窗体显示面前完全另一个窗体,这使得我下面的问题。

为什么窗体可以有一个起始位置为 CenterParent当没有该字段 this.Parent等于null?

它必须知道父类才能正确定位自己,这有点,但 Parent字段的常量。 太奇怪了 好像少了点什么?

        Form2 f = new Form2();
        f.ShowDialog();

这里是我做的在子窗体。 parent设置为默认的windows位置。 不管在那里我将父窗体,子所示的中心parent 。

时间:原作者:9个回答

0 0

有关创建传递给所有者信息对话框通过API调用( 你可以自己体会在Reflector内ShowDialog( IWin32Window所有者) 方法) :

UnsafeNativeMethods.SetWindowLong(new HandleRef(this, base.Handle), -8, new HandleRef(owner, handle));

当没有所有者ShowDialog调用中指定 owner变量calcualated通过GetActiveWindow API调用:

IntPtr activeWindow = UnsafeNativeMethods.GetActiveWindow();
IntPtr handle = (owner == null) ? activeWindow : Control.GetSafeHandle(owner);

来存取数据Owner f Ի表单可以使用 GetWindowLong API调用

IntPtr ownerHandle = NativeMethods.GetWindowLong(nonModalForm.Handle, -8);
原作者:
0 0

之间的区别是父窗口的所有者Winforms中有点混乱不堪。 在此上下文中,centerparent是什麽意思CenterOwner 。 不是Windows功能,这是Winforms中实现,通过基Form .OnLoad( ) 方法。 对话框应始终有所有者,其外出狩猎中的一个,如果不指定一个ShowDialog( ) 调用。 它使用GetActiveWindow( ) 作为最佳猜测。

眼见为实,重载OnLoad Ի形式,如下所示:

public partial class Form2 : Form {
    public Form2() {
        InitializeComponent();
        this.StartPosition = FormStartPosition.CenterParent;
    }
    protected override void OnLoad(EventArgs e) {
        //base.OnLoad(e);
    }
}

,注意它不再以集成电路所有者。

可以看到相关代码在Reference Source,窗体cs类,onload方法:

if (GetState(STATE_MODAL)) {
    FormStartPosition startPos = (FormStartPosition)formState[FormStateStartPos];
    if (startPos == FormStartPosition.CenterParent) {
        CenterToParent();
    }
    else if (startPos == FormStartPosition.CenterScreen) {
        CenterToScreen();
    }
}
原作者:
0 0

我相信这个信息存储在内部.NET Framework由于某种原因。 总之,如果希望能够访问父窗体,可以将其设置为 Owner属性的子窗体:?

Form form = new Form();
form.Owner = this;
form.Show();

然后在父窗体子窗体可以访问使用Owner属性。 当一个窗体归另一个窗体,它和所有者窗体最小化和关闭。 还会将附属窗体从不显示在其所有者窗体后面,即exaclty / / / / / 如果我理解正确的话。

原作者:
0 0

此代码将打开该对话框中间的父TAG 。

    ObjectDistrubution od = new ObjectDistrubution();
    od.StartPosition = FormStartPosition.CenterParent;
    od.ShowDialog();
原作者:
...