14

別のフォームの直前にフォームを表示する必要があります。これにより、次の質問が表示されます。

CenterParentフィールドthis.Parentがnullに等しいときに、フォームが開始位置を持つことができるのはなぜですか?

自分自身を正しく配置するためには親を知っている必要がありますが、Parentフィールドは設定されていません。これは奇妙です。私は何かが足りないのですか?

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

子フォームで行うのはこれだけです。親はデフォルトのウィンドウ位置に設定されます。親フォームをどこに移動しても、子は親の中央に表示されます。

4

4 に答える 4

8

所有者に関する情報は、API呼び出しを介して作成されたダイアログに渡されます(ShowDialog(IWin32Window owner)メソッド内のReflectorで確認できます)。

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

ShowDialog呼び出しで所有者が指定されていない場合、owner変数はGetActiveWindowAPI呼び出しを介して計算されます。

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

[所有者]ダイアログフォームにアクセスするには、GetWindowLongAPI呼び出しを使用できます。

IntPtr ownerHandle = NativeMethods.GetWindowLong(nonModalForm.Handle, -8);
于 2012-06-08T08:19:23.187 に答える
3

ウィンドウの親と所有者の違いは、Winformsでは少し混乱しています。このコンテキストでは、CenterParentは実際にはCenterOwnerを意味します。Windowsの機能ではなく、基本のForm.OnLoad()メソッドによって実行されるWinformsに実装されています。ダイアログには常に所有者が必要です。ShowDialog()呼び出しで所有者を指定しないと、ダイアログは所有者を探しに行きます。これは、GetActiveWindow()を最良の推測として使用します。

これを自分で確認するには、次のようにダイアログフォームでOnLoadをオーバーロードします。

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

そして、それはもはや所有者を中心にしていないことに注意してください。

関連するコードは、リファレンスソース、Form.csクラス、OnLoadメソッドで確認できます。

if (GetState(STATE_MODAL)) {
    FormStartPosition startPos = (FormStartPosition)formState[FormStateStartPos];
    if (startPos == FormStartPosition.CenterParent) {
        CenterToParent();
    }
    else if (startPos == FormStartPosition.CenterScreen) {
        CenterToScreen();
    }
}
于 2012-06-08T09:42:00.560 に答える
1

この情報は、何らかの理由で.NETFrameworkによって内部的に保存されていると思います。とにかく、親フォームにアクセスしたい場合は、子フォームの所有者プロパティに設定できます。

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

次に、子フォームで、Ownerプロパティを使用して親フォームにアクセスできます。フォームが別のフォームによって所有されている場合、そのフォームは最小化され、所有者フォームで閉じられます。所有しているフォームは、所有者のフォームの後ろに表示されることもありません。これは、私があなたを正しく理解している場合に必要なものです。

于 2012-06-08T08:46:11.080 に答える
0

このコードは、親TAGの中央にダイアログを開きます。

    ObjectDistrubution od = new ObjectDistrubution();
    od.StartPosition = FormStartPosition.CenterParent;
    od.ShowDialog();
于 2013-05-07T09:18:34.913 に答える