【MFC】キャンセルボタン処理ができない

このQ&Aのポイント
  • VC++2005にてMDIアプリケーションを作成し、キャンセルボタンの処理が実装できない問題が発生しています。
  • CFormViewを使用したフォームビューでキャンセル処理を実装することはできないようです。
  • 他の解決策をご存知の方がいらっしゃいましたら、教えていただきたいです。
回答を見る
  • ベストアンサー

【MFC】キャンセルボタン処理が実装できない

VC++2005(MFC)にて下記サイトを参考にMDIアプリケーションを作成しています。 http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_MDI1.html 手順として、プロジェクトを新規作成し、MFC AppWizard(exe)で 新規プロジェクト名をMDITest1に設定し、アプリケーションの種類はMDI、 ビュークラスCMDITest1Viewの基本クラスはCFormViewとします。 リソースビューより、自動生成されたフォームの上に、 Buttonを配置し、イベントハンドラOnBnClickedButton1()内にて、 IDCANCEL()処理にて、ボタン押下時のウィンドウを閉じる処理を 実装したいのですが、コンパイルエラーが発生します。 基本クラスがCDialogクラスの場合は実装できるような気がするのですが。。 フォームビューだと、キャンセル処理は実装不可能なのでしょうか? また、不可能だとしたらウィンドウを閉じる処理はどのように実装すればよいのでしょうか? 解決策をご存知の方おられましたら、お手数ですがご教授宜しくお願い致します。

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

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

確認ですが、"Viewを閉じたい"のであって"アプリを終了したい"のでは ありませんね。 では、手順を説明します。 1)メインフレームのポインタを取得します。  AfxGetMAinWnd()の戻り値をキャストすることで実現できます。 2)MDI子ウィンドウのポインタを取得します。   メインフレームのGetActiveFrame()で実現できます。 3)MDI子ウィンドウを切り離します  MDI子ウィンドウのMDIDestroy()で実現できます。 コード例 void CtestView::OnBnClickedCancel() {   CFrameWnd* pFrm = (CFrameWnd*)AfxGetMainWnd();   CMDIChildWnd *pChild = (CMDIChildWnd*)pFrm->GetActiveFrame();   pChild->MDIDestroy(); } もちろん 例ですので、エラー処理等は省いてあります。 また、変更されていても、一切確認せずに閉じてしまいます。 注意してください。

参考URL:
http://msdn.microsoft.com/ja-jp/library/zs0t7t34(VS.80).aspx
zigen8513
質問者

お礼

ご教授頂いた通りに実装したところ、期待動作することが出来ました。 ありがとうございました!

関連するQ&A

  • 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); }

  • ウィンドウの作成

    VC++のMDIで基本クラスをCFormViewにしてアプリケーションを作成しています。  フォームにボタンをおいて、それを押すと別のフォーム(ウィンドウ)が表示されそこにカメラの動画像がでるようにさせたいのですがどのようにしたらよいでしょうか??今、別のフォーム(ウィンドウ)を表示させるところで悩んでいます…

  • MFC オリジナルDLLからエクスポートしたビュークラスを CMultiDocTemplate で登録すると Assert Failed! が出る

    環境はVisualStudio2005、MDIプロジェクトと拡張DLLプロジェクトを1つのソリューションに作成しています。 MDIアプリを作成していますが InitInstance() 関数内の CMultiDocTemplateの引数 RUNTIME_CLASS() 実行時にAssert Failed!が出ます。 CMultiDocTemplate に登録するビュークラスはオリジナルの拡張DLL内でCFormViewクラスから派生させたクラスです。 特に変わったことをしている訳ではなく、ほとんどウィザードがソースを吐いた状態のままです。 "COriginalView" をデフォルトの "CMyView" にするとエラーは出ません。 また、"COriginalView" もコントロールを1ヶ置いてビューフォームとクラスを作成し、 AFX_EXT_CLASS でエクスポートして参照できています。 また、MDI側でフォームとクラスを作成しそれを使用した場合はエラーは出ません。 ドキュメント/ビューアーキテクチャの理解が足りない為起きている問題だと思います。 宜しくお願い致します。 --- 詳細 ------------------------------------------------ CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME,   RUNTIME_CLASS(CMyDoc),   RUNTIME_CLASS(CChildFrame),   RUNTIME_CLASS(CDllView)); ←これ実行時に Assert が出る AddDocTemplate(pDocTemplate); ---------------------------------------------------------

  • C++/CLIとMFC

    よろしくお願いします。 環境はVisual C++ 2005です。 ご存知の方がいらっしゃいましたらご教授ください。 一つのプロジェクトで作成した親Formに対して、 もう一つのプロジェクトで作成した子ウィンドウをプラグインさせ、MDIを作ろうとしているのですが [CLR]->[Windowsフォームアプリケーション]で作成したプロジェクトのFormに対して MFCで作成した子ウィンドウをプラグインさせることは可能なのでしょうか? C++/CLIでMDIを作る時は MDIの親となるFormのIsMdiContainerプロパティをtrueに設定し、 MDIの子となるFormのMdiParentプロパティをMDIの親Formの インスタンスに設定する必要があると思うのですが、 子の部分をMFCを使って作成した場合どのようにすれば 親子関係が作れるのかわからず質問させていただきました。 よろしくお願いします。

  • ウインドウのビューをリストビューにするには?(VC++6.0)

    VC++6.0 MFCにて MFC AppWizardにてプロジェクトを作成します。 SDIを選択し、後はデフォルトのままです。 そうやって作ったベースとなるコードを実行すると、 普通にウインドウが開きます。(当然か) そのウインドウのビューをリストビューにしたいのですが、 どこにどのようなコードを書けば良いのでしょうか?

  • 【MFC】sleep関数を用いたモーダルダイアログを閉じる処理の実装方法

    開発環境はVC++2005のMFCです。 Ctest dlg; dlg.DoModal(); にて呼出したダイアログを、sleep関数で一定の時間経過後に 自動で閉じる処理を実装したいのですが、どのように実装すれば良いでしょうか? またsleep関数でなく、他の時間を計る関数を用いたものでも良いので、 もしご存知の方おられましたら、ご教授お願い致します。

  • Windowsソケット機能の追加

    VC++6.0でプロジェクトを作成しています。MFC AppWizardで新規にプロジェクトを作るとき、アプリケーションへ組み込む機能でWindowsソケットを入れるのを忘れました。かなりプログラミングが進んでしまったのですが、プロジェクトを最初から作り直さず、今からWindowsソケットの機能を追加することは出来ますでしょうか?

  • VC++で作成したアプリ起動時のウィンドウサイズについて

    VC++初心者の者です。初投稿です。宜しくお願いします。 ※何を言っているのか解らない、情報が足りないって場合は聞いてください。超初心者ですので宜しくお願いします。。。 VC++で作成したMDIアプリを起動させた時、 又は新しくウィンドウを開いた時の デフォルトウィンドウサイズを指定する方法を どなたか教えていただけませんでしょうか? また、開いたウィンドウをリサイズできないように するにはどうしたら良いでしょうか? (ViewクラスはCFormViewを基底としています。) 宜しくお願い致します。

  • メニューを追加した時の実装を書くクラスは?

    環境 WIN98 VC++6.0 MFC にて メニューにコマンドを追加しクラスウィザードにて、コマンドの実装をするときに、CxxxMainFrmクラスとCxxxViewクラスのどちらにも実装出来ます。 どうしてどちらにも実装できるのですか? また、それぞれの使い分けはどうなっているのですか?

  • 【MFC】Version情報の取得

    MFCでアプリケーションを作成しています。 リソースビュー⇒「Version」⇒「VS_VERSION_INFO」の、 キー「FILEVERSION」の値を取得するにはどのように実装すれば良いのでしょうか? ご存知の方おられましたら、ご教授お願い致します。 開発環境はVC++2005です。

専門家に質問してみよう