c# Form.Parent 및 StartPosition.CenterParent




winforms .net-3.5 (4)

다른 양식 앞에 정확하게 양식을 보여줘야하는데, 이는 다음 질문으로 이어집니다.

CenterParent 필드가 null과 CenterParent 때 폼이 CenterParent 로 시작 위치를 가질 수있는 방법은 무엇입니까?

자신을 올바로 배치하기 위해 부모를 알아야하지만 Parent 필드는 설정되지 않습니다. 이것은 이상합니다. 내가 놓친 게 있니?

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

그게 내가 아이 양식에서하는 모든 것. 부모는 기본 창 위치로 설정됩니다. 부모 양식을 어디로 옮겨도 부모는 부모의 중심에 표시됩니다.


이 코드는 상위 태그 중간에 대화 상자를 엽니 다.

    ObjectDistrubution od = new ObjectDistrubution();
    od.StartPosition = FormStartPosition.CenterParent;
    od.ShowDialog();

소유자에 대한 정보는 API 호출을 통해 만들어진 대화 상자로 전달됩니다 (ShowDialog (IWin32Window 소유자) 메서드 내 Reflector에서 볼 수 있음).

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

ShowDialog 호출에 소유자가 지정되지 않은 경우 owner 변수는 GetActiveWindow API 호출을 통해 계산됩니다.

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

소유자 f 대화 상자 양식에 액세스하려면 GetWindowLong API 호출을 사용할 수 있습니다.

IntPtr ownerHandle = NativeMethods.GetWindowLong(nonModalForm.Handle, -8);

이 정보는 .NET Framework에 의해 내부적으로 저장됩니다. 어쨌든 부모 폼에 액세스하려면 자식 폼의 소유자 속성 으로 설정할 수 있습니다.

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

그런 다음 하위 폼에서 Owner 속성을 사용하여 상위 폼에 액세스 할 수 있습니다. 양식이 다른 양식에 의해 소유되면 양식이 최소화되고 소유자 양식으로 닫힙니다. 소유 한 양식은 소유자 양식 뒤에 표시되지 않습니다. 이는 내가 올바르게 이해 한 경우 필요한 것입니다.


부모와 창 소유자의 차이는 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();
    }
}




.net-3.5