質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

8423閲覧

MFCでダイアログを閉じる前に処理を行いたい

kamingout

総合スコア44

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/04/22 01:34

MFCで開発中のアプリケーションにて、ダイアログ終了時にダイアログ画面を削除する前に処理を入れたいです。
右上の×ボタンによるCLoseやESCキーによるCLoseなどいろいろな方法でダイアログを閉じることが考えられますが、
全ての動作で共通して画面棄却前にある処理を入れたいです。

この場合、どのような実装ができるでしょうか?

お手数おかけしますが、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

CDialogCWndからの派生クラスなので、WM_CLOSEメッセージのCWnd::OnClose()か、更に後のWM_DESTROYメッセージをハンドリングするCWnd::OnDestroy()を使えば良いと思います。ウィンドウハンドルの有効性に差があるはずなので、適当な方を使ってください。

CWndクラス パブリックメソッド - MicrosoftDocs
クラスウィザードで作れるはずです。

投稿2020/04/22 01:48

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamingout

2020/04/22 01:54

早速のご回答ありがとうございます。 OnDestroyで試してみたのですが、この処理に入る前に既に表示中のダイアログ画面が表示されなくなってしまいます。 実現したいこととしては、 ①ダイアログ画面棄却前にダイアログ画面が表示された状態でWaitCursorを出す ②ダイアログ画面が表示された状態で終了処理Aを行う ③終了処理Aが終わった時点でWaitCursorを解除してダイアログ画面を閉じる という流れになります。 良い方法はございませんか?
dodox86

2020/04/22 01:56

OnDestroyは表示を閉じた後だったと思うので、OnCloseの方で要望の動きを満たせませんか。
dodox86

2020/04/22 01:58

OnClose(), OnDestroy()の中でTRACE()マクロでデバッグ端末に何かしら出力して、Window(WM_)メッセージや処理の流れを確認してみると良いです。
fana

2020/04/22 01:59

CDialogのOnClose()は閉じ方次第で呼ばれないので注意が必要かと.
dodox86

2020/04/22 02:01

fanaさん、フォローありがとうございます。そうでしたね。その点、失念しておりました。私もいつもWM_DESTROYでハンドリングしていました。(ダイアログボックスの画面は必要なかったので)
dodox86

2020/04/22 02:08

>質問者kamingoutさん。 OnClose(WM_CLOSE)が呼ばれないケースでそのケースが何らかのイベント(何らかのWM_メッセージ)を伴うものであれば、そのメッセージをON_MESSAGE()でハンドリングしてその中で処理するか、カスタムWM_メッセージを自分にSendMessage()して終了処理を集中させるとか考えられます。終了時のメッセージが錯綜するので、少し危険かもしれませんし、そこまでするならコントロールメニューのCLOSEボタンやESCキーの終了の個別対応と労力があまり変わりませんが。
fana

2020/04/22 02:10 編集

右上の×,ESC, Enter, Alt+F4, DestroyWindow()をコール, EndDialog()をコール …(他に何があるかな?) と,まぁ,ダイアログが閉じる理由は色々あって,それによって DialogのOnOK,OnCancel,OnClose,OnDestroy,DestroyWindow等の 呼ばれる/呼ばれない が違うんですよね.
SHOMI

2020/04/22 02:48

ESCキーでダイアログが閉じられる件については、WM_KEYDOWNでWPARAMがVK_ESCAPEの際にベースクラスに渡さずFALSEを返せばはじけますね。
kamingout

2020/04/22 03:59

みなさま ご意見ありがとうございます。 ダイアログを閉じる処理がいくつもあるのため、特定の関数から実現したような処理を行うことはできないのですね。 実装方法自体は理解できましたので、どのように実現するかは検討したうえで利用させていただこうと思います。 ありがとうございました。
guest

0

OnDestroy()でどうでしょうか


ダイアログが閉じられるのが嫌ならば,
WindowProcをオーバーライドして WM_CLOSE とか WM_DESTROY を捕まえて,特殊対応すればどうでしょうか.

間違い.WM_CLOSEならこれでOKですが,WM_DESTROYは来た時点で手遅れです.
WM_CLOSEが来ずに閉じるパターンに関してどうすれば全対応できるのか…? はわかりません.
要因となる操作や現象を1個ずつ潰していくしかないのかもしれません.

投稿2020/04/22 01:46

編集2020/04/22 02:27
fana

総合スコア11673

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問