画面メニューの設定はリソースViewからMainフォルダ内IDR_MAINFRAMEをクリックすると画面デザインがタブ表示されます。
プロパティにある表示の文字を操作する「終了」確認といった感じに設定し、右クリックで「イベントハンドラ」の追加、つまりマウスでクリックしたらどんな動作をするかのプログラム記述エリア(イベントハンドラ)を作成します。
そのイベントハンドラが作成される場所、はウイザードに指定しますが、View.Cppに設けるのがいいでしょう。
その終了内容は以下のような感じ…
void CM182View::OnAppExit()
{
// TODO: ここにコマンド ハンドラ コードを追加します。
//
endflag = false;//今から終わりますよ…
//もう本当に終了していいですか?
CClientDC mydc(this); //P423
CString ss;
int ret;
ret = AfxMessageBox("本当に終了していい?",
MB_OKCANCEL|MB_ICONINFORMATION);
switch (ret){
case IDCANCEL: //終了キャンセル…終了しない
;//AfxMessageBox("計測に戻ります");//
endflag=true;//戻しておく
return;
case IDOK://終了やぁ!
;//AfxMessageBox("今から終了します");
}//
AfxGetMainWnd() -> PostMessage(WM_CLOSE);
//デストロィをよぶ*
}
終了するのにも結構細かい記述がありますが、実はエンドレスループ的なプログラムの終了ロジックを実現させるのにもいろんな技術的な要素があるんです。
何故エンドレスプログラムにしなければならないかというと、PCが通電開始起動したら自動的にプログラムが起動し、計測を止めるときのみ、操作をする、そんな設計の終了部分のプログラムお見せしています。
ポストメッセージでデストロィをコールしてもメモリーリーク(プログラムゴミが残ったまま異常終了)とかがあって、意外とこの問題をクリアして正しく終了させる、というのはハードルが高いなぁ…と感じます。
開発プログラムのレジストリ…をコピーせずに違うPCで実行すると上手く動作しないことから、どうやらレジストリのスイッチにその秘訣があるようなんですが、詳細はまだわかりません。
endflgというグローバルなスイッチがありますが、実は、このスイッチ状態で他の非同期プログラムの停止処理を促す設計上は重要なパラメータなのです。…でないと正常終了できないまま取りこぼした…とシステムに怒られる(メモリーリーク)、そんな状態なんですね。マルチタスクを使いこなすのは高度な技が…要るワケだ…マニュアルにはこんなこと…全然書いてない…。(←だからメシの種は尽きぬ…というワケ?)
PR