Createされたモーダレスダイアログ内で親を取得 – プログラミング – Home

Createされたモーダレスダイアログ...
 
通知
すべてクリア

[解決済] Createされたモーダレスダイアログ内で親を取得


きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

いつもお世話になっております。
環境: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ではダメなのでしょうか。
勿論ポインタを明示的に渡せばいいのですが、
それしか方法がないのでしょうか。
宜しくお願い致します。


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

子側はコントロールではありませんね?
「親ウィンドウ」というのはコントロールが載っているウィンドウのことを言います。
「親ウィンドウ」と「オーナーウィンドウ」の違いを調べてみましょう。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

GetWindow(GW_OWNER)

ではいかがでしょう?


返信引用
きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

ご教授ありがとうございます。
「親ウィンドウ」と「オーナーウィンドウ」の違いを理解しておりませんでした。
どういう違いかということはわかったのですが、
ポインタがとれないのでまだわかっていないかと。
以下、どれをやっても違う値が返ってきました。

pWnd = this->GetParent();
pWnd = this->GetParentOwner();
pWnd = this->GetWindow( GW_OWNER );


返信引用
きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

すいません、表現が悪かったです。
以下、どれをやっても期待とは違う値が返ってきました。

pWnd = this->GetParent();
pWnd = this->GetParentOwner();
pWnd = this->GetWindow( GW_OWNER );


返信引用
きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

申し訳ありません、勘違いでした。
もっとシンプルなアプリでテストしてみると
this->GetParent();
でも、
this->GetWindow( GW_OWNER );
でも、期待する値が取れました。

本チャンのほうではウィンドウ継承等、複雑なことをやっているため、
値がずれているとは思うのですが(又はバグ)、もう少し調査してみます。


返信引用
きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

どうやらダイアログベースですと、
this->GetParent();や
this->GetWindow( GW_OWNER );
でオーナーウィンドウが取れるようです。

これがSDIになると、ポップアップ側(子側)でとれる
this->GetParent();や
this->GetWindow( GW_OWNER );
はCMainFrameになるようです。

従って、
pWnd = this->GetParent();
pWnd = ((CMainFrame*)pWnd)->GetWindow(GW_CHILD);
をやることで親のViewクラスのウィンドウを取得できました。

先に何ベースかということをはっきり記述するべきでした。
お騒がせ致しました。
お答えいただきありがとうございました。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

補足になりますが、つまりは「子ウィンドウはオーナー
ウィンドウになれない」ということです。

ポップアップウィンドウ作成時に子ウィンドウをオーナー
として指定すると、Windowsは子ウィンドウのトップレベル
の親ウィンドウに所有権を割り当てます。

SDIベースの場合、ビューウィンドウをオーナーとして
指定しても実際にはトップレベルのフレームウィンドウが
オーナーになります。

ダイアログベースの場合、ダイアログ自身がトップレベル
ウィンドウであるため、オーナーとして指定したウィンドウと
実際にオーナーになったウィンドウが同じになる、
というだけの話です。

ダイアログベースの場合でも、ダイアログの子ウィンドウ
(コントロールなど)をオーナーに指定すれば、指定した
ウィンドウと実際のオーナーは同じウィンドウにはなり
ません。


返信引用
きた
 きた
(@きた)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

>「子ウィンドウはオーナーウィンドウになれない」

なるほど!そういうことでしたか。
全然わかっていませんでした。
大変勉強になりました。ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました