タイマーについて質問があります。
モーダルダイアログで子ダイアログでタイマーを使用しようと思っているのですが、
上手くいきません。
ちなみに親ダイアログでもタイマーを使用しているのですが、そちらは上手く動作して
います。子ダイアログのタイマーも親ダイアログでのタイマーを真似して実装していま
す。
子ダイアログではタイマーを使用できないのでしょうか?
親ダイアログでのタイマー
void CMainDlg::OnTimer(UINT nIDEvent)
{
case TIMER_MODE_MODE1:
::KillTimer(GetSafeHwnd(),TIMER_MODE_MODE1);
-----------------略----------
break;
}
}
void CMainDlg::OnBnClickedButton1()
{
::SetTimer(GetSafeHwnd(),TIMER_MODE_MODE1,50,NULL);
-----------------略-------
}
子ダイアログでのタイマー
void CSubDlg::OnTimer(UINT nIDEvent)
{
case TIMER_MODE_MODE2:
::KillTimer(GetSafeHwnd(),TIMER_MODE_MODE2);
-----------------略----------
break;
}
}
void CSubDlg::OnBnClickedButton2()
{
::SetTimer(GetSafeHwnd(),TIMER_MODE_MODE2,50,NULL);
-----------------略-------
}
これだとタイマー設定が出来ていません。
やはり子ダイアログのSetTimerの第一引数のウィンドウのハンドル指定がいけないので
しょうか?親のハンドルのままではダメですか?
もしダメなら子ダイアログのウィンドウのハンドルの取得はどうすればいいのですか?
宜しくお願いします。
SetTimerもKillTimerもなんでメンバ関数じゃないんですか?
グローバルなAPI関数を使うとしても、GetSafeHwnd()は
親なら親の、子なら子のダイアログのm_hWndハンドルが取れていると
思うので、原因は別のところじゃないかと思いますが。
とりあえず、デバッグで追いかけてみましょう。
通りすがりさん
有難うございます。
デバックで一つずつブレークポイントで見ていったのですが、
::SetTimerは通るんですが、肝心の
case TIMER_MODE_MODE2:
::KillTimer(GetSafeHwnd(),TIMER_MODE_MODE2);
方の処理に飛ばないんです。
なにが原因として考えられるでしょうか?
ちなみにSetTimerもKillTimerも
CWndクラスで使用しています。
windows.hもインクルードしています。
>void CSubDlg::OnTimer(UINT nIDEvent)
>{
>略
>}
の部分をmainDlgから関数をコピペして
BEGIN_MESSAGE_MAP(CSubDlg, CDialog)
ON_WM_TIMER() <----------------ソースの上の方のこれ
END_MESSAGE_MAP()
の部分が抜けてしまっているとかありませんか?
VS2005で試してみたけど問題なく動きました。
のさんが書かれているようなところが
通りすがりさんが言われている別の所に原因がと言う部分だと思います。
OnTimerの関数内に来るのにcaseの部分に来ないのか、
端からOnTimerの中に入ってこないのかで話は全く違いますよ。
あと、省略している部分に原因があったりしませんか?
多分略しているのだと思いますけれど、switch文の無いcaseでやっている
わけではないですよね。
海人さんはタイム男さんですか?
同一スレでハンドルネームを変えると混乱するので
やめて頂けないでしょうか?
それと、海人さんは↓の問題はどうなったのでしょうか?
問題が解決したのであれば、できれば結果を書いて頂けないでしょうか?
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200808/08080043.txt
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200807/08070044.txt