プログラムの開始はどうしょう?

  

ここに紹介するプログラムは、WIN XP 2003/Windows 7 (32bits) - OS 環境でマイクロソフトのVisual Studio 2010 で作ったものです。
Windows XP/ Windows 7(32bits) での動作は確認済みですが…

 

Visual C++の入門書を手に取り さあプログラミング開始と意気込むのですが、参考書にあるサンプルなどは、ただのノッペラボーの画面でなーんかプログラムする意欲に欠けちゃいそうです。


いつも使っているアプリケーションを見直し色々と考えるのですが...少しはかっこうがいい物にしたいのですが、やはり最初にスタートの画面が出てくるやつが良いようです。 色々と参考書を開いてもあまり詳しくは載ってないようで。

VisualC++で標準に添えつけられているものでは、スプラッシュスクリーンと呼ぶ機能があります。
これを使うには、VisualC++のメニューより

 「プロジェクト」→「プロジェクトに追加」→「コンポーネントおよびコントロール」→「VisualC++Components」でこの機能を選択できます。

 

私は、あまのじゃくでこの画面は気にいらず通常のダイアログを作り、初期設定を同時に行えるようにしました。

 

しかし、このダイアログをプログラム起動と同時に表示するにはコーディングで多少頭をひねりました。 また「キャンセル」ボタンを押したときすぐに終了させるにも頭をいためました。


参考書などにある標準のダイアログを作成するのはあまり問題ないのですが、どこで表示させるのか、そしてこのダイアログで入力したデータをどのようにプログラムに反映させるのか少し頭を整理して考える必要があります。


これらの事を考慮して、ダイアログの作成とコーディングは以上のように設定しました。

試行錯誤してみましたが、AutoACDocクラスのOnNewDocument関数にコーディングすることで満足いく結果が得られました。

OnNewDocument関数は、プログラムの初期起動や起動中の新規作成などのとき呼ばれる関数です。


ここでStartDlg関数を呼べば、上の条件を満たした動作が期待できます。また、StartDlgでキャンセルボタンを押したときreturn FALSEを戻せば、直ちに終了します。

BOOL CAutoACDoc::OnNewDocument() {   // (SDI ドキュメントはこのドキュメントを再利用します。)

  // 計算で常に必要なデータのアレー  

m_ArrayAircon.RemoveAll( ); // 負荷計算データのリセット  

m_Result.RemoveAll();         // 動的負荷計算データのリセット  

m_ArrayList.RemoveAll();   CStartDlg dlg;  // スタートダイアログオブジェクト作成  

 

   if( dlg.DoModal() == IDOK ) {

       // スタートダイアログより取り込むデータ     

   m_szPjname = dlg.m_strProject;

      m_szPerform = dlg.m_strPerform;

      m_it = dlg.m_it; // Country Data の読み込み

      m_it.SetOaRh( atof(dlg.m_strRh ));   }  

   else{     return FALSE;  // 直ちに終了する

     }

  UpdateAllViews( NULL );

 

ドキュメントクラスのOnNewDocument関数は、Viewオブジェクト作成前に呼ばれることを利用しています。このプログラミング手法は他のプログラムでも使えそうです。

 

スタートダイアログより入力したい項目

計算の基本データとなる国情報で以下の項目が含まれています。
  • 計算地点の緯度・経度

  • 外気設計温湿度

  • 大気透過率情報

  • 時差

確認のため、ダイアログに国情報のうち、設計温湿度を表示します。

計算プロジェクト名
国情報がない場合の新規作成や編集機能起動用のボタン
作成者名


国情報は、あらかじめ外部ファイルとして作っておき、プログラム起動と同時に読み込みスタートダイアログ上のコンボボックスリストに表示するようにしました。また追加・編集が出来るようにしておけば、ユーザーが自由にカスタマイズ出来ます。


設計外気湿度は、相対湿度(%)と湿球温度表示の両方を表示する方が使い勝手が良いのですが、外部ファイルに両方の値は必要ないので、プログラム内部で換算するようにしました。


スタートダイアログオブジェクト作成は、CStartDlgクラスに任せています。このクラス内で、外部ファイルの読み込みおよび、コンボボックスリストへの表示を行っています。 以下は、CStartDlgクラスコードの一部です。

 

///////////////////////////////////////////////////////////////////////////// //

CStartDlg メッセージ ハンドラ

BOOL CStartDlg::OnInitDialog()

 {   CDialog::OnInitDialog();

   TCHAR szPath[MAX_PATH] = _T("");

  CString szFile = _T("");

  BOOL bRet;

   GetModuleFileName( NULL, szPath, MAX_PATH ); // プログラムデレクトリを取得

 

   szFile = szPath;

   szFile.TrimRight( _T( "AutoAC.exe" ));

   szFile = szFile + _T( "Data" );

   _chdir( szFile ); // カレントデレクトリをデータデレクトリに設定

   CItems it;   bRet = it.CountryDataFileRead( "countrydata" ); // 外部ファイルの読み込み

   if( bRet == TRUE )

     GetCountryNames( &it );

   else{     CCountryDlg dlg;

     dlg.m_bCountry = FALSE;

     dlg.DoModal();

     it.CountryDataFileRead( "countrydata" );

     GetCountryNames( &it );

   }   return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります

   // 例外: OCX プロパティ ページの戻り値は FALSE となります }


以上がプログラム設計の基本的な流れです。

 


ページ先頭に戻る
最終更新日: 2020/02/04