• ベストアンサー

VC++でソース作成を行っています。

VC++でソース作成を行っています。 ダイアログAにSetWindowTextなどで値を変えるクラスをクラスAとして、他のクラスBから SetWindowTextを使用して、ダイアログAの値を変更したいのですが、 実行するとASSERT(::IsWindow(m-hWnd))で止まってしまいます。 ウィンドウハンドルの問題だと考えておりますが、解決策とうございますでしょうか。 ご教授よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

DialogAのpublic:に CDialogA *m_pParentDlg; を宣言します。 CDialogA a; のa内で CDialogA b; b.m_pParentDlg = this; b.DoModal(); でbを起動し、  b内でm_pParentDlg->func();  とaの関数を使用して下さい。

その他の回答 (2)

回答No.2

よく見かける間違いは、 CDialogA dlg; // (1) dlg.DoModal(); としたうえで、別のCClassBから CDialogA dlg; // (2) dlg.SetWindowText("Change"); みたいに呼び出してるとか。 (1)と(2)は「同じクラスのオブジェクト」だけど、「オブジェクトとしては別」であることが理解できていないと、このような間違いが起こります。 (1)のダイアログを操作したいのなら、何らかの方法で(1)のdlgのポインタか参照をCClassBに渡す必要があります。もしくは、CClassBでdlgを見つけ出すコードを書くか。

回答No.1

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() を利用して回避することは考えられないでしょうか。

関連するQ&A