ダイアログボックスの初期化と活動状態

個々のダイアログボックスには,dialog 構造型の変数が関連付けられています。dialog 構造型は DFLOGM.F90 モジュールに定義されており,これを参照するには USE DFLOGM を使用します。ダイアログ・アプリケーションを作成する時には,ダイアログボックスを dialog 構造型の変数として引用します。次に例を示します。

	USE DFLOGM
	INCLUDE 'RESOURCE.FD'
	TYPE (dialog) dlg
	LOGICAL return
	return = DLGINIT( IDD_TEMP, dlg )

このコードは,dialog 構造型をリソースとインクルード・ファイル (この例では TEMP.RCRESOURCE.FD) に定義されているダイアログ (この例では IDD_TEMP) と関連付けます。

アプリケーションがダイアログ・リソース・ファイルを参照できるようにするには,プロジェクトに .RC ファイルを追加します。アプリケーションがダイアログ・インクルード・ファイルを参照できるようにするには,個々の副プログラムに .FD ファイルをインクルードします。これらのファイルのダイアログ・プロパティにダイアログ・タイプを関連付けるには,ダイアログ名を指定して DLGINIT を呼び出します。

ダイアログボックスを制御するアプリケーションは,次の動作を実行しなくてはなりません。

  1. DLGINIT または DLGINITWITHRESOURCEHANDLE を呼び出してダイアログ・タイプを初期化し,ダイアログとそのプロパティをそのタイプに関連付けます。

  2. DLGSET などのダイアログ設定関数を使って,コントロールを初期化します。

  3. DLGSETSUB を使って,ユーザーがダイアログボックス内のコントロールを操作した時に実行されるコールバック・ルーチンを設定します。

  4. モーダル・ダイアログ・タイプとモードレス・ダイアログ・タイプのどちらを使用したいかに応じて,次の操作を行います。

  5. DLGGET などのダイアログ取得関数を使って,コントロール情報を取得します。

  6. DLGUNINIT を使って,ダイアログのリソースを解放します。

ダイアログボックスとコントロールを活動状態にする例として,次のコードは,前の例で作成された「Temperature」ダイアログボックスとコントロールを初期化します。また,コールバック・ルーチンを UpdateTemp として設定し,ダイアログボックスを表示し,処理が終わったらダイアログ・リソースを解放します。

	SUBROUTINE DoDialog( )
	USE DFLOGM
	IMPLICIT NONE
	INCLUDE 'RESOURCE.FD'

	INTEGER retint
	LOGICAL retlog
	TYPE (dialog) dlg
	EXTERNAL UpdateTemp
!	初期化
	IF ( .not. DlgInit( idd_temp, dlg ) ) THEN
	  WRITE (*,*) "Error: dialog not found"
	ELSE
!	  温度コントロールを設定します。
	  retlog = DlgSet( dlg, IDC_SCROLLBAR_TEMPERATURE, 200, DLG_RANGEMAX)
	  retlog = DlgSet( dlg, IDC_EDIT_CELSIUS, "100" )
	  CALL UpdateTemp( dlg, IDC_EDIT_CELSIUS, DLG_CHANGE)
	  retlog = DlgSetSub( dlg, IDC_EDIT_CELSIUS, UpdateTemp )
	  retlog = DlgSetSub( dlg, IDC_EDIT_FAHRENHEIT, UpdateTemp )
	  retlog = DlgSetSub( dlg, IDC_SCROLLBAR_TEMPERATURE,UpdateTemp )
!	  モーダル・ダイアログボックスを活動状態にします。
	  retint = DlgModal( dlg )
!	  ダイアログボックス・リソースを開放します。
	  CALL DlgUninit( dlg )
	END IF
	END SUBROUTINE DoDialog

DLGSETDLGSETSUB などのダイアログ関数は,リソース・エディタでダイアログボックスを作成した時に,「Properties」ボックスで割り付けた名前を使って,ダイアログ・コントロールを引用します。次に例を示します。

	retlog = DlgSet( dlg, IDC_SCROLLBAR_TEMPERATURE, 200, DLG_RANGEMAX)

この文では,ダイアログ関数 DLGSET は,IDC_SCROLLBAR_TEMPERATURE という名前のコントロールに 200 という値を割り付けています。指標 DLG_RANGEMAX は,この値がスクロールバーの最大範囲であることを指定しています。次に別の例を示します。

	retlog = DlgSet( dlg, IDC_EDIT_CELSIUS, "100" )
	CALL UpdateTemp( dlg, IDC_EDIT_CELSIUS, DLG_CHANGE)

上記の文は,ダイアログの上方のエディットボックス (リソース・エディタで IDC_EDIT_CELSIUS という名前を付けたもの) に初期値 100 を設定し,UpdateTemp ルーチンを呼び出して,値が変更されたことをアプリケーションに通知します。次に別の例を示します。

	retlog = DlgSetSub( dlg, IDC_EDIT_CELSIUS, UpdateTemp )
	retlog = DlgSetSub( dlg, IDC_EDIT_FAHRENHEIT, UpdateTemp )
	retlog = DlgSetSub( dlg, IDC_SCROLLBAR_TEMPERATURE,UpdateTemp )

上記の文は,コールバック・ルーチン UpdateTemp を,3 つのコントロールと関連付けています。

ルーチンをコントロールに割り付けるには,DLGSETSUB 関数を使用します。この関数の第 1 引数は dialog 変数,第 2 引数はコントロール名,第 3 引数はそのコントロールのために作成したルーチン,そして省略可能な第 4 引数は複数のルーチン中から選択を行うための指標です。ダイアログ・コントロールのコールバック・ルーチンは,ダイアログを DLGMODAL または DLGMODELESS で開く前や,別のコールバック・ルーチン中からなど,アプリケーション内の任意の場所で設定することができます。

TEMP サンプルでは,主プログラムは「Temparature Conversion」ダイアログボックスを表示するために DoDialog サブルーチンを呼び出しています。