
タイマを使いたくてメッセージマップで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: '&' : 仮想関数のアドレスを取ろうとしました。
のエラーになってしまいます。
No.3ベストアンサー
- 回答日時:
>publicでないメンバ変数にアクセスできないということがわかり、これでは都合がわるいのですが、
>そのような場合はNULL指定にしたらよいんでしょうか。
そうですね。NULLにしてWM_TIMERとして受け取るほうがいいです。
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);
}
注)上記ソースには全角スペース入ってます。
No.2
- 回答日時:
static void WINAPI MyFunc(HWND, UINT, UINT, DWORD);
て感じならクラスのメンバ関数でも指定OKです。
関数アドレスとは、関数の名前の部分です。(&は不要)
No.1
- 回答日時:
に書いてある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で検索してみてください。
こんばんわ。以前は大変お世話になりました。
実は、この質問をだしたあと、
コールバック関数をつかうと
publicでないメンバ変数にアクセスできないということがわかり、これでは都合がわるいのですが、
そのような場合はNULL指定にしたらよいんでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- Evernote Evernoteの操作 1 2023/07/24 17:17
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
4桁7セグでダイナミック点灯
-
組み込みマイコン
-
一定時間ごとにプログラムを起...
-
C#でトーンカーブの作成
-
多重定義が起きている?--lnk20...
-
カノニカルモードの設定について
-
(void)0 はどんな意味ですか
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
有効数字について 以前質問をし...
-
Fortran において変数の定義
-
memcpyについて
-
C++の課題が分かりません。
-
Unicode でのWin32アプリのプロ...
-
.NET 小数点以下の切り捨てにつ...
-
バイナリ形式の読み込み
-
c言語マップ探査ゲーム プログ...
-
2÷3などの余りについて
-
c++ 文字列を入力して、一文字...
-
C言語について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
多重定義が起きている?--lnk20...
-
const_castのつかいどころを教...
-
C++にてtemplateで受け取った任...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
gcc: incompatible pointer type
-
_beginthreadにて発生するコン...
-
C#でラジオボタンを設定に記録...
-
C#でテンキーの操作は可能でし...
-
C++別のオブジェクトからメンバ...
-
CTabCtrl:TABインデックス単位...
-
見た目は同じソースなのにエラ...
-
pictureboxの画像を削除するには?
-
【VC++6.0】イベントハンドラ関...
おすすめ情報