スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net (467レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

5: 2016/08/18(木)17:06 ID:9gCEAov3(1/4) AAS
いや言っている意味がよくわからんがこういう感じのじゃダメなの?
やりたいことがわからんからコールバック呼ばれたら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); }
};
7
(1): 2016/08/18(木)17:28 ID:9gCEAov3(2/4) AAS
あちゃー
クラス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); }
};
8
(1): 2016/08/18(木)17:37 ID:9gCEAov3(3/4) AAS
別にstd::mapである必要はないし独自のリストを作っても良い

TimerProc() と TimerCall() は基底クラスだけ書く
TimerCallbackEvent()は仮想関数で 派生クラス毎の機能 はここに書く

流れとしてはそれぞれのクラスでTimerCall() を呼び出すとタイマIDとインスタンスをセットで登録
時間経過でTimerProc()が呼ばれるけどその際に登録したタイマIDからインスタンスをゲット
あとはインスタンスの仮想関数 TimerCallbackEvent() を呼び出す
9
(1): 2016/08/18(木)18:02 ID:9gCEAov3(4/4) AAS
あと横着なやり方だと
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); }
};
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.015s