どんな動作をするかはコメントで書いてあります。
それと、あまりにOS的な名前なのでwindow_からwinmng_に変えました。
まずヘッダの宣言です。
[winmng.h]
●関数の宣言
関数の宣言です。ほとんど設計で書いた通りです(一部修正)。
#ifndef INCLUDE_WINMNG_H
#define INCLUDE_WINMNG_H
//----------------------------------------------------------------------
// 関数の宣言
//----------------------------------------------------------------------
// ウィンドウの生成・破棄
extern int winmng_NewWin(int px,int py,int sizex,int sizey,char *winName); //ウィンドウを生成します。
extern void winmng_DelWin(int winno); //ウィンドウを破棄します。
extern void winmng_DelAllWin(); //全てのウィンドウを破棄します。
// ウィンドウの切り替え
extern void winmng_SetActiveWin(int winno); // アクティブ(前面)なウィンドウを番号で切り替えます。
extern int winmng_GetActiveWin(); // 今アクティブなウィンドウ番号を得ます。
// 基準フレーム設定。一番最初に呼び出すこと。
extern void winmng_SetFrame(int frame);
// ウィンドウにメッセージを表示。アクティブなウィンドウに表示する。
extern void winmng_SetMsg(char *msg); // ウィンドウに表示するメッセージを設定
extern BOOL winmng_UpdateMsg(int speed); // 文字列の表示位置をスピードに合わせて進める。
// ウィンドウにメニューを表示。アクティブなウィンドウに表示する。
extern void winmng_SetMenu(char **menulist);// ウィンドウに表示するメニューを設定。
extern int winmng_SelectMenu(); // ウィンドウのメニューを変更する。
// 有効なウィンドウの描画。全てのウィンドウを表示する。
extern void winmng_Draw();
#endif /*INCLUDE_WINMNG_H*/
プログラム側は本当に仮組みです。
●先頭部分です。
前回で書いたものとほとんど同じですが、メッセージの部分だけは設計変更されています。
#include
#include "main.h"
#include "winMng.h"
//----------------------------------------------------------------------
// 内部関数
//----------------------------------------------------------------------
//----------------------------------------------------------------------
// 定数
//----------------------------------------------------------------------
// ウィンドウの最大登録個数
#define WINDOW_MNG_MAX 16
// 表示モード
enum {
WIN_MODE_MSG, //メッセージ・モード
WIN_MODE_MENU, //メニュー・モード
};
//----------------------------------------------------------------------
// 構造体
//----------------------------------------------------------------------
// ウィンドウ毎の情報構造体
typedef struct {
int bLive; // 有効なウィンドウ
// ウィンドウ情報
int px; // ウィンドウのピクセル位置X
int py; // ウィンドウのピクセル位置Y
int sizex; // ウィンドウのピクセルサイズX
int sizey; // ウィンドウのピクセルサイズY
char *winName; // ウィンドウ名
// 処理モード
int mode; // 現在のモード(メッセージ、メニュー)
// メッセージ
char *msg; // 文字列
int msgStartPoint; // 表示開始位置
int msgNowPoint; // 表示現在位置
int startFrame; // 開始フレーム
// メニュー
char **menuList;//メニュー項目リスト
int menuNums; //メニュー項目数
int menuNo; //選択番号
} WindowData_t;
// Windowの制御構造体
typedef struct {
WindowData_t win[WINDOW_MNG_MAX]; // ウィンドウ毎のデータ
int ActiveNo; // アクティブ・ウィンドウの番号
int frame; // 今のフレーム
} WindowMng_t;
//----------------------------------------------------------------------
// 変数
//----------------------------------------------------------------------
// Windowの制御構造体の実体。
static WindowMng_t s_winData = {
{FALSE},-1,-1,
};
仮組みですが関数内にコメントで動作を書いてあります。
//----------------------------------------------------------------------
// ウィンドウを生成します。
//----------------------------------------------------------------------
int winmng_NewWin(int px,int py,int sizex,int sizey,char *winName)
{
// bLiveがFALSEなウィンドウをサーチします。
// 仮にメッセージのないメッセージウィンドウとして、
// ウィンドウをパラメータを設定します。
return -1;
}
//----------------------------------------------------------------------
// ウィンドウを破棄します。
//----------------------------------------------------------------------
void winmng_DelWin(int winno)
{
// 該当番号のウィンドウのbLiveをFALSEにします。
// もしアクティブ番号と同じだったら
// アクティブ番号を無効にします。
// 最後からbLive==TRUEなウィンドウを探して、その番号をアクティブとします。
}
//----------------------------------------------------------------------
// 全てのウィンドウを破棄します。
//----------------------------------------------------------------------
void winmng_DelAllWin()
{
// 全てのウィンドウのbLiveをFALSEにします。
}
//----------------------------------------------------------------------
// アクティブ(前面)なウィンドウを番号で切り替えます。
//----------------------------------------------------------------------
void winmng_SetActiveWin(int winno)
{
// 指定されたウィンドウ番号のウィンドウがbLive==TRUEななら
// アクティブ番号として登録します。
}
//----------------------------------------------------------------------
// 今アクティブなウィンドウ番号を得ます。
//----------------------------------------------------------------------
int winmng_GetActiveWin()
{
// アクティブ番号を戻り値として返します。
return -1;
}
//----------------------------------------------------------------------
// 基準フレーム設定。一番最初に呼び出すこと。
//----------------------------------------------------------------------
void winmng_SetFrame(int frame)
{
// 基準となるフレームを設定します。
}
//----------------------------------------------------------------------
// ウィンドウに表示するメッセージを設定
//----------------------------------------------------------------------
void winmng_SetMsg(char *msg)
{
// アクティブなウィンドウにメッセージを設定して
// パラメータを初期化します。開始フレームは、ここで記録します。
}
//----------------------------------------------------------------------
// 文字列の表示位置をスピードに合わせて進める。
//----------------------------------------------------------------------
BOOL winmng_UpdateMsg(int speed)
{
// 開始フレームと今フレームから経過フレーム数を求めます。
// それをスピードで割れば今の表示ポイントが分かります。
// 文字描画を描画なしの仮で呼び出して、文字列端で決定ボタンを
// 押されたらTRUEで戻ります。
// 文字列終端に達していない。
return FALSE;
}
//----------------------------------------------------------------------
// ウィンドウに表示するメニューを設定。
//----------------------------------------------------------------------
void winmng_SetMenu(char **menulist)
{
// メニューリストを設定します。
// メニュー項目数を数えます。
// 選択番号は0に仮定します。
}
//----------------------------------------------------------------------
// ウィンドウのメニューを変更する。
//----------------------------------------------------------------------
int winmng_SelectMenu()
{
// キー入力で選択します。今のところ上下のみ予定。
// 決定ボタンを押されたら、押されたときに指していたメニュー番号を持ち帰ります。
// 選択が決定されていない。
return -1;
}
//----------------------------------------------------------------------
// 有効なウィンドウの描画。全てのウィンドウを表示する。
//----------------------------------------------------------------------
void winmng_Draw()
{
// bLiveなウィンドウを若い番号から表示します。ただし、アクティブウィンドウは後回しに。
// アクティブなウィンドウを表示します。
}