3

さて、多くの人が何らかの形でこの質問をしましたが、子を呼び出すときに親オブジェクトを渡す以外に、多くの答えはないようです。問題は、親コードにアクセスできないことです。

これが私の状況です。

私がアクセスできないいくつかのコード、私はdll(親フォーム)を使用しているだけで、私のコード(子フォーム)で関数を呼び出します。

私の関数は、パラメーターの 1 つとして親フォームを必要とするサード パーティの SDK (それほど重要ではありません) を呼び出します。また、いくつかの C++ ライブラリを介してのみ、サード パーティのコードにアクセスできません。

私の子供のフォームは親を知ることができますか、それとも孤児になる運命にありますか?

4

4 に答える 4

3

最も一般的なケースでは(フォームが dll のどこかにあり、親フォームをサードパーティ ソフトウェアに渡す必要があるため) - WinAPI -GetParent関数で親ウィンドウ ハンドルを取得できます。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633510(v=vs.85).aspx

そんな感じ:

[DllImport("user32.dll",
           EntryPoint = "GetParent",
           CharSet = CharSet.Auto)]
internal static extern IntPtr GetParent(IntPtr hWnd); 

...

IntPtr parentHandle = GetParent(myForm.Handle); // <- If you have a form

...

IntPtr myFormHandle = ...
IntPtr myFormParentHandle = GetParent(myFormHandle); // <- If you have WHND only

// If there's a .net form with myFormParentHandle Handle you can retrieve it 
// Otherwise (e.g. form is not a .net one) you get null
Form parentForm = Control.FromHandle(myFormParentHandle) as Form;
于 2013-09-02T14:02:51.317 に答える
2

多分私は何かが欠けているかもしれませんが、あなたはただ使うことができますContainerControl.ParentForm

var parent = myForm.ParentForm;

または(実際に質問するフォームがなく、代わりにコントロールがある場合):

var parent = myForm.Parent;

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.parent.aspxを参照してください。

次に、その親の Windows API ハンドルは次のようになります。

IntPtr handle = parent.Handle;

サードパーティの SDK に渡すことができます。

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.handle.aspxを参照してください。

親が実際にフォームであることを確認する必要がある場合:

Form form = myForm.Parent as Form;

if (form != null)
    // Do something with form.

しかし、人々が言っ​​たように:myForm.ParentForm

于 2013-09-02T13:59:03.923 に答える
0

あなたのフォームは別のフォームの上に表示されますか? Form.Ownerプロパティを試してください。

これをやりたいと確信していますか?親フォームにアクセスする機会が与えられていないのには、正当な理由がある場合があります。この制限を回避してフレームワークやパターンを壊さないように注意してください。

于 2013-09-02T13:59:13.083 に答える
0

親フォームから必要なすべての情報を子のフォームに渡す方が (精神的な正気のために) 良いので、1 つの方法で考えるだけで済みます (親フォームが子に情報を渡し、子が情報と追加の情​​報を子フォームに渡します)。次の子など)

他のフォームに依存するフォーム/クラスを行うことはハードカップリングと呼ばれ、ソフトウェアを維持する上で問題になります。

于 2013-09-02T14:02:30.130 に答える