• ベストアンサー

TimerProc コールバック関数を利用する方法

タイマを使いたくてメッセージマップでOnTimerを追加しましたが、 CWnd::SetTimerの第3パラメタに何を設定したらよいかわかりません。 lpfnTimer WM_TIMER メッセージを処理するためのアプリケーションが用意した、 TimerProc コールバック関数のアドレスを指定します。 このパラメータが NULL の場合は、WM_TIMER メッセージはアプリケーションの メッセージ キューに置かれ、CWnd オブジェクトによって処理されます。 とあり、NULL指定のサンプルはあるのですが、 「TimerProcコールバック関数のアドレスを指定する法」を試したいのです。 関数のアドレスというのが何をいっているのか理解できないのですが 試しに void CXXXCtrl::method1() { SetTimer(timerID, 10000, &OnTimer); } void CXXXCtrl::OnTimer(UINT nIDEvent) { // 処理 COleControl::OnTimer(nIDEvent); } としたところ error C2276: '&' : 仮想関数のアドレスを取ろうとしました。 のエラーになってしまいます。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>publicでないメンバ変数にアクセスできないということがわかり、これでは都合がわるいのですが、 >そのような場合はNULL指定にしたらよいんでしょうか。 そうですね。NULLにしてWM_TIMERとして受け取るほうがいいです。

その他の回答 (3)

回答No.4

>publicでないメンバ変数にアクセスできないということがわかり、これでは都合がわるいのですが、 次のようにすれば可能です。 ダイアログベースでちょっとサンプル作ってみました。 ボタン1を押下すると10秒ごとに TimerProc() がコールバックされ クラスのプライベート変数m_Count がインクリメントされるというものです。 TestProj というダイアログベースのプロジェクトを作成した場合 CTestProjApp CTestProjDlg というクラスが生成されます。 -----CTestProjApp.cpp----- // クラスのスタティック変数を初期化 // クラス外のどこかに記述 CTestProjDlg* CTestProjDlg::m_pThis = NULL; -----CTestProjDlg.h----- public:   static void CALLBACK TimerProc(HWND hwnd, UINT msg, UINT id, DWORD dw); private:   static CTestProjDlg* m_pThis;   int m_Count; -----CTestProjDlg.cpp----- void CTestProjDlg::TimerProc(HWND hwnd, UINT msg, UINT id, DWORD dw) {   // こうすればちゃんとプライベート変数にアクセスできます。   m_pThis->m_Count ++; } void CTestProjDlg::OnButton1() {   // ボタンを押した時に変数初期化&タイマスタート   m_pThis = this;   m_Count = 0;   this->SetTimer(1, 10000, TimerProc); } 注)上記ソースには全角スペース入ってます。

  • mamakari
  • ベストアンサー率34% (20/58)
回答No.2

static void WINAPI MyFunc(HWND, UINT, UINT, DWORD); て感じならクラスのメンバ関数でも指定OKです。 関数アドレスとは、関数の名前の部分です。(&は不要)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_mfc_cwnd.3a3a.settimer.asp に書いてあるTimerProcをそのまま宣言してください。 void CALLBACK EXPORT TimerProc( HWND hWnd, // handle of CWnd that called SetTimer UINT nMsg, // WM_TIMER UINT nIDEvent, // timer identification DWORD dwTime // system time ); これは、クラスのメンバ関数ではいけません。 #昔はstaticなメンバ何数でもOKだったんですけどね。 SetTimerの記述は void CXXXCtrl::method1() { SetTimer(timerID, 10000, TimerProc); } こうなります。 void CALLBACK EXPORT TimerProc(HWND hWnd,UINT nMsg,UINT nIDEvent,WORD dwTime,) { 処理 } みたいにTimerProcの中で処理を記述してください。 >関数のアドレスというのが何をいっているのか理解できないのですが 説明が大変なので、 C言語 関数ポインタ なんてキーワードでgoogleで検索してみてください。

yumi-mika
質問者

お礼

こんばんわ。以前は大変お世話になりました。 実は、この質問をだしたあと、 コールバック関数をつかうと publicでないメンバ変数にアクセスできないということがわかり、これでは都合がわるいのですが、 そのような場合はNULL指定にしたらよいんでしょうか。

関連するQ&A