プログラム編の続きです。
●winmng_NewWin
ウィンドウテーブルのbLiveをチェックして空いているウィンドウ番号を割り当てます。
割り当てたウィンドウに指定した座標、サイズ、名前のパラメータを設定して、戻り値は割り当てられたウィンドウの番号を返します。それと同時に新しく割り当てたウィンドウはアクティブ・ウィンドウ(操作対象ウィンドウ)になります。
もしウィンドウをWINDOW_MNG_MAX超えて閉じ忘れたりするとエラーになります。
//----------------------------------------------------------------------
// ウィンドウを生成します。
//----------------------------------------------------------------------
int winmng_NewWin(int px,int py,int sizex,int sizey,char *winName)
{
MACRO_ASSERT( px>=0 );
MACRO_ASSERT( py>=0 );
MACRO_ASSERT( sizex>0 );
MACRO_ASSERT( sizey>0 );
// bLiveがFALSEなウィンドウをサーチします。
for( int i=0 ; i=0 );
MACRO_ASSERT( winno=0 ; i-- ) {
if( s_winData.win[i].bLive ) {
s_winData.ActiveNo = i;
return;
}
}
}
}
全てのウィンドウを無条件に破棄します。
この関数は、初期化替わりに使ってもOKです。
//----------------------------------------------------------------------
// 全てのウィンドウを破棄します。
//----------------------------------------------------------------------
void winmng_DelAllWin()
{
// 全てのウィンドウのbLiveをFALSEにします。
for( int i=0 ; i=0 );
MACRO_ASSERT( winno 0 ) {
// 開始フレームと今フレームから経過フレーム数を求めます。
int passFrame = s_winData.frame - s_winData.win[winno].startFrame;
// それをスピードで割れば今の表示ポイントが分かります。
// 演算順位で処理されれるとは言えカッコで囲んでおきましょう。
s_winData.win[winno].msgNowPoint = (passFrame/speed);
} else {
// 最初から全てを表示。
s_winData.win[winno].msgNowPoint = 1024; //最大文字数を仮定で。
}
// ポーズカーソルのフラグをOFF
s_winData.win[winno].bPause = FALSE; // 待機カーソル
// 文字描画を描画なしの仮で呼び出して、文字列端で決定ボタンを
// 押されたらTRUEで戻ります。
int rtn = winmng_DrawMsg(winno,FALSE);
switch( rtn ) {
case DRAWMSG_RTN_CONTINE: //表示継続中
break;
case DRAWMSG_RTN_WINEND: //ウィンドウの終端
// ポーズカーソルのフラグ
s_winData.win[winno].bPause = TRUE; // 待機カーソル
// 決定ボタンを受け付ける。
if( g_MainData.key[g_MainData.key_act] == 1) {
// 表示開始位置を変更する。
s_winData.win[winno].msgStart = s_winData.win[winno].msgEnd;
s_winData.win[winno].startFrame = s_winData.frame; //開始フレームを再設定。
}
break;
case DRAWMSG_RTN_MOJIEND: //文字列終端
// ポーズカーソルのフラグ
s_winData.win[winno].bPause = TRUE; // 待機カーソル
// 決定ボタンを受け付ける。
if( g_MainData.key[g_MainData.key_act] == 1) {
return TRUE;
}
break;
}
}
// 文字列終端に達していない。
return FALSE;
}
アクティブなウィンドウをメニューモードにしてメニューの内容を設定します。
//----------------------------------------------------------------------
// ウィンドウに表示するメニューを設定。
//----------------------------------------------------------------------
void winmng_SetMenu(char **menulist)
{
// リストをメニューモードに設定する。
winmng_SetItemList( menulist, WIN_MODE_MENU );
}
メニューの操作と決定ボタンの判定します。
上下なら、選択されているリストの番号を更新します。
決定ボタンなら、今選択されているリストの番号を持ち帰ります。それ以外は-1を持ち帰ります。
//----------------------------------------------------------------------
// ウィンドウのメニューを変更する。
//----------------------------------------------------------------------
int winmng_SelectMenu()
{
// アクティブなウィンドウがあるなら
if( s_winData.ActiveNo != -1 ) {
int winno = s_winData.ActiveNo;
// メニュー・ウィンドウじゃないならバグ
MACRO_ASSERT( s_winData.win[winno].mode==WIN_MODE_MENU);
// キー入力で選択します。今のところ上下のみ予定。
if( g_MainData.key[g_MainData.key_up] == 1) {
s_winData.win[winno].itemNo--;//上に
// アンダーのガード
if( s_winData.win[winno].itemNo = s_winData.win[winno].listNums ) {
s_winData.win[winno].itemNo = 0;//下に行き過ぎると上に戻る。
}
}
// 決定ボタンを押されたら、押されたときに指していたメニュー番号を持ち帰ります。
if( g_MainData.key[g_MainData.key_act] == 1) {
return s_winData.win[winno].itemNo;
}
}
// 選択が決定されていない。
return -1;
}
アクティブなウィンドウをリストモードにしてリストの内容を設定します。
この処理はメニュー処理と共通です。
//----------------------------------------------------------------------
// ウィンドウに表示するデータリストを設定。
//----------------------------------------------------------------------
void winmng_SetList(char **datalist)
{
// リストをリストモードに設定する。
winmng_SetItemList( datalist, WIN_MODE_LIST );
}
これはシンプルで、決定ボタンなら今選択されているリストの番号を持ち帰ります。それ以外は-1を持ち帰ります。
//----------------------------------------------------------------------
// ウィンドウの閉じるボタンをチェック
//----------------------------------------------------------------------
int winmng_CheckCloseList()
{
// アクティブなウィンドウがあるなら
if( s_winData.ActiveNo != -1 ) {
int winno = s_winData.ActiveNo;
// リスト・ウィンドウじゃないならバグ
MACRO_ASSERT( s_winData.win[winno].mode==WIN_MODE_LIST);
// 決定かメニュー(キャンセル)を押されたら、リストは終了です。
if( g_MainData.key[g_MainData.key_act] == 1 ||
g_MainData.key[g_MainData.key_menu] == 1) {
return TRUE;
}
}
// 閉じていません。
return FALSE;
}
有効なウィンドウを若い番号から描画します(若い番号のウィンドウは下に隠れます)。
アクティブなウィンドウは無条件に最後の一番上に描画します。
//----------------------------------------------------------------------
// 有効なウィンドウの描画。全てのウィンドウを表示する。
//----------------------------------------------------------------------
void winmng_Draw()
{
// bLiveなウィンドウを若い番号から表示します。ただし、アクティブウィンドウは後回しに。
for( int i=0 ; i<WINDOW_MNG_MAX ; i++ ) {
if( s_winData.win[i].bLive ) {
if( i != s_winData.ActiveNo ) {
// ウィンドウを表示する。
winmng_DrawWin( i, FALSE );
}
}
}
// アクティブなウィンドウを表示します。
if( s_winData.ActiveNo!=-1 ) {
winmng_DrawWin( s_winData.ActiveNo, TRUE );
}
}
外部関数は以上です。