MFC
モーダルダイアログでアイドル処理を行う


HomeProgramming TipsMFC Tips[MFC-003]

WM_KICKIDLE を使えば簡単に実現できます。
但し、メッセージハンドラの処理を手書きする必要があります。

OnIdle() と同等のことが出来ますが、ここで重い処理をしてはいけません。
重い処理を連続で行うと OS 全体に悪影響を及ぼす可能性があります。
できれば、OnKickIdle() が呼ばれる毎に処理をするのではなく、 最低でも 10ms 程度の処理スキップ時間を設けてください。

■ CMyDlg.h

    afx_msg LRESULT OnKickIdle(WPARAM, LPARAM); // ← 追加


■ CMyDlg.cpp
#include <mmsystem.h>
#include <afxpriv.h>    // ← 追加
#pragma comment(lib, "winmm.lib")

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_MESSAGE(WM_KICKIDLE, OnKickIdle)     // ← 追加
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

LRESULT CMyDlg::OnKickIdle(WPARAM wParam, LPARAM lParam)
{
    // アイドリング処理
    static DWORD dwNext = ::timeGetTime() + 10;

    DWORD dwNow = ::timeGetTime();
    if (dwNow > dwNext){
        dwNext = dwNow + 10;

        // ここで 10ms 毎に実行するプログラムを記述する

    } else {
        ::Sleep(1);
    }
    return TRUE;
}




 Copyright 2005 VALGUS. All Rights Reserved.