- ベストアンサー
VC++でソース作成を行っています。
VC++でソース作成を行っています。 ダイアログAにSetWindowTextなどで値を変えるクラスをクラスAとして、他のクラスBから SetWindowTextを使用して、ダイアログAの値を変更したいのですが、 実行するとASSERT(::IsWindow(m-hWnd))で止まってしまいます。 ウィンドウハンドルの問題だと考えておりますが、解決策とうございますでしょうか。 ご教授よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
DialogAのpublic:に CDialogA *m_pParentDlg; を宣言します。 CDialogA a; のa内で CDialogA b; b.m_pParentDlg = this; b.DoModal(); でbを起動し、 b内でm_pParentDlg->func(); とaの関数を使用して下さい。
その他の回答 (2)
- m-take0220
- ベストアンサー率61% (480/785)
よく見かける間違いは、 CDialogA dlg; // (1) dlg.DoModal(); としたうえで、別のCClassBから CDialogA dlg; // (2) dlg.SetWindowText("Change"); みたいに呼び出してるとか。 (1)と(2)は「同じクラスのオブジェクト」だけど、「オブジェクトとしては別」であることが理解できていないと、このような間違いが起こります。 (1)のダイアログを操作したいのなら、何らかの方法で(1)のdlgのポインタか参照をCClassBに渡す必要があります。もしくは、CClassBでdlgを見つけ出すコードを書くか。
- CanvasShoes
- ベストアンサー率64% (16/25)
ASSERT(::IsWindow(m-hWnd))で止まるのは、 m_hWndが有効なウインドウハンドルではないからです。 おおかたm_hWndがNULL(0)(ウインドウが構築される前)なのではないかと思います。 ダイアログAの値を変更するタイミングが悪い(ダイアログができる前にSetWindowTextしようとしている)のではないでしょうか。 以下、MFCを利用していると仮定します。 CWnd::m_hWndに値が設定されるのは、CWnd::CreateWindow()の処理の途中です。 もしCDialogの派生クラスを使っているのでしたら、 DoModal()のなかでWindowが作られm_hWndに値が設定されます。 どんなプログラムかわかりませんが、 CDialog::OnInitDialog()や CWnd::OnCreate() を利用して回避することは考えられないでしょうか。