ビジュアルベーシックとVisual C++のダイアログ処理についての困りごと

このQ&Aのポイント
  • ビジュアルベーシックでは、AddHandlerステートメントを使ってダイアログのボタン処理を行うことができましたが、Visual C++ではどのようにしたら良いか途方に暮れています。
  • 質問者はビジュアルベーシックを学んだ後、Visual C++を勉強中です。ダイアログにはOKとCancelのボタンがあり、それぞれ押された際に異なる処理を行い、その後に続く処理を行いたいと考えています。
  • BOOL CXXXDoc::OnNewDocument() という関数内で、ダイアログを表示させるために Cfailsettei クラスを使用し、モーダルでダイアログを表示しています。ダイアログ上のボタンが押された際には、それぞれの処理を行い、その後に続けて処理を行いたいという状況です。具体的な解決方法についてアドバイスをいただきたいとのことです。
回答を見る
  • ベストアンサー

ビジュアルベーシックでは、 AddHandlerステートメントがありましたが・・・・・

ビジュアルベーシックを学んでから、 今度は、Visual C++を勉強していますが・・・ 困っています、 たとえば、ダイアログの上に OK と、Cancel のボタンがあるとします、 ダイアログを表示させて、 OK ボタンを押したら A の処理 Cancel ボタンを押したら B の処理 そして、どちらかの処理が終わったら 続く C の処理を続けてゆく この様にするためには、どうしたらよいのでしょうか? ビジュアルベーシックでは、 AddHandlerステートメントを 使うことができたのですが・・・・ BOOL CXXXDoc::OnNewDocument() { Cfailsettei cf; // 作成したダイアログボックスのクラスです nRet=cf.DoModal();  //モーダルでダイアログを表示     // cf.buttonOK オーケーボタンを押した処理     // cf.buttonCancel キャンセルボタンを押した処理          //処理を続けてゆく if (!CDocument::OnNewDocument()) return FALSE; // TODO: この位置に再初期化処理を追加してください。 // (SDI ドキュメントはこのドキュメントを再利用します。) return TRUE; } どうすれば、良いのでしょうか? よろしくお願いします。

  • wxy
  • お礼率35% (25/71)

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

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

ボタンを押してダイアログを終了させる処理をどのように記述するかにより戻り値で判断可能かどうかが決まります DoModalで実行されたダイアログをEndDialogを呼び出して終了させるとEndDialogの引数がDoModalの返り値になります 返り値の種類が複数あるなら switchで分岐したほうがすっきりしたコードになるでしょう switch( nRet ) { case IDC_COMMAND1:   FuncA();   break; case IDC_COMMAND2:   FuncB();   break; case IDC_COMMAND3:   FuncC();   break; case IDC_COMMAND4:   FuncD();   break; } といった具合です または ダイアログクラスにプロパティ(またはフィールド)として終了要因を実装しておき dlg.EndCode などのように終了要因を特定する方法も有るでしょう VS.NET付属のMSDNなどで DoModalやEndDialogなどを調べてみましょう

wxy
質問者

お礼

ありがとうございます おっしゃるとおりにしたところ、 問題は解決しました。 ありがとうございます!

その他の回答 (1)

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

単純に nRetをif文やswitch文で処理を振り分けることで対処できませんか 処理Cに関しては 上記のブロックの次に記述すれば済むように思います if ( nRet == IDOK ) {   // 処理A } else if ( nRet == IDCANCEL ) {   // 処理B } else {   // 想定外の戻り値   ASSERT(FALSE); } // 処理C

wxy
質問者

補足

ありがとうございます、 cf.DoModal()の、戻り値を 設定することができるのでしょうか? ボタンが 5個も、6個もあった場合に 振り分ける方法を教えてもらえば助かります。 その方法が、分かれば教えて下さい、 よろしくお願いします。

関連するQ&A

  • プロパティーシートでOKボタンを押しても終わらなくするには?

    VC++ Ver6.0  プロパティーシートを使用した場合に自動で表示されるOK、キャンセルのボタンで、OK処理を実行した時は継続して処理を行う事はできないのでしょうか? キャンセル処理だけ終わるようにしたいのです。 BOOL CTESTApp::InitInstance() { AfxEnableControlContainer(); //省略 CPSheet Dialog("テストタイトル"); m_pMainWnd = &Dialog; if (Dialog.DoModal() == IDOK) { // [OK]が押されたときの処理 //処理後は、次のイベント待ちにしたい・・・ } else if (Dialog.DoModal() == IDCANCEL) { // [キャンセル]が押されたときの処理 //何もせず終了する(現状のまま) } return FALSE; }

  • ダイアログからビュークラスのメンバ変数へ代入するには?

    プログラミング初心者です. Visual C++.netを使っています. Viewクラスから,Domodal()にてあるダイアログを呼び出しました. ダイアログ上のあるボタンを押したら,Viewクラスのメンバ変数へ1を代入するという処理をしたいと考えています.  ラジオボタンやエディタコントロールであれば,DDXを利用すればよいと思うのですが,単なるボタンの場合はどうすれば,呼び出し元のViewクラスの値を操作(この場合,代入)出来るのでしょうか?

  • ダイアログのボタンが押された時に、その「ボタン」のあるダイアログと、すでに表示されている他のダイアログを消したいです

    Win2000/MFC/ダイアログベース で作業しています。初心者です(^^;) Aというダイアログで「あるボタンa」を押してDoModalでBというダイアログを表示させ、Bダイアログで「あるボタンb」を押してDoModalでCというダイアログを表示させ、Cダイアログで「あるボタンc」を押した時にBダイアログとCダイアログを閉じたい(消したい)のですが EndDialogで消せません DoModalの戻り値をret_b,ret_cとした場合 EndDialog(ret_c); EndDialog(ret_b); としたのですが。。。 やり方がおかしいのか、よくわかりません・・ 初心者でもわかりやすいお返事お待ちしています(^^;)

  • Visual C# 2005 Express Edition の使い方について教えてください(初歩の初歩です。)

    Visual C# 2005 Express Editionの使い方?について困っています。 ファイル―新しいプロジェクト を選択し、「新しいプロジェクト」ダイアログボックスを開きました。 そこで、どれかテンプレートを選び、プロジェクト名を入力後、OKボタンを押す、というのが普通の流れだと思うのですが、なぜかどのテンプレートを選択しても、OKボタンが押せなくて困っています(いつまでもボタンがへこんだままということです) これは一体どういうことなのでしょうか?自分なりに色々調べてみたのですがやはりこういうところでつまずくのはかなり異例なのか全くわかりませんでした。 どなたか解決方法がわかる方がいれば教えてください。

  • [OK]/[キャンセル]ボタンがついたダイアログの作り方。

    すごく基本的なことですが、[OK]/[キャンセル]ボタンがついたダイアログで、ドキュメントとビューでのデータのやり取りが自信がないので教えてください。 たとえば、顧客データベースのアプリケーションがあって、ある顧客のデータを修正するためのダイアログを考えます。(顧客リストから顧客Aを選択して、編集ボタンを押すと、その修正のためのダイアログがでるとします。) この手のダイアログにはよく[OK][キャンセル]ボタンがついていますよね。 私が考えた方法は以下のとおりです。 まず、顧客Aのデータ(Documentオブジェクト)としては (1)データベースの中にある「顧客Aのデータ」(本データ) (2)ダイアログで編集中の「顧客Aのデータ」(一時データ) の2つを用意します。そして、 ・ダイアログ(Viewオブジェクト)を起動するとき、(1)をコピーして(2)を作ります。 ・ダイアログで編集するのは(2)です。 ・ダイアログで [OK]を押すと(2)を(1)にコピーします。 ・[キャンセル]を押すと、単に(2)を破棄して終わりです。 このように、[OK]/[キャンセル]ボタンがついた編集ダイアログなどでは、2つ同じデータのオブジェクトを作るものなのでしょうか。他に方法が思いつきません。

  • Warning: initial dialog data is out of range. と言う警告について

    VC++ 6.0 MFC ダイアログベースです。 メインダイアログで、あるボタンをクリックすると、別のダイアログが開くと言う物を作っているのですが、 「F5キー」でデバックし、メインダイアログから別のダイアログを開くと、 Warning: initial dialog data is out of range. と言うメッセージがデバックのメッセージウィンドウにでていました。 これはどういった警告なのでしょうか?よろしくお願い致します。 また、どこを見る必要があるのでしょうか? (1)警告メッセージが出るのは selectingdlg->DoModal(); で出ていました。 (2)OnInitDialog()の中身を全部削除しても、(下記状態)同様の警告が出ました。 (3)最初のころはこのような警告はなく、最近になって見つけたのですが、何を追記した時かが自分でももお解らなくなってしまいました・・・。 よろしくお願い致します。 void CMainDlg::Onbutton1() {   selectingdlg->DoModal(); } BOOL CChildDlg::OnInitDialog() {   CDialog::OnInitDialog();   // TODO: この位置に初期化の補足処理を追加してください   return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります          // 例外: OCX プロパティ ページの戻り値は FALSE となります }

  • MFC VC++6.0 DestroyWindowの実装場所について

    [開発環境]:Visual C++ 6.0 現在、Visual C++ 6.0を使ったプログラミングの勉強をしています。 MFC AppWizard (exe)でSDIプログラムのtest1プロジェクト作成後、メインフレームにボタンを実装し、そのボタンを押下するとモードレスダイアログを表示するというアプリケーションを作っているのですが、ダイアログを終了させる時のDestroyWindowの実装場所と実装方法が分かりません。 ダイアログ用のクラスはCmyDialogとしていますが、ダイアログの終了ボタンを実装した場合、そのボタン処理の中すなわちCmyDialogクラスのなかの関数で行うべきなのでしょうか?それともダイアログの作成と同様にメインフレームがわの処理(CTest1Viewクラスでの処理?)として行うべきなのでしょうか?この場合にはどのような場所でどのようなタイミングで実装すればよいのか分かりません。 ご存じの方、これらについて御教授お願いします。 以下プログラムの一部を記載します。 -test1view.cppの一部-(ここでダイアログの作成と表示をしています) void CTest1View::OnButton1() { CmyDialog* myDLG = new CmyDialog; myDLG->Create(IDD_DIALOG1,this); myDLG->ShowWindow(SW_SHOW); }

  • Visual c++でダイアログと処理の切り離し

    初心者ですので簡単なものですが質問させてください。 Visual c++2005のMFCのダイアログベースで作られたタイマーで周期処理されるプロジェクトがあります。 ダイアログと処理を別々のプロジェクトに切り離してUDPで通信したいと考えています。 まずは簡単なモノで試したいのですが、どうすればよいのかわからないのでご教授いただけたらと思います。 例えば、処理としてはテキストボックスに数字を入力しボタンを押したら計算結果が表示される簡単なものです。 まずは、これが動作するモノを作りました。 そして同じものをコピペしてソケットを利用してプロジェクト間で通信を行えばよいと考えています。 内部処理としては下記のようになると思うのですが、、、 1.入力した変数をまとめてパケットに変換(ダイアログ側) 2.パケットを送信(ダイアログ側) 3.パケットを受信(処理側) 4.受信したパケットを解釈(処理側) 5.解釈したデータを計算処理(処理側) 6.計算処理結果をパケットに変換(処理側) 7.パケットを送信(処理側) 8.パケットを受信(ダイアログ側) 9.受信したパケットを解釈(ダイアログ側) 10.解釈したデータをダイアログに表示(ダイアログ側) ※通信ではafxsock.hを利用すればよいとのことでした。

  • VC++6.0 異常終了の調査方法

    環境:VC++6.0 MFC使用 ダイアログベースアプリケーション 使用PC:同一ソースをWin2000またはWinXPでリビルドして使用 です。 メインダイアログにメニューを実装し、あるメニュー項目を 選ぶと別のダイアログをDoModalで表示し、別のダイアログで「OK」を 押すとメインダイアログに処理が戻るようなソフトを作成しています。 別のダイアログは数種類あり、EDITボックスやコンボボックスなどを 配置しています。 ダイアログ切り替えの運用試験として、 あるダイアログを表示→閉じるを繰り返す試験を行っていると、 数時間でこのソフトが異常終了してしまいます。 (タイマ処理内で、現在日時分秒を出力しています) 「あるダイアログを表示」は、ソフトのタイマ処理で5秒おきにDoModalしています。 「閉じる」は、「OK」ボタンを押す別アプリを作成しています。 別アプリでは、「IsWindowVisible()の戻り値がTRUE」かつ 「FindWindowExを使用してlpszWindow(ウインドウ名)が「OK」」 のコントロールを探し出し、見つかればSendMessageなどで 「OK」ボタンを押す処理を代行させています。 何が原因で異常終了してしまうかを調べたいのですが、 具体的な良い方法はありませんでしょうか。 わかっている現象として、 1.タスクマネージャのプロセスタブで このソフトのメモリ使用量を見ていると、 時間とともに少しずつ増加しています。 よろしくお願いいたします。

  • Visual C#を用いたボタン押し処理について

    Visual C#を用いたボタン押し処理について Visual C#のWindowsアプリケーションについての質問です。 「ボタンA、ボタンB、ボタンC」ボタンを3つ作ります。 private void button1_Click(object sender, EventArgs e){} このようなソースになるのですが、ボタンAを押したときにボタンB、ボタンCを押した処理を行いたいです。ボタンB、Cを button2_Click(X,Y); button3_Click(X,Y); でロードするのはわかるのですが、XとYには何を入れればいいのでしょうか? 検索した結果、おそらくnullを入れてはいけないのはわかったのですが、何を入れればいいのかがわかりません。 >非静的イベントを発生させるときは、sender パラメーターとして null (Visual Basic の場合は Nothing) を渡さないでください。 よろしくお願いします。

専門家に質問してみよう