• ベストアンサー

起動後直に実行するコードはどこに?

初心者です。 VC++6.0でAppWizardを使って単純なダイアログベースのスケルトンが出来ます。 通常はこの中にボタンなどを配置しイベント処理するのですが イベントではなくプログラムが起動しフォームが表示されたら直ちに実行させる様なコードはどこの位置から書き込めば良いのでしょうか。 たとえばタイマーをスタートさせデジタル時計を1秒毎に連続で表示させる様な事をしたいのですが今一書き込む位置がわかりません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.5

> 今回やりたいことは初期化だけではなく連続しての処理を行いたいのですがこの場所に書いて良いのでしょうか。 こういうのはイベント駆動のフレームワークとは相性が悪いですよ。 本当に連続して処理を行うなら自前でイベントループを回すかサブスレッドを起動して処理するかしないとユーザイベントを受け取れなくなりますから。 処理を初期化部分と定期的に呼ばれるハンドラ部分とに分割してやる必要がありますね。時計の場合だとタイマーのスタート(SetTimer)はOnInitDialogで、表示更新はOnTimerで記述すれば良いかと思います。

その他の回答 (4)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

>今回やりたいことは初期化だけではなく連続しての処理を >行いたいのですがこの場所に書いて良いのでしょうか つまり、メインループの位置がわからないということでしょうか? 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); } 試してないので、参考程度に。。。

yzm250
質問者

お礼

>つまり、メインループの位置がわからないということでしょうか? ということですかね。イベント処理以外に一定サイクルでの割り込み処理 が必要でした。 >OnIdle()とかでいいのでは?? 初めて知りましたありがとうございます。 詳しく調べて見ます。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

内部的にはやってるようですが、 OnInitDialogもメッセージマップは存在しないのですね。 >フォームが表示されたら直ちに実行 このタイミングだとInitInstanceもOnInitDialogもダメかも しれません。InitInstanceが呼ばれるのは、プログラムの起動時と 複製時。OnInitDialogが呼ばれるのはCreate中の表示直前なので。 #視認できるかはわかりませんが:-p

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

>たとえばタイマーをスタートさせデジタル時計を1秒毎に連続で表示させる様な事をしたいのですが今一書き込む位置がわかりません。 この目的であれば、ダイアログのOnIniteDialog()あたりが適当でしょう。

yzm250
質問者

お礼

titokaniさんありがとうございます。 質問の様な何もないプログラムを実行しイニシャライズ→フォームの表示 が終了しアイドリング状態となりWindows側に制御が移るタイミングって どこなのでしょうか? OnIniteDialog()部分の return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。・・・とあるところがなんか怪しそうですが・・・・ デバックで追いかけて行ったらフォームが表示されたとたんに見失いました。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

AppWizardならば、自動生成されたコードに、 ここに何を書いてくださいというような、 日本語のコメントがキチンと付いていると思いますが。。。? それとも、コメントをつけずに生成したのでしょうか。。。? 日本語のコメントが読め無いとかはないですよね? >イベントではなくプログラムが起動しフォームが >表示されたら直ちに実行させる ダイアログのメッセージマップを使わないなら、 アプリケーション生成時のInitInstanceの中で良いのでは?

yzm250
質問者

お礼

aris-wizさんありがとうございす。 一応日本人ですので日本語はとりあえず読めます(^^;) 変数の宣言とかイベントに対するコードの記入はコメントを見ますと 何とかわかるのですが昔ながらの?たとえばキー入力をポーリングで チェックし何かをさせたい・・なんて事になるとWindows用に生成されたコードがたくさんあり、 どこに入れていいのかなかなか理解出来ません(ゲームでKey入力に対して処理をさせるような) ところでInitInstanceのところを見ますと// 標準的な初期化処理・・・と 書いてあります。 今回やりたいことは初期化だけではなく連続しての処理を行いたいのですがこの場所に書いて良いのでしょうか。 よろしくお願いします。

関連するQ&A

  • スレッドの作成と起動

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <質問> ボタンを押すとOnButton()に入ります。 OnButton()内でワーカースレッドを起動させたいのですが、 どのようにコーディングするのでしょうか? スレッドの作成方法も分かりません・・。 宜しければご指摘お願い致します。

  • スケルトンの中のどこでウィンドウが生成されているのか?

    VC++、MFCです。 MFC AppWizardでSDIベースのスケルトンを生成した時点で、既にウィンドウが作られるコードがソース内に存在するはずなのですが、単純にCreate関数を探しても見当たりません。 一体どこでウィンドウが作るコードはどこにあるのでしょうか?

  • 現在時刻をデジタル時刻で表示したい。

    MFC(VC++6.0)のダイアログベースでプログラムを製作していますが 現在、ビットマップ上にデジタル時計の絵があり、時間も固定になっています。 それを現在の時刻をデジタル時刻で表示できるようにしろと言われたのですが、本当にそんなことができるかご存知の方教えてください。

  • ラジオボタンのメンバ変数

    VC++6.0でMFC AppWizard(exe)というプロジェクト、ダイアログベースでプログラミングしています。 ダイアログにラジオボタンを三つ配置し、Radio1を右クリック→プロパティ→グループにチェックを入れました。 そして、IDC_RADIO1にメンバ変数m_Radio(int)を追加してコンパイルすると「問題が発生したため終了します」というダイアログが出ます・・。 メンバ変数を削除するとコンパイルは成功します。 何が間違いでこんなエラーが出るのでしょうか? どうかよろしくお願いします。

  • VB.NETでただの実行ファイルを作る方法

    VB.NETでプロジェクトを作成すると、イベント型?ダイアログベースのプログラムになってしまうのですが、ダイアログ(フォーム)を用いないプログラムにするにはどうすればよいのでしょうか? C言語でいうMain()から始まるプログラムにしたいのです。

  • VC++6.0のスケルトンコードをビルド&実行でエラー

    VC++6.0を使ってゲームを作ろうとしているのですが、少し困った問題が起きました。 「新規作成」で「プロジェクト」→「MFC AppWizard (exe)」を選んで、 ステップ1で「SDI」を選択、「ドキュメント/ビューアーキテクチャのサポート」をOFFにして、 ステップ3で「ドッキングツールバー」と「初期ステータスバー」をOFFにします。 そしてできあがったスケルトンをそのままビルドして実行すると、下記メッセージが表示され終了します。 Debug Assertion Failed! Program: ○○○ File: winocc.cpp Line:331 For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. 上記はDebug版の場合ですが、Release版の場合はCliant領域が更新されないだけで一応動いてはいます。 スケルトンコード内のAssert(っぽい)箇所をコメントアウトしましたが結果は同じでした。 どなたか原因をご存じないでしょうか?もしかして、VC++6.0のバグ? 尚、「ドキュメント/ビューアーキテクチャのサポート」、「ドッキングツールバー」、 「初期ステータスバー」のどれか1つでもONにすれば何も起きません。

  • ダイアログ、ボタンについて

    VC++でプログラミングしています。 MFC AppWizard(exe) でダイアログベースで造っています。 以下の方法を教えてください。 ・EXE起動時、ダイアログのサイズを変更したい。 起動時に画面サイズをチェックして、画面いっぱいの大きさにしたいため。 ・EXE起動後、ボタンに表示している文字列を変更したい。 識者の方、ご教授願います。

  • BOOLの初期値は?

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <質問> BOOL bl; と宣言した後、必ず bl = FALSE; と初期値を入れているのですが、元々FALSEかTRUEのどちらか、 決まった初期値が入っているのでしょうか?

  • ダイアログを自分の好きな位置に表示したい

    VCで簡単なプログラムを造っています。 ダイアログベースです。 EXE を実行した時に表示されるダイアログを、自分の指定した位置に 表示させる方法はあるでしょうか。 また、そのダイアログから DoModal関数で別のダイアログを表示する場合、 同様に、自分の指定した位置に表示させる方法はあるでしょうか。 デフォルトのままだと、1つ目のダイアログは画面の中央に、 DoModal関数で表示させたダイアログは、1つ目のダイアログの上に なります。

  • wsprintfで浮動小数を扱うには?

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <質問> wsprintf(a,"%f",b); MessageBox(a); で実行すると"f"が出力されました。 浮動小数を出力するにはどうしたら良いのでしょうか? よろしくお願いします。

専門家に質問してみよう