web-dev-qa-db-ja.com

Win32ウィンドウの所有者とウィンドウの親?

Win32プログラミングで、ウィンドウの親とウィンドウの所有者の違いは何ですか?私はそれを理解していたと思ったので、このコードに出くわしました:

SetWindowLong(handle, GWL_HWNDPARENT, foo);

GWL_HWNDPARENTが使用されているにもかかわらず、これは実際には親ではなくウィンドウの所有者を設定します。親/所有者という用語は互換性がありますか、それとも実際に違いがありますか?

50
Jon Tackabury

オーナーは、コントロールまたはダイアログを担当するWindow *です(たとえば、ウィンドウの作成/破棄を担当)。

親は、ウィンドウチェーン内のコントロールまたはダイアログの次の上位ウィンドウ*ですが、実際には責任を負いません(必ずしもそのライフサイクルなどを気にする必要はありません)。ウィンドウの親がその所有者になることもできます。

*ウィンドウとウィンドウ:ウィンドウは、画面に表示される実際のウィンドウです。ウィンドウは、HWND(ボタン、パネルなどを含む)を持つ任意のオブジェクトです。

19
TheSmurf

所有権は2つの最上位ウィンドウ間の関係であり、親は最上位とWS_CHILD、またはWS_CHILDと別のWS_CHILD間の関係です。

ボタンの親はボタンのあるフォームで、メッセージボックスはボタンを表示したフォームが所有しています。

この記事をMicrosoft Win32ウィンドウの階層とスタイル から読んで、ウィンドウの関係を作成するための、Ownership、Parenting、ZOrder、SetWindowLong、GetWindow、およびWin32 APIの他の厄介なビットについて、より明確に理解してください。

編集:Microsoftがそのコンテンツを削除したようです。別の妥当な 所有権の概要/子育て です。

27

Chenのブログ投稿を読んでください。私にとって重要な点は、子ウィンドウでWS_CHILDスタイルを使用する必要があることです。子ウィンドウを作成して親ハンドルをCreateWindow()に渡すことを試みることができますが、WS_CHILDスタイルが設定されていない場合、2つのウィンドウには親/子関係ではなく、オーナー関係があります。

1
osullivj