すべてのコールバック・ルーチンは,次のインタフェースを持っていなくてはなりません。
SUBROUTINE callback(dlg, control_name, callbacktype )
dlg
ダイアログボックスを引用します。これにより,コールバックはダイアログ・コントロール値を変更することができます。
control_name
コールバックを引き起こしたコントロールの名前。
callbacktype
どのようなコールバックが起こっているかを示します (DLG_CLICKED,DLG_CHANGE,DLG_DBLCLICK など)。
最後の 2 つのパラメタを使うと,複数のコントロールからの複数のコールバックで使用することができる 1 つのサブルーチンを作成することができます。一般に,これは論理的なグループを形成するコントロールに対して行います。たとえば,前例の「Temperature」ダイアログの全コントロールは,UpdateTemp という同じコールバック・ルーチンに関連付けられています。また,同じコントロールに複数のコールバック・ルーチンを関連付けることもできますが,この場合,どのコールバックを使用するかを示す指標パラメタを指定しなくてはなりません。
次にコールバック・ルーチンの例を示します。
SUBROUTINE UpdateTemp( dlg, control_name, callbacktype ) USE DFLOGM IMPLICIT NONE TYPE (dialog) dlg INTEGER control_name INTEGER callbacktype INCLUDE 'RESOURCE.FD' CHARACTER(256) text INTEGER cel, far, retint LOGICAL retlog ! 引用されていない引数に関するコンパイラ警告を抑止します。 INTEGER local_callbacktype local_callbacktype = callbacktype SELECT CASE (control_name) CASE (IDC_EDIT_CELSIUS) ! Celsius 値はユーザーが修正したため, ! Fahrenheit 値とスクロールバー値の両方を更新します。 retlog = DlgGet( dlg, IDC_EDIT_CELSIUS, text ) READ (text, *, iostat=retint) cel IF ( retint .eq. 0 ) THEN far = (cel-0.0)*((212.0-32.0)/100.0)+32.0 WRITE (text,*) far retlog = DlgSet( dlg, IDC_EDIT_FAHRENHEIT, & & TRIM(ADJUSTL(text)) ) retlog = DlgSet( dlg, IDC_SCROLLBAR_TEMPERATURE, cel, & & DLG_POSITION ) END IF CASE (IDC_EDIT_FAHRENHEIT) ! Fahrenheit 値はユーザーが修正したため, ! Celsius 値とスクロールバー値の両方を更新します。 retlog = DlgGet( dlg, IDC_EDIT_FAHRENHEIT, text ) READ (text, *, iostat=retint) far IF ( retint .eq. 0 ) THEN cel = (far-32.0)*(100.0/(212.0-32.0))+0.0 WRITE (text,*) cel retlog = DlgSet( dlg, IDC_EDIT_CELSIUS, TRIM(ADJUSTL(text)) ) retlog = DlgSet( dlg, IDC_SCROLLBAR_TEMPERATURE, cel, & & DLG_POSITION ) END IF CASE (IDC_SCROLLBAR_TEMPERATURE) ! スクロールバー値はユーザーが修正したため, ! Celsius 値と Fahrenheit 値の両方を更新します。 retlog = DlgGet( dlg, IDC_SCROLLBAR_TEMPERATURE, cel, & & DLG_POSITION ) far = (cel-0.0)*((212.0-32.0)/100.0)+32.0 WRITE (text,*) far retlog = DlgSet( dlg, IDC_EDIT_FAHRENHEIT, TRIM(ADJUSTL(text)) ) WRITE (text,*) cel retlog = DlgSet( dlg, IDC_EDIT_CELSIUS, TRIM(ADJUSTL(text)) ) END SELECT END SUBROUTINE UpdateTemp
ダイアログボックス内のすべてのコントロールは,プッシュボタンを例外として,何も動作を実行しない基本コールバックを持っています。プッシュボタンのクリック・イベントの基本コールバックは,ダイアログの戻り値をプッシュボタン名に設定した後に,ダイアログを終了します。これにより,基本設定では,すべてのプッシュボタンがダイアログを終了させることになり,「OK」ボタンと「CANCEL」ボタンに適切な基本動作を与えることになります。この場合,DLGMODAL を呼び出したルーチンは,検証を行って,どのプッシュボタンがモーダル・ダイアログを終了させたのかを調べることができます。
特定のコントロールのコールバックは,そのコントロール値がユーザーの動作によって変更された後に呼び出されます。DLGSET を呼び出した結果としてコントロール値が変化しても,コールバックは呼び出されません。特に,コールバック中でコントロールに対して DLGSET を実行しても,そのコントロールに関連付けられたコールバックが呼び出されることはありません。
DLGMODAL または DLGMODELESS が呼び出される前後で DLGSET を呼び出しても,コールバックは呼び出されません。コールバックを呼び出す必要がある場合,DLGSET を実行した後に,CALL を使って手動で呼び出す必要があります。