• ベストアンサー

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

  • 変数のアドレスの値

    2つの実行ファイルがあってどちらも起動しています。 どちらもテスト用で作ったスケルトン程度のものです。 2つの実行ファイルをA,Bと呼ぶことにします。 Aのウインドウハンドル(HWND型)の値と Bのウインドウハンドル(HWND型)の値が同じであるということはありえませんよね? AにもBにもソースには int i; が書いてあります。 &iの値がAとBとで同じになることはありえますか?

  • VC++コンソールアプリでのインスタンスハンドルの取得

    VC++コンソールアプリでのインスタンスハンドルの取得 VC++コンソールアプリケーションでインスタンスハンドルを取得しようとしているのですが、 HINSTANCE hi = (HINSTANCE)GetWindowLong(HWND_DESKTOP, GWL_HINSTANCE); を実行すると、NULLが戻ってきます。 どこかまずい部分があるのでしょうか。 なお、第一引数のウィンドウハンドルは不明なため、 いくつかのWebサイトに習い、HWND_DESKTOPを指定しました。

  • 別ソースファイルからの呼び出し

    現在VC++6.0でプログラムをしています。 そこで基本的な質問かもしれないのですが 別のソースファイルからの呼び出しはどのようにおこなえばいいのでしょうか?具体的には 前略 void CDioBitDlg::OnButtonAioInputDiBit() { //デジタル入力 UpdateData(TRUE); short DiData; Ret = AioInputDiBit(Id, m_DioBit, &DiData); if(Ret != 0){ Ret2 = AioGetErrorString(Ret, ErrorString); TextString.Format("AioInputDiBit = %d : %s", Ret, ErrorString); m_ErrorString.SetWindowText(TextString); return; } TextString.Format("入力データ : %d", DiData); m_DioData.SetWindowText(TextString); m_ErrorString.SetWindowText("デジタル入力 : 正常終了"); } 後略 別のソース 前略 void CSimulatorWnd::OnPaint() { CPaintDC dc(this); //描写用のデバイスコンテキスト CRect cr; GetClientRect(&cr); dc.FillSolidRect(cr, RGB(0,0,0)); } 後略 前述のは入力信号をデジタルの1もしくは0で表示するダイアログプログラムなのですが この1もしくは0の値を後述のソースファイルに持ってくる場合どのようにすればよいのでしょうか?

  • VCの描画について

     今回は、円についてお聞きしたいです。 VCのAPI32が前提(MSNは使用しない)です。 円は、   WM_PAINT hDC=BeginPaint(hWnd,&ps); Ellipse(hDC,100,100,400,400); Endpaint(hWnd,&ps);で書いています。 問題点は、例えば、iの値が、2のときのみ実行したいという場合どうしたらいいですか? ifの位置を、hDCの前でいれると、ダイアログボックスが開きません Ellipseの一行でかますと、変な円になってしまいます。 どうしたらいいんでしょう(;;) あと、野菜50%・肉30%・魚20%という円グラフにしたい場合、 ラジアンで分割したあと、どういうふうに、円分割したらいいでしょうか? できればアドバイスおねがいします><

  • VC++にてメンバ変数名を作成し使用する場合

    VC++6.0を使用しています。 ダイアログにラジオボタンが40個存在し それぞれのメンバ変数名はm_day1~40です。 特定のラジオボタンを指定し、”1”と表示したいのですが、 下記のようにコーディングを行うと 「'SetWindowTextA' : 'CString' のメンバではありません。」 とコンパイルエラーが出ます。 何か良い改善策はありますでしょうか? 宜しくお願い致します。 char strResult[33]; CString strMakeDay; strMakeDay = "m_day"; strMakeDay = strMakeDay + itoa(intFirstWeek + 1, strResult, 10); strMakeDay.SetWindowText("1"); //intFirstWeek:int型の引数です

  • VC++にてボタン作成について(長文)

    VC++にて実行画面でボタンを表示させたいのですが、(表示するのはボタンだけではありません。)どのようにソースを書いたらいいのでしょう?Bitmapだったら、Viewクラスで ------------------------------------------------ CDC myDC; CBitmap newBitmap; CBitmap *pOldBitmap; newBitmap.LoadBitmap(画像の名前); myDC.CreateCompatibleDC(pDC); pOldBitmap=myDC.SelectObject(&newBitmap); pDC->BitBlt(10,10,320,240,&myDC,0,0,SRCCOPY); myDC.SelectObject(pOldBitmap); ------------------------------------------------ こんな感じかと思いますが、ボタンだったらどういった感じでソースを書いたらよいのでしょうか? また、こういったことを自分で調べたい場合には「ヘルプ」で何をキーワードにして検索したらよいのでしょう? VCを独学するのにどこか良いサイトはありますか?(できたら「ボタン」について詳しく説明してくれるサイトがいいです。) VCはほとんど素人なので簡単なことなのかも知れませんが、まったく分かりません。 ご存知の方、ご教授願います。

  • VC++ 2010 GetOpenFileNameがうまくいかない

    VC++ 2010 GetOpenFileNameがうまくいかない VC++2010でファイルを選択してそれをフルパスで表示する プログラムを作っているんですけど、ソースに GetOpenFileNameを入れたとたん識別子が見つからないだの なんだのというエラーが出てきてしまいます。 どなたかいい解決策がある方は教えてください。

  • プログラム分割で

    VC++6.0でダイアログベースのアプリを作成しています。 少々大きくなったのでプログラムを分割しました。 この場合 分割した側からメイン側のダイアログに配置したエディットボックスに 文字表示したいのですが出来ませんでした。 現在は エディットボックスのメンバ変数 m_EdWindow として・・・ //コールバックルーチンの中で CAiCallDlg *dlg; dlg = (CAiCallDlg *)Param; dlg->m_EdWindow.SetWindowText("もじもじ"); //ボタンなどのイベントの中で m_EdWindow.SetWindowText("もじもじ"); で表示させていますが別ファイルとして作成した関数内からの表示はハンドルを取得して? SetWindowText が使えるのでしょうか。

  • VC++2008にて、画面の動的変更処理について

    現在VC++2008のMFCにて開発を行っております。 ダイアログのテキストボックスAの値を変更し、 カーソルが移動した際に 他のテキストボックスBの値を、Aの値により処理がかかる のような処理は無理なのでしょうか? やはり、ボタン押下でしか画面の更新は無理なのでしょうか? ご教授頂ければ幸いです。

  • hDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWn

    hDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWnd)の違いについて 表題について,お伺いします。 ビットマップをダイアログに表示するソースコードを 書いてますが,参考書やさまざまなHPでは, ウィンドウハンドルをゲットする際に hDC=::GetDC(m_hWnd) ○ ↑と書かれております。 hDC=GetDC(m_hWnd)  × ↑はなぜだめなのでしょう。  ●このスコープ演算子::は何の為につけているのですか? ::が無いとエラーになるので必要みたいですが・・

専門家に質問してみよう