void GameHelpBtnBtnSelect(APLFORMPTR AplForm, MESSAGE* Message, const MESSAGE* BtnMsg) { /* 一旦時間計測を止める */ TSTOP(); /* ヘルプダイアログの表示(必ずAPMからのMessageを利用) */ Message->CommonMsg.MessageID = ToolOpenID; ControlCall( GameHelpDg, AplForm->Control, Message ); /* ヘルプダイアログはモーダルなので、終わるまでここで待っている状態 */ /* 戻ってきたので、時間計測を継続する */ TCONT(); }上の例では、TSTOP(), TCONT() がダイアログとは関係ない部分ですが、 このようにモーダル・ダイアログの場合、呼び出してから戻ってくるまで プログラムの実行はこちらから見た場合 ControlCall() の位置で止まっているというのがポイントです。
char fname[APL_DRIVE_NAME_MAX + 14]; /* まずファイル名作成領域をヌルクリアしておく */ memset( fname, 0, sizeof(fname) ); /* 本moreソフトのあるドライブ名を得る */ GetAplVolumeName( GetMyAplName(), (void *)fname ); /* ボリューム名付きのヘルプファイル名を作成 */ strcat( fname, "WST3HELP.ZDT" );それから、ヘルプファイルの読み込み場所は、 UCHAR buf[2048]; のように固定で用意するのではなく、 stat() でファイルサイズを調べ、 動的に確保する方が柔軟性があって良いでしょう。 以下の例では、NewHeapPtr() で確保していますが、 当然ながらこれも使用が終わったら DisposeHeapPtr()で必ず解放しなければなりません。
struct stat sbuf; char *hptr; /* ヘルプファイルの大きさを得る */ stat( fname, &sbuf ); /* st_size だけのヒープを確保。+4 は終端の余裕分 */ hptr = NewHeapPtr( sbuf.st_size + 4 );ファイルの読み込みは、 次のように fopen() でファイルを開き、 ファイル識別子を得た上で fread() や fwrite() にて読み書きを行います。 そして全ての操作が終わったら、 fclose() でファイルを閉じてファイル識別子や関連資源の解放を行わねばなりません。 解放処理を忘れると俗に言うメモリリークとなるので十分注意しましょう。
FILE *fp; /* ヘルプファイルを開く */ if ( (fp = fopen( fname, "r" )) != NULL ) { /* ファイルを読み込む */ rbytes = fread( hptr, 1, sbuf.st_size, fp ); /* 終端に NULL 文字を追加(一応気持ちで・・) */ hptr[rbytes] = '\0'; /* ファイルを閉じる(必須) */ fclose( fp ); /* --- hptr の領域に読み込んだ内容をエディタに設定 --- */ } /* 確保した読み込み領域を解放 */ DisposeHeapPtr( hptr );
/* テキストエディタに書き込む */ lm.CommonMsg.MessageID = SetDataID; lm.SetData.DataAddress = (void *)hptr; lm.SetData.DataSize = rbytes; ControlCall( HelpMsg, AplForm->Control, &lm ); /* カーソルをOffにする(注意事項参照) */ lm.CommonMsg.MessageID = EditorCursorOffID; ControlCall( HelpMsg, AplForm->Control, &lm );
MESSAGE lm; USHORT all, disp, offset; /* エディタから値を読み取る */ GetCtrlProperty( HelpMsg, EDIT_ALL_DATA_NO_PID, usValue, all, AplForm->Control, USHORT ); GetCtrlProperty( HelpMsg, EDIT_DISP_DATA_NO_PID, usValue, disp, AplForm->Control, USHORT ); GetCtrlProperty( HelpMsg, EDIT_DISP_OFFSET_PID, usValue, offset, AplForm->Control, USHORT ); /* スクロールバーへ全体長の設定 */ SetCtrlProperty( HelpVBar, ALL_DATA_NO_PID, usValue, all, AplForm->Control ); /* スクロールバーの初期化 */ lm.CommonMsg.MessageID = ToolInitID; ControlCall( HelpVBar, AplForm->Control, &lm ); /* 表示行数と表示開始位置の設定 */ SetCtrlProperty( HelpVBar, DISP_DATA_NO_PID, usValue, disp, AplForm->Control ); SetCtrlProperty( HelpVBar, DISP_OFFSET_PID, usValue, offset, AplForm->Control );このスクロールバーの初期化・設定処理は通常 FormSetUp() 内に書いておき、 後はスクロールバーのイベント関数でテキストエディタとの同期スクロールを実現することになります。
void HelpVBarBarUpdate(APLFORMPTR AplForm, MESSAGE* Message,const MESSAGE* BarMsg) { MESSAGE lm; /* エディタをバーに合わせてスクロール */ lm.CommonMsg.MessageID = ScrollUpdateID; lm.ScrollUpdate.AllDataNo = BarMsg->BarUpdate.BarAllDataNo; lm.ScrollUpdate.DispDataNo = BarMsg->BarUpdate.BarDispDataNo; lm.ScrollUpdate.DispOffset = BarMsg->BarUpdate.BarDispOffset; ControlCall( HelpMsg, AplForm->Control, &lm ); } void HelpVBarBarButtonStillSelect(APLFORMPTR AplForm, MESSAGE* Message, const MESSAGE* BarMsg ) { MESSAGE lm; USHORT all,disp,offset; switch( BarMsg->BarButtonStillSelect.ButtonID ) { case ScrollDownBtnID: /* 上向き矢印ボタン */ lm.CommonMsg.MessageID = ScrollDownID; break; case ScrollUpBtnID: /* 下向き矢印ボタン */ lm.CommonMsg.MessageID = ScrollUpID; break; case BarPrevSearchBtnID: /* 上向き拡張ボタン */ lm.CommonMsg.MessageID = PrevPageID; break; case BarNextSearchBtnID: /* 下向き拡張ボタン */ lm.CommonMsg.MessageID = NextPageID; break; default: return; } ControlCall( HelpVBar, AplForm->Control, &lm ); /* スクロールバーから値を読み取る */ GetCtrlProperty( HelpVBar, ALL_DATA_NO_PID, usValue, all, AplForm->Control, USHORT ); GetCtrlProperty( HelpVBar, DISP_DATA_NO_PID, usValue, disp, AplForm->Control, USHORT ); GetCtrlProperty( HelpVBar, DISP_OFFSET_PID, usValue, offset, AplForm->Control, USHORT ); /* エディタをバーに合わせてスクロール */ lm.CommonMsg.MessageID = ScrollUpdateID; lm.ScrollUpdate.AllDataNo = all; lm.ScrollUpdate.DispDataNo = disp; lm.ScrollUpdate.DispOffset = offset; ControlCall( HelpMsg, AplForm->Control, &lm ); }
void HelpDmyAreaPress(APLFORMPTR AplForm, MESSAGE* Message, const MESSAGE* AreaMsg) { MESSAGE lm; USHORT all,disp,offset; if ( AreaMsg->AreaPress.Offset.y < (186*4)/2 ) { lm.CommonMsg.MessageID = PrevPageID; }else{ lm.CommonMsg.MessageID = NextPageID; } /* スクロールバーを1ページ分動かす */ ControlCall( HelpVBar, AplForm->Control, &lm ); /* スクロールバーから値を読み取る */ GetCtrlProperty( HelpVBar, ALL_DATA_NO_PID, usValue, all, AplForm->Control, USHORT ); GetCtrlProperty( HelpVBar, DISP_DATA_NO_PID, usValue, disp, AplForm->Control, USHORT ); GetCtrlProperty( HelpVBar, DISP_OFFSET_PID, usValue, offset, AplForm->Control, USHORT ); /* エディタをバーに合わせてスクロール */ lm.CommonMsg.MessageID = ScrollUpdateID; lm.ScrollUpdate.AllDataNo = all; lm.ScrollUpdate.DispDataNo = disp; lm.ScrollUpdate.DispOffset = offset; ControlCall( HelpMsg, AplForm->Control, &lm ); }
void HelpFormKeyExec(APLFORMPTR AplForm, MESSAGE* Message, const MESSAGE* KeyMsg) { MESSAGE lm; USHORT all,disp,offset; switch( KeyMsg->KeyDown.KeyCode ) { case KC_NEXT: /* 順送り */ lm.CommonMsg.MessageID = NextPageID; break; case KC_PREV: /* 逆送り */ lm.CommonMsg.MessageID = PrevPageID; break; case KC_CURSOR_UP: /* 上 */ lm.CommonMsg.MessageID = ScrollDownID; break; case KC_CURSOR_DOWN: /* 下 */ lm.CommonMsg.MessageID = ScrollUpID; break; case KC_DECIDE: /* 決定 */ case KC_BACK: /* 戻る */ AplForm->IsExit = true; return; case KC_CURSOR_RIGHT: /* 右向きカーソル */ case KC_CURSOR_LEFT: /* 左向きカーソル */ default: return; } /* !スクロールバーの処理が必要な時だけ下に流す! */ ControlCall( HelpVBar, AplForm->Control, &lm ); /* スクロールバーから値を読み取る */ GetCtrlProperty( HelpVBar, ALL_DATA_NO_PID, usValue, all, AplForm->Control, USHORT ); GetCtrlProperty( HelpVBar, DISP_DATA_NO_PID, usValue, disp, AplForm->Control, USHORT ); GetCtrlProperty( HelpVBar, DISP_OFFSET_PID, usValue, offset, AplForm->Control, USHORT ); /* エディタをバーに合わせてスクロール */ lm.CommonMsg.MessageID = ScrollUpdateID; lm.ScrollUpdate.AllDataNo = all; lm.ScrollUpdate.DispDataNo = disp; lm.ScrollUpdate.DispOffset = offset; ControlCall( HelpMsg, AplForm->Control, &lm ); }以上、少々長くなりましたが、 これで任意のテキストファイルを表示できるダイアログは完成です。 表示する内容は別ファイル(ここでは WST3HELP.ZDT)にありますので、 他のmoreソフトを作った時にも今のソースは流用していけることと思います。