0


0

親ウィンドウが子ダイアログを持っていることを知らないのはどうしてでしょうか。

私のネイティブウィンドウズモバイルアプリでは、私はダイアログを作成するウィンドウを持っています。 私のウィンドウハンドルが `+ hMainWnd +`であるとしましょう。

http://msdn.microsoft.com/en-us/library/aa932921.aspx [+ DialogBoxParam()+]を使用してダイアログを作成し、ダイアログの親として `+ hMainWnd +`を渡します。

DialogBoxParam(_,_,hMainWnd,_,_);

ダイアログのハンドルが + hDlgWnd +`であるとしましょう。 ダイアログ内から、http://msdn.microsoft.com/en-us/library/aa921830.aspx [+ GetParent()`]は期待どおり ` hMainWnd +`を返します。

//We're inside the dialog created above
HWND hParent = GetParent(hDlgWnd); //hParent == hMainWnd

奇妙なことに、http://msdn.microsoft.com/en-us/library/aa929220.aspx [+ GetWindow()+]を呼び出して `+ hMainWnd `の子を見つけると、 ` NULL `が返されます。子がいないこと。 関数が ` hDlgWnd +`を返すことを期待します

//We're inside the main window
HWND hChild = GetWindow(hMainWnd, GW_CHILD); //hChild == NULL

親が自分の子供を知らないとき、子供はどうやって自分の親を知ることができますか?

2 回答


3


`+ GW_CHILD `付きの ` GetWindow +`は、子孫ウィンドウのみを取得し、子孫ウィンドウを取得しないようです。 MSDNから:

_ 指定されたウィンドウが親ウィンドウである場合、取得されたハンドルはZオーダーの最上位にある子ウィンドウを識別します。それ以外の場合、取得されたハンドルはNULLです。 この関数は指定されたウィンドウの子ウィンドウだけを調べます。 子孫ウィンドウは調べません _

子供と子孫の違いは何ですか? わかりませんが、http://msdn.microsoft.com/en-us/library/ms633494.aspx [+ EnumChildWindows +]で必要なものが見つかるかもしれません。


0


ウィンドウは子ウィンドウ(WS_CHILDスタイル)または最上位ウィンドウのいずれかです。

最上位ウィンドウには親ウィンドウはありませんが、所有者ウィンドウがある場合があります。 子ウィンドウには親がありますが、所有者はいません。

GetParent()関数は、子ウィンドウの親または最上位ウィンドウの所有者を返します。 したがって、それは誤った名前です - それはGetParentOrOwner()と呼ばれるべきです。

つまり、最上位ウィンドウの所有者をGetParent()から取得しているということですが、実際には親ではないため、hDlgWndはhMainWndの子ではありません。