Win32プログラミングで、ウィンドウの親とウィンドウの所有者の違いは何ですか?私はそれを理解していたと思ったので、このコードに出くわしました:
SetWindowLong(handle, GWL_HWNDPARENT, foo);
GWL_HWNDPARENTが使用されているにもかかわらず、これは実際には親ではなくウィンドウの所有者を設定します。親/所有者という用語は互換性がありますか、それとも実際に違いがありますか?
オーナーは、コントロールまたはダイアログを担当するWindow *です(たとえば、ウィンドウの作成/破棄を担当)。
親は、ウィンドウチェーン内のコントロールまたはダイアログの次の上位ウィンドウ*ですが、実際には責任を負いません(必ずしもそのライフサイクルなどを気にする必要はありません)。ウィンドウの親がその所有者になることもできます。
*ウィンドウとウィンドウ:ウィンドウは、画面に表示される実際のウィンドウです。ウィンドウは、HWND(ボタン、パネルなどを含む)を持つ任意のオブジェクトです。
所有権は2つの最上位ウィンドウ間の関係であり、親は最上位とWS_CHILD、またはWS_CHILDと別のWS_CHILD間の関係です。
ボタンの親はボタンのあるフォームで、メッセージボックスはボタンを表示したフォームが所有しています。
この記事をMicrosoft Win32ウィンドウの階層とスタイル から読んで、ウィンドウの関係を作成するための、Ownership、Parenting、ZOrder、SetWindowLong、GetWindow、およびWin32 APIの他の厄介なビットについて、より明確に理解してください。
編集:Microsoftがそのコンテンツを削除したようです。別の妥当な 所有権の概要/子育て です。
Chenのブログ投稿を読んでください。私にとって重要な点は、子ウィンドウでWS_CHILDスタイルを使用する必要があることです。子ウィンドウを作成して親ハンドルをCreateWindow()に渡すことを試みることができますが、WS_CHILDスタイルが設定されていない場合、2つのウィンドウには親/子関係ではなく、オーナー関係があります。