いつもお世話になっております。
環境:VC++6.0 WinXP
Createされた子ウィンドウ内でCreateした側の親を取得したいのですが。
親側
KMessageDlg m_dlgMessage;
m_dlgMessage.Create(IDD_MESSAGE, this);
子側
CWnd* pWnd = this->GetParent();
親側のthis->m_hWndを見ると
0x004d0870でした。
子側のpWnd->m_hWndをみると
0x004d0942でした。
微妙に違うのですがGetParentではダメなのでしょうか。
勿論ポインタを明示的に渡せばいいのですが、
それしか方法がないのでしょうか。
宜しくお願い致します。
子側はコントロールではありませんね?
「親ウィンドウ」というのはコントロールが載っているウィンドウのことを言います。
「親ウィンドウ」と「オーナーウィンドウ」の違いを調べてみましょう。
GetWindow(GW_OWNER)
ではいかがでしょう?
ご教授ありがとうございます。
「親ウィンドウ」と「オーナーウィンドウ」の違いを理解しておりませんでした。
どういう違いかということはわかったのですが、
ポインタがとれないのでまだわかっていないかと。
以下、どれをやっても違う値が返ってきました。
pWnd = this->GetParent();
pWnd = this->GetParentOwner();
pWnd = this->GetWindow( GW_OWNER );
すいません、表現が悪かったです。
以下、どれをやっても期待とは違う値が返ってきました。
pWnd = this->GetParent();
pWnd = this->GetParentOwner();
pWnd = this->GetWindow( GW_OWNER );
申し訳ありません、勘違いでした。
もっとシンプルなアプリでテストしてみると
this->GetParent();
でも、
this->GetWindow( GW_OWNER );
でも、期待する値が取れました。
本チャンのほうではウィンドウ継承等、複雑なことをやっているため、
値がずれているとは思うのですが(又はバグ)、もう少し調査してみます。
どうやらダイアログベースですと、
this->GetParent();や
this->GetWindow( GW_OWNER );
でオーナーウィンドウが取れるようです。
これがSDIになると、ポップアップ側(子側)でとれる
this->GetParent();や
this->GetWindow( GW_OWNER );
はCMainFrameになるようです。
従って、
pWnd = this->GetParent();
pWnd = ((CMainFrame*)pWnd)->GetWindow(GW_CHILD);
をやることで親のViewクラスのウィンドウを取得できました。
先に何ベースかということをはっきり記述するべきでした。
お騒がせ致しました。
お答えいただきありがとうございました。
補足になりますが、つまりは「子ウィンドウはオーナー
ウィンドウになれない」ということです。
ポップアップウィンドウ作成時に子ウィンドウをオーナー
として指定すると、Windowsは子ウィンドウのトップレベル
の親ウィンドウに所有権を割り当てます。
SDIベースの場合、ビューウィンドウをオーナーとして
指定しても実際にはトップレベルのフレームウィンドウが
オーナーになります。
ダイアログベースの場合、ダイアログ自身がトップレベル
ウィンドウであるため、オーナーとして指定したウィンドウと
実際にオーナーになったウィンドウが同じになる、
というだけの話です。
ダイアログベースの場合でも、ダイアログの子ウィンドウ
(コントロールなど)をオーナーに指定すれば、指定した
ウィンドウと実際のオーナーは同じウィンドウにはなり
ません。
>「子ウィンドウはオーナーウィンドウになれない」
なるほど!そういうことでしたか。
全然わかっていませんでした。
大変勉強になりました。ありがとうございました。