• 締切済み

プログラム分割で

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

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

別ファイルにしたということですが お使いになるクラスに関するヘッダファイルは当然インクリュードする必要があります そうしないと CPPファイルだけではどのクラスの事を記述してあるのか分かりません atdafx.h、AiCallDlg.h は最低限インクリュードしないといけないでしょう

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

メンバー変数m_EdWindowのアクセス指定子がpublicなら ダイアログクラスのポインタ経由で可能だと思います ボタンのイベントを別ファイルにしただけなら そのイベントハンドラはダイアログクラスに属しているであろうと考えられるので直接 メンバー変数.SetWindowText で使えるはずです dlgに取得したオブジェクトが本当にCAiCallDlgのポインターなのか また そのメンバーの m_hWndは有効なハンドルなのかなどをチェックしましょう メンバー変数 m_EdWindowのアクセス指定子の確認もしましょう エラーが出るならその内容も投稿しましょう 単に『出来ませんでした』では何処に原因があるのか見当のつけようもありません

yzm250
質問者

お礼

追加情報  申し訳ありません、エラー表示の追加があります。 'SetWindowTextA' :左側がクラス、構造体、共用体ではありません。 のエラーも同時にでます。 別ファイルの中でincludeしないといけないヘッダファイルがあるのでしょうか。

yzm250
質問者

補足

redfox63さん早々のご回答ありがとうございます。 質問時に記載しましたプログラムの一部はエラーがなく動作している部分です。 同じような表示を別ファイルとした関数の中で実行したいのですが 単純に持って行って実行しますと (m_EdWindow.SetWindowText("もじもじ"); の場合) 'm_EdWindow' : 定義されていない識別子です・・・とのエラーとなります。 m_EdWindowはエディットボックスを配置しClass Wizardでメンバ変数を設定して使っています。 出来たスケルトン中に DDX_Control(pDX, IDC_EDIT1, mEdWindow); さらにヘッダファイルの中で   // CAiCallDlg ダイアログ  class CAiCallDlg : public CDialog  {   // 構築  public: CAiCallDlg(CWnd* pParent = NULL); // 標準のコンストラクタ  // ダイアログ データ //{{AFX_DATA(CAiCallDlg) enum { IDD = IDD_AICALL_DIALOG }; ・      ・  CEdit m_EdWindow;      ・      ・ とあります >メンバー変数m_EdWindowのアクセス指定子がpublicなら このpublic指定で出来そうなのですがこの場合の指定がわかりません。 宜しくお願い致します。

関連するQ&A

  • 閉じてしまったダイアログのエディットボックスへの書き込み禁止方法

    VC++ 6.0 MFC ダイアログベースです。 メインダイアログ画面で、ボタンを押下した時に、別ダイアログ(子ダイアログ)が呼び出されて、 その子ダイアログ内では、ワーカースレッドを使用して処理を行い、 処理結果をエディットボックスに表示させています。 子ダイアログを閉じる時に、WaitForSingleObject を使って、スレッドを完全に終了させてからダイアログを閉じるように しているのですが、スレッドの処理が、エディットボックスに書き込む時に閉じてしまうと、 スレッドがそこで止まってしまいスレッドが終了しません。 このような場合どうしたら良いのでしょうか? ・閉じるボタンが押されたら、エディットボックスに書き込まないようにすれば良いと思い、 (フラグを立てて試したのですが、フラグチェック後に閉じるが押されることがあり失敗) // スレッドの開始 m_Thread = AfxBeginThread(ThreadFunc, this);    // この時、子ダイアログを閉じてしまうと // INFINITEなので、ずっと止まってしまいます。 CString data = "処理結果"; case 0: m_M0edit.SetWindowText(data); break; case 1: m_M1edit.SetWindowText(data); break; case 2: m_M2edit.SetWindowText(data); break; ・ ・ ・ ・ // 子ダイアログを閉じる時に呼び出されます。 // スレッドでの処理が完全に終わるのを待ちます。 afx_msg void CSelecting_Dlg::OnClose() {   DWORD dwRet   dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE);   EndDialog(0); } /***************/ 失敗談 /***************/ // スレッドの開始 m_Thread = AfxBeginThread(ThreadFunc, this);    // この時、子ダイアログを閉じてしまうと // INFINITEなので、ずっと止まってしまいます。 CString data = "処理結果"; if (m_openFlag == 1){ //フラグを見て書き込みするかチェックする。   switch (t){      case 0: m_M0edit.SetWindowText(data); break;      case 1: m_M1edit.SetWindowText(data); break;      case 2: m_M2edit.SetWindowText(data); break; ・ ・ ・ ・   } } // 子ダイアログを閉じる時に呼び出されます。 // スレッドでの処理が完全に終わるのを待ちます。 afx_msg void CSelecting_Dlg::OnClose() {   DWORD dwRet   m_openFlag = false; //閉じるボタンが押されたら フラグを降ろす。   dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE);   EndDialog(0); }

  • VC++.NETを使用したRS232c通信プログラム

    RS232c通信をVC++.NETを用いてPSoCマイコンと通信を行うGUIを作成しようとしています。PSoCとハイパーターミナルを用いた送受信の通信は成功しました。そこで受信ボタンをクリックすると、PSoCから送られてくる文字列を受信してエディットコントロールに表示させるという、ダイアログボックスベースで作成したアプリケーションを作っているんですが、文字列をうまく受信してくれません.現状は「・・・」といった文字をエディットコントローラに表示しており、実際は「welcome」という文字列をPSoCより受信しなければならないんですが・・・。 RS232c通信用のAPIは以下のサイトより使わせてもらっています↓http://7ujm.net/C++/Rs232c.h.html 自分が作成したプログラムはボタンをクリックすることで発生するイベントハンドラ関数内に以下のプログラムを書いているだけです。↓ void CMy090630Dlg::OnBnClickedButton1() { RS232c rs; rs.Connect();//ポートcom5と接続を開始する char w[100]; rs.Read_CRLF(w,100);//PSoCより文字列を受信 m_edit1.SetWindowText(w);//エディットコントロールに  受信文字列を表示させる } VC++をはじめたばかりの初心者で、言葉の間違いなどあるかもしれませんが、教えてください。

  • c++ 変数を1度使ったら削除する等

    変数を1度使ったらなくなるようにしたいです。 今、MFCでダイアログを作成しているのですが AとBのダイアログがあります。 AのOnBnButtonClicked()内で CBDlg dlg; dlg.DoModal(); と作成し、ボタンが押されるとBのダイアログが呼び出されるようにしました。 Bにはエディットボックスがあり、 呼び出されたB内でエディットボックス内を変更します。 最初(1回目)に呼び出した場合にはエディットボックス内に0と表示させておきたいです。 Bを閉じて、もう一度ボタン押下でBを呼び出しても先ほど変更した内容が表示されている、というようにしたいです。 そのためにif文で if(Bが初めて呼び出されたとき){ エディットボックスに0を表示; } else if(2回目以降){     先ほど編集したデータ; } というようにしようと自分の中では考えています。 Bのダイアログが初めて呼び出されたときを0として int i = 0; if(i == 0)...... として それ以降1回呼び出されるごとにiを +1していきたいです。 そうするために int i = 0; を初期化で設定する必要があるのですが そう設定するとBのダイアログが呼び出されるたびに i = 0; されてしまい困っています。 わかりにくい説明かと思いますが、説明不足であれば補足要求をお願いいたします。 ご教授いただきたく思います。

  • VC++2010 エディットボックスに値を表示

    現在、VC++2010 MFCでアプリケーションを作成しています。 そこで質問なんですが、 エディットボックスに値(今回はADボードからサンプリングした電圧値)をSetWindowTextや、UpdateData(FALSE);をつかってエディット表示などをしたんですが、これを毎秒表示しようとすると(SetTimer()で毎秒、ADボードで電圧値をサンプリングしエディットボックスに表示)7分後くらいにパソコンがフリーズしてしまいます。どのようにしたらフリーズされないか よろしくお願いします。

  • 連続してダイアログを表示したい?

    VC++6.0を使用しています。 以下のようなコードでダイアログを連続して表示しようと思っています。1番目のダイアログを表示してOKボタンを押下後(このときこのダイアログは消えて)、2番目のダイアログを表示したいと思っているのですが2番目が表示できません。(1番目のところをコメントにすれば2番目は表示できます。)どうして2番目のダイアログが表示できないのでしょうか? // 1番目のダイアログ   CTest1Dlg dlg;   m_pMainWnd = &dlg;   int nResponse1 =dlg.DoModal(); // 2番目のダイアログ   CTest2Dlg dlg;   m_pMainWnd = &dlg;   int nResponse2 =dlg.DoModal(); //   if (nResponse1 == IDOK) {   :以下省略 これだけの情報でアドバイスができますでしょうか? すみません。よろしくお願い致します。

  • フォーカスが移動したタイミングを知りたい

    こんにちは。 VC++6.0にて、ダイアログベースの Windowsアプリケーションを作成しています。 質問なのですが、複数あるエディットボックスの中で 特定したエディットボックスのフォーカスが失われた契機を知るには、どのようにすればよいのでしょうか。 ウィンドウメッセージを待つのでしょうか。 出来ましたら、サンプルコードなど記載頂けると幸いです。 よろしくお願いします。

  • MFCのドラッグ&ドロップについて

    閲覧して頂きありがとうございます。 現在、WindowsXPでvc++6.0のMFC(ダイアログベース)を利用してダイアログを作り エディットボックスに入力されたファイルパスを利用して指定のファイルを 開く簡単なアプリを作ろうとしています。 そこでダイアログのエディットボックスの部分にファイルをドラッグ&ドロップすると エディットボックスにドロップされたファイルのパスを表示させようとしていますが、中々できません。 状況としては、グループボックスの中にエディットボックスを作成し、 グループボックスを右クリック→プロパティ→ドラッグドロップを許可 をすることによりグループボックスにドロップの許可を与えることはできていますが ドロップのイベントを拾うことができておりません。 ※参考サイトなどをみると「WM_DROPFILES」というハンドラがあるみたいなのですが  どこにも見当たらないです。。。 何か不明な点などあれば補足させて頂きますので、よろしくお願いします。

  • VC++のエディットボックスの非表示

    VC++で、ダイアログを作りました。 エディットボックスを置いているのですが、 このエディットボックスは始めは非表示(入力を受け付けない)にするため、 このエディットボックスのプロパティにある "Disable"をtrueにして"Visible"もtrueにしました。 そこまではよかったのですが、 「入力」ボタンを押すと、エディットボックスが白く表示され、入力を受け付けるというようにしたいのですが、 エディットボックスのプロパティを変更する関数というのはあるのでしょうか? いろいろ検索などをしているのですが、方法がわかりません。よろしくお願いします。

  • MFCのキャプション変更

    はじめまして。 環境はVC++6.0 XPです。 MFCでのあるプログラムの中で CWnd* pWnd = GetDlgItem( IDC );//EditBox pWnd->SetWindowText( hoge); SetWindowText( hoge );//hogeは文字列が入った変数 というコードがあるのですが、 このhogeの中にはハングル文字(韓国語)が入っていており、エディットボックスにはちゃんと韓国語が入っているのですが、ウィンドウのタイトルバーには?が入っていてちゃんと表示されていません。 どうすれば表示できるのか教えてください。

  • エディットボックスの処理で画面がちらつきます。

    VC++ 6.0 Win32APIにてダイアログベースのプログラムを作成しております。 ダイアログに18個のエディットボックスを配置しておりますが、そのエディットボックスのテキストを SetDlgItemText()を使って全て空欄にすると(第3引数に””を指定)画面がちらつきます。 同ダイアログ内のリストコントロールがダブルクリックされた際のイベントを拾ってエディットボックスクリアの処理を実行しているのですが、ちらつきを抑える手法はありますでしょうか?