モードレス・ダイアログボックスを使用するには,一般的に Fortran Windows プロジェクト・タイプを使用します。Fortran Windows Project AppWizard は,モードレス・ダイアログボックスを使用するためのコーディングを追加する手助けを行います。
プロジェクトを作成し,Fortran Windows プロジェクトを指定すると,Fortran Windows Project AppWizard は 4 つのオプション (これらのオプションの説明を表示するには F1 キーを押します) を表示します。
ダイアログボックスがアプリケーションの基本ウィンドウであるダイアログのコーディング方法を知るには,以下の 1 つを選択します。
A simple Dialog Based Application
メニューバーを持たないダイアログボックスがアプリケーションの主ウィンドウであるアプリケーションを作成するには,「A simple Dialog Based Application」オプションを選択します。
これは,直ちにビルドでき,簡単なダイアログボックスを表示するように実行できるアプリケーション全体の骨組みを作成します。ダイアログボックスに対するコントロールを追加し,コントロールを操作し,ダイアログ・コールバックを処理するダイアログ・プロシージャ呼び出しを追加することができます。...\SAMPLES\DIALOG\ の多くのサンプル・プロジェクトは,「A simple Dialog Based Application」オプションを使って作成されたものです。
A simple Single Document Interface (SDI)
メニューバーを持つダイアログボックスがアプリケーションの主ウィンドウであるアプリケーションを作成するには,「A simple Single Document Interface (SDI)」オプションを選択します。
これは,直ちにビルドでき,実行できるアプリケーション全体の骨組みを作成します。主ウィンドウのクライアント領域にダイアログボックスを追加することができます (後述)。
「A simple Dialog Based Application」オプションを選択した時に生成されるテンプレートのようなコードには,以下のものがあります。
「A simple Dialog Based Application」オプションでプロジェクトを作成し,ビルドし,実行すると,以下のダイアログボックスが表示されます。
ダイアログ・ルーチン・インタフェースとデータ宣言に関連するコードは,以下のとおりです。この例では,プロジェクト名は FWin です。プロジェクト名は,データ宣言で使用されています。
use dflogm use FWin_dialogGlobals . . . include 'resource.fd' external FWin_dialogSub external FWin_dialogApply ! Variables type (T_MSG) mesg integer*4 ret logical*4 lret
FWin_dialogGlobals モジュールは,このプロジェクトで別のソース・ファイルで定義されています。FWin_dialogSub と FWin_dialogApply は,ダイアログボックスの異なったコントロールに対するコールバック・ルーチンとして主ソース・ファイルの後半で定義されているサブルーチンです。
ダイアログボックスを生成するコードは,以下のとおりです。
lret = DlgInit(IDD_FWIN_DIALOG_DIALOG, gdlg) if (lret == .FALSE.) goto 99999 lret = DlgSetSub(gdlg, IDD_FWIN_DIALOG_DIALOG, FWin_dialogSub) lret = DlgSetSub(gdlg, IDM_APPLY, FWin_dialogApply) lret = DlgModeless(gdlg, nCmdShow) if (lret == .FALSE.) goto 99999
この例の注意事項:
DlgInit はダイアログボックスを初期化します。
DlgSetSub の第 1 呼び出しは,「Exit」ボタンにコールバック・サブルーチンを割り当てます。これは,FWin_dialogSub サブルーチンをダイアログボックス識別子 IDD_FWIN_DIALOG_DIALOG (プロジェクト名は FWin_Dialog) に関連付けます。FWin_dialogSub ルーチンにはプログラムを終了させるコードが含まれています。
DlgSetSub の第 2 の呼び出しは,識別子 IDM_APPLY を持つ「Apply」ボタンに FWin_dialogApply を関連付けます。ユーザーは,適切な動作を取るように FWin_dialogApply サブルーチンにコードを追加しなければなりません。
DlgModeless は,ユーザーからの入力を受け付ける初期化されたモードレス・ダイアログボックスを表示します。
ユーザーからの入力に対して動作するためのメッセージ処理 (メッセージ・ループ) に関連したコードは,以下のとおりです。
! Read and process messages do while( GetMessage (mesg, NULL, 0, 0) ) if ( DlgIsDlgMessage(mesg) .EQV. .FALSE. ) then lret = TranslateMessage( mesg ) ret = DispatchMessage( mesg ) end if end do
この例の注意事項:
DO WHILE ループ内の GetMessage Win32 呼び出しは,呼び出されたスレッドのメッセージ・キューからのメッセージを返します。
DlgIsDlgMessage は,指定したメッセージが現在表示されているモードレス・ダイアログボックスの 1 つに対してか,特定のダイアログボックスに対して出されたものかを決定します。
TranslateMessage Win32 呼び出しは,仮想キー・メッセージを文字メッセージに変換します。
DispatchMessage Win32 呼び出しは,メッセージをウィンドウ・プロシージャに転送します。
DlgUninit を呼び出すことで,ダイアログボックスを終了させ,リソースを開放します。
call DlgUninit(gdlg)
「A simple Single Document Interface (SDI)」オプションを選択した時に生成されるテンプレートのようなコードに,主ウィンドウのクライアント領域にダイアログボックスを追加するには以下のようにします。
「Insert」メニューで「Resource...」を選択し,新しいダイアログボックスを作成します。ダイアログボックスのプロパティを編集します。「Styles」タブを選択し,「Styles」に「Child」を設定し,「Border」に「Thin」を設定します。
主ソース・ファイルで以下の USE 文を追加します。
USE dflogm
主ソース・ファイルの MainWndProc 関数に WM_CREATE メッセージを取り扱う場合を追加します。この場合,通常の方法でダイアログボックスが初期化されます。ダイアログボックスを表示するには,以下を呼び出します。
lret = DlgModeless(dlg, SW_SHOWNA, hwndParent)
この呼び出しでは,hwndParent はアプリケーションの主ウィンドウの Window ハンドルです。
主ソース・ファイルで,TranslateAccelerator Win32 ルーチンを呼び出す前に,メッセージ・ループに DlgIsDlgMessage 呼び出しを追加します。以下のようにします。
! Read and process messages do while( GetMessage (mesg, NULL, 0, 0) ) if ( DlgIsDlgMessage(mesg, dlg) .EQV. .FALSE. ) then if ( TranslateAccelerator (mesg%hwnd, haccel, mesg) == 0) then lret = TranslateMessage( mesg ) ret = DispatchMessage( mesg ) end if end if end do
オプションとして,ユーザーが主ウィンドウの大きさを変更できるようにするには,WM_RESIZE メッセージを取り扱う場合を追加し,大きさを基本としたダイアログボックスのレイアウトを変更します。
この形式のアプリケーションの例としては,...\SAMPLES\DIALOG にある Visual Fortran サンプルの FXPLORER を参照してください。