• ベストアンサー

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

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

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

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

Sleep()による実装はUIとしてはお勧めできません。反応が鈍くなるからです。 No.1さんのようにタイマーで代替するわけですが、ダイアログ側に実装したほうが、 使い勝手が良くなると思います。 (面倒なことはクラスで隠ぺいしちゃいましょ。それがC++流) // ダイアログ用ヘッダ // CTestDialog ダイアログ class CTestDialog : public CDialog { DECLARE_DYNAMIC(CTestDialog) public: CTestDialog(CWnd* pParent = NULL); // 標準コンストラクタ virtual ~CTestDialog(); // ダイアログ データ enum { IDD = IDD_TEST }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート // タイマー用識別子(Windowsによって返された値) UINT m_TimerID; DECLARE_MESSAGE_MAP() public: virtual BOOL OnInitDialog(); afx_msg void OnTimer(UINT_PTR nIDEvent); }; // ダイアログ 実装(cpp) // TestDialog.cpp : 実装ファイル // #include "stdafx.h" #include "test.h" #include "TestDialog.h" // CTestDialog ダイアログ IMPLEMENT_DYNAMIC(CTestDialog, CDialog) CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/) : CDialog(CTestDialog::IDD, pParent) { } CTestDialog::~CTestDialog() { } void CTestDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CTestDialog, CDialog) ON_WM_TIMER() END_MESSAGE_MAP() // CTestDialog メッセージ ハンドラ BOOL CTestDialog::OnInitDialog() { CDialog::OnInitDialog(); // タイマーを設定します。 // タイマーIDの希望値を1とします // ここでは5秒後に通知させるものとします。 // ダイアログを表示させておきたい時間に合わせて調整してください。 m_TimerID = SetTimer(1, 5*1000, NULL); return TRUE; // return TRUE unless you set the focus to a control // 例外 : OCX プロパティ ページは必ず FALSE を返します。 } void CTestDialog::OnTimer(UINT_PTR nIDEvent) { // タイマーメッセージ応答関数です // 本ダイアログではタイマーを一つしか使っていないので // IDの確認はなくても動作します。 // 複数のタイマーを使用できます。 // どのタイマーかはnIDEventで区別します。 if (nIDEvent == m_TimerID) { // ダイアログを消します // EndDialog()のパラメータがそのままDoModal()の戻り値となります。 // 本プログラムではDoModal()の戻り値を利用していないので // なんでもかまいません。 // 一応、OKを押した場合と区別可能なようにIDCANCELとしました。 // 無論IDOKでも支障ありません。 EndDialog(IDCANCEL); } CDialog::OnTimer(nIDEvent); }

zigen8513
質問者

お礼

ご教授頂いた通りに実装したところ、正常動作させることが出来ました! #1さん、#2さん、ありがとうございました!

その他の回答 (1)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

Ctestクラス側でSetTimer()関数を使って一定時間後にイベント発生させて閉じるのが良いと思います。 単にsleepだと操作不能になるのでWinアプリが一番やってはいけない事で、その上DoModal()で開いたものを外部から閉じるのも面倒と言うか怪しい操作です。スレッドでsleepという手も有りますが、そこまでやる必要性もなさそうです。

関連するQ&A