- スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net
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); } };
| - スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net
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); } };
| - スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net
8 :デフォルトの名無しさん[sage]:2016/08/18(木) 17:37:35.78 ID:9gCEAov3 - 別にstd::mapである必要はないし独自のリストを作っても良い
TimerProc() と TimerCall() は基底クラスだけ書く TimerCallbackEvent()は仮想関数で 派生クラス毎の機能 はここに書く 流れとしてはそれぞれのクラスでTimerCall() を呼び出すとタイマIDとインスタンスをセットで登録 時間経過でTimerProc()が呼ばれるけどその際に登録したタイマIDからインスタンスをゲット あとはインスタンスの仮想関数 TimerCallbackEvent() を呼び出す
| - スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net
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); } };
|
|