アプリ版:「スタンプのみでお礼する」機能のリリースについて

タイマを使いたくてメッセージマップで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: '&' : 仮想関数のアドレスを取ろうとしました。
のエラーになってしまいます。

A 回答 (4件)

>publicでないメンバ変数にアクセスできないということがわかり、これでは都合がわるいのですが、


>そのような場合はNULL指定にしたらよいんでしょうか。

そうですね。NULLにしてWM_TIMERとして受け取るほうがいいです。
    • good
    • 0

>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);
}

注)上記ソースには全角スペース入ってます。
    • good
    • 0

static void WINAPI MyFunc(HWND, UINT, UINT, DWORD);


て感じならクラスのメンバ関数でも指定OKです。

関数アドレスとは、関数の名前の部分です。(&は不要)
    • good
    • 0

http://www.microsoft.com/japan/msdn/library/defa …

に書いてある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で検索してみてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/06/09 00:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!