AppWizardで作成したMFCアプリケーションで APIのタイマー(マルチメディアタイマー)を使う例を示します。
MainFrm.h:
class CMainFrame : public CFrameWnd
{
〜
public:
static void CALLBACK TimerProc(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
static UINT m_uiTimerID;
〜
};
MainFrm.cpp:
UINT CMainFrame::m_uiTimerID=0;
void CALLBACK CMainFrame::TimerProc(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
if(uTimerID==m_uiTimerID){
((CMainFrame*)dwUser)->TimerMain(); //メイン処理を行う
}
}
CMainFrame::TimerMain()は自分で作って下さい。※VC++2005では、TimerProcの引数の型がDWORDでなくDWORD_PTRに変わっています。[2007-10-13]
まぁVC++2005でMFCは使わないでしょうが…。
timer.cpp:
〜 #include "stdafx.h" #include "MMsystem.h" 〜 BOOL CTimerApp::InitInstance() { 〜 ((CMainFrame*)m_pMainWnd)->m_uiTimerID=::timeSetEvent(50,30,((CMainFrame*)m_pMainWnd)->TimerProc,(DWORD)m_pMainWnd,TIME_PERIODIC); return TRUE; }
MainFrame.h:
class CMainFrame : public CFrameWnd
{
〜
// 生成されたメッセージ マップ関数
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
MainFrame.cpp:
〜 #include "stdafx.h" #include "MMsystem.h" 〜 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() 〜 void CMainFrame::OnDestroy() { ::timeKillEvent(m_uiTimerID); CFrameWnd::OnDestroy(); }
VC++4.0の場合、以下の方法で設定できます。
[ビルド]→[設定]で「プロジェクト設定」ダイアログが出ます。
「リンク」タブの中の「オブジェクト/ライブラリモジュール」に、WinMM.libを追加します。
ただし裏技(?)として、ソースファイルに次のように書くことで代用できます。
MainFrame.cpp:
#include "MMsystem.h"
#pragma comment(lib,"WinMM.lib")
例: timeSetEvent(50,30,((CMainFrame*)m_pMainWnd)->TimerProc,(DWORD)m_pMainWnd,TIME_PERIODIC);
なお、この割込みは別スレッドで行われるので要注意です。[2006-04-22]