- ベストアンサー
起動後直に実行するコードはどこに?
初心者です。 VC++6.0でAppWizardを使って単純なダイアログベースのスケルトンが出来ます。 通常はこの中にボタンなどを配置しイベント処理するのですが イベントではなくプログラムが起動しフォームが表示されたら直ちに実行させる様なコードはどこの位置から書き込めば良いのでしょうか。 たとえばタイマーをスタートさせデジタル時計を1秒毎に連続で表示させる様な事をしたいのですが今一書き込む位置がわかりません。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> 今回やりたいことは初期化だけではなく連続しての処理を行いたいのですがこの場所に書いて良いのでしょうか。 こういうのはイベント駆動のフレームワークとは相性が悪いですよ。 本当に連続して処理を行うなら自前でイベントループを回すかサブスレッドを起動して処理するかしないとユーザイベントを受け取れなくなりますから。 処理を初期化部分と定期的に呼ばれるハンドラ部分とに分割してやる必要がありますね。時計の場合だとタイマーのスタート(SetTimer)はOnInitDialogで、表示更新はOnTimerで記述すれば良いかと思います。
その他の回答 (4)
- aris-wiz
- ベストアンサー率38% (96/252)
>今回やりたいことは初期化だけではなく連続しての処理を >行いたいのですがこの場所に書いて良いのでしょうか つまり、メインループの位置がわからないということでしょうか? OnIdle()とかでいいのでは?? ダイアログベースの場合はOnIdle()は勝手に呼ばれないみたいなので WindowProcを実装しておいて、OnIdleを呼べばいいような。 #include "AFXPRIV.H" LRESULT xxxDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_KICKIDLE) { return AfxGetApp()->OnIdle(lParam); } return CDialog::WindowProc(message, wParam, lParam); } 試してないので、参考程度に。。。
- aris-wiz
- ベストアンサー率38% (96/252)
内部的にはやってるようですが、 OnInitDialogもメッセージマップは存在しないのですね。 >フォームが表示されたら直ちに実行 このタイミングだとInitInstanceもOnInitDialogもダメかも しれません。InitInstanceが呼ばれるのは、プログラムの起動時と 複製時。OnInitDialogが呼ばれるのはCreate中の表示直前なので。 #視認できるかはわかりませんが:-p
- titokani
- ベストアンサー率19% (341/1726)
>たとえばタイマーをスタートさせデジタル時計を1秒毎に連続で表示させる様な事をしたいのですが今一書き込む位置がわかりません。 この目的であれば、ダイアログのOnIniteDialog()あたりが適当でしょう。
お礼
titokaniさんありがとうございます。 質問の様な何もないプログラムを実行しイニシャライズ→フォームの表示 が終了しアイドリング状態となりWindows側に制御が移るタイミングって どこなのでしょうか? OnIniteDialog()部分の return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。・・・とあるところがなんか怪しそうですが・・・・ デバックで追いかけて行ったらフォームが表示されたとたんに見失いました。
- aris-wiz
- ベストアンサー率38% (96/252)
AppWizardならば、自動生成されたコードに、 ここに何を書いてくださいというような、 日本語のコメントがキチンと付いていると思いますが。。。? それとも、コメントをつけずに生成したのでしょうか。。。? 日本語のコメントが読め無いとかはないですよね? >イベントではなくプログラムが起動しフォームが >表示されたら直ちに実行させる ダイアログのメッセージマップを使わないなら、 アプリケーション生成時のInitInstanceの中で良いのでは?
お礼
aris-wizさんありがとうございす。 一応日本人ですので日本語はとりあえず読めます(^^;) 変数の宣言とかイベントに対するコードの記入はコメントを見ますと 何とかわかるのですが昔ながらの?たとえばキー入力をポーリングで チェックし何かをさせたい・・なんて事になるとWindows用に生成されたコードがたくさんあり、 どこに入れていいのかなかなか理解出来ません(ゲームでKey入力に対して処理をさせるような) ところでInitInstanceのところを見ますと// 標準的な初期化処理・・・と 書いてあります。 今回やりたいことは初期化だけではなく連続しての処理を行いたいのですがこの場所に書いて良いのでしょうか。 よろしくお願いします。
お礼
>つまり、メインループの位置がわからないということでしょうか? ということですかね。イベント処理以外に一定サイクルでの割り込み処理 が必要でした。 >OnIdle()とかでいいのでは?? 初めて知りましたありがとうございます。 詳しく調べて見ます。