スレを勃てるまでもないC/C++の質問はここで 25
[隔離病棟]
©2ch.net (467レス)
スレを勃てるまでもないC/C++の質問はここで 25
[隔離病棟]
©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1471100645/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
5: デフォルトの名無しさん [sage] 2016/08/18(木) 17:06:15.70 ID:9gCEAov3 いや言っている意味がよくわからんがこういう感じのじゃダメなの? やりたいことがわからんからコールバック呼ばれたらKillTimerしちゃってるけど… それともTimerProcAやTimerProcBでclass A や class B のメンバにアクセスしたいという感じ? class A { private: static void TimerProcA(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime){ KillTimer(NULL,idEvent); } public: A(){} ~A(){} virtual void TimerCall(){ SetTimer(NULL,0,2000,(TIMERPROC)TimerProcA); } }; class B : public A private: static void TimerProcB(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime){ KillTimer(NULL,idEvent); } public: A(){} ~A(){} virtual void TimerCall(){ SetTimer(NULL,0,4000,(TIMERPROC)TimerProcB); } }; http://mevius.5ch.net/test/read.cgi/tech/1471100645/5
7: デフォルトの名無しさん [sage] 2016/08/18(木) 17:28:17.52 ID:9gCEAov3 あちゃー クラスBのコンストラクタとデストラクタは脳内で変換しておいてください それならstd::mapとか使って… 要点だけなのでエラー処理とかは無しだけど std::map<UINT, void*> mp; class A { public: A(){} ~A(){} static void TimerProc(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) { KillTimer(NULL,idEvent); A *a=(A*) mp[idEvent]; mp.erase(idEvent); a->TimerCallbackEvent(); } void TimerCall(){ UINT TimerId = SetTimer(NULL,0,2000,(TIMERPROC)TimerProc); mp[TimerId] = this; } virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer A","TEST",MB_OK); } }; class B : public A { public: B(){} ~B(){} virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer B","TEST",MB_OK); } }; http://mevius.5ch.net/test/read.cgi/tech/1471100645/7
8: デフォルトの名無しさん [sage] 2016/08/18(木) 17:37:35.78 ID:9gCEAov3 別にstd::mapである必要はないし独自のリストを作っても良い TimerProc() と TimerCall() は基底クラスだけ書く TimerCallbackEvent()は仮想関数で 派生クラス毎の機能 はここに書く 流れとしてはそれぞれのクラスでTimerCall() を呼び出すとタイマIDとインスタンスをセットで登録 時間経過でTimerProc()が呼ばれるけどその際に登録したタイマIDからインスタンスをゲット あとはインスタンスの仮想関数 TimerCallbackEvent() を呼び出す http://mevius.5ch.net/test/read.cgi/tech/1471100645/8
9: デフォルトの名無しさん [sage] 2016/08/18(木) 18:02:11.11 ID:9gCEAov3 あと横着なやり方だと SetTimerにウインドウハンドル指定すれば第二引数の UINT idTimer を有効に出来る この idTimer にクラスのインスタンスを指定 コールバック関数 TimerProc では 第三引数の UINT idEvent, をクラスの型にキャストしてインスタンスを取得 class A { public: A(){} ~A(){} static void TimerProc(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) { KillTimer(hwnd, idEvent); A *a=(A*) idEvent; a->TimerCallbackEvent(); } void TimerCall(HWND hWnd){ SetTimer(hWnd,(UINT)this,2000,(TIMERPROC)TimerProc); } virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer A","TEST",MB_OK); } }; class B : public A { public: B() : A(){} ~B(){} virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer B","TEST",MB_OK); } }; http://mevius.5ch.net/test/read.cgi/tech/1471100645/9
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.034s