タイマーはどうやって使うの?
さあ、MCIの使い方もわかったところで(学習日誌No.3を参照)
演奏時間の表示はリアルタイムで更新しなければならないからタイマーの使い方を勉強しなければならない。
MS-DOSの時代だったら、無限ループを作って、その中で定期的に更新すればよかったが、Windowsではそうはいかない。
どこかは忘れたが、タイマーの使い方を書いてあるホームページを見つけた。
CWnd::SetTimer()を使って、タイマーを設定すると、Windowsのメッセージである、WM_TIMERが設定した時間ごとに送られてくるらしい。
そのホームページの情報では、CWndから派生されたクラスのコンストラクタでSetTimer()を呼び出すと書いてあった。
そこで、アプリケーションのビュークラスのコンストラクタに
SetTimer(1, 500, NULL);
と書いた。(ビュークラスの基本クラスは CView でその基本クラスは CWnd だから)
とりあえず、ビルドして実行した。が、アサートがかかってしまった。つまりバグがあるのだ。
それに、タイマーもちゃんと設定されていないらしい。デバッガを使って調べていくと、クラス CWnd の中のウインドウのハンドルを管理する変数がおかしいからアサートがかかったらしい。
つまり、コンストラクタが実行されているときは、まだウインドウは存在していないのだ。
タイマーはウインドウに対して設定されるから、正常に動かないのは無理もないことであった。
これに気がつくのに5日くらいかかった。
とにかく、Windowsのシステムをよくわかっていないし、MFCを使ったプログラミングもよくわからなかったから、試行錯誤だった。
まったく、フレームワークの構造がよくわからないと苦労する。
この問題は、WM_CREATEというメッセージを処理するCWndクラスのCWnd::OnCreate()という関数をオーバーライトし、その中でタイマーを設定することで解決した。
このメッセージは、ウインドウを作成する過程に発生するから、エラーにならなかったのである。
それにしても、僕が見たホームページの作者は本の通り書いたようだったが、いったい何処の本だそれは!
後記 (1997/09/09)
どうも、そのホームページの作者が参考にした本というのは、AppWizardが自動生成するドキュメント・ビュー・アーキテクチャのアプリケーションに関して説明してあったのではなかったのでは?と思うようになりました。
自分で、ウインドウを構築するプログラムを書いたとき、コンストラクタから、Createメンバ関数を呼び出して、クラスの構築とウインドウの構築を同時にしてしまうこともできるようです。(最近、やっとこのあたりがわかるようになった)
そのときは、Createメンバ関数を呼び出した後、SetTimerを呼び出せば、ちゃんとタイマーが設定できるようです。
よくわかっていないで、「いったい何処の本だ」と書いてしまいましたが、まずかったかな?もっともなんていう題名の本なのか知らないけど。
E-Mail:wbs03748@mail.wbs.ne.jp
質問・感想などのメールはこちらへ。
Copyright(C) 1997 Shingo Nakagawa / e-mail:wbs03748@mail.wbs.ne.jp