home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacUser Mac Bin 40
/
MACUSER-MACBIN40A-1997-03.ISO.7z
/
MACUSER-MACBIN40A-1997-03.ISO
/
特集⁄オンラインソフト
/
ゲーム&アミューズメント
/
アミューズメント
/
お説教フォルダ
/
Source
/
Osekkyou.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-12-14
|
7KB
|
252 lines
/*--------------------------------------------------------------------------
名前 Osekkyou.c
機能 マック用低レベルソフトシリーズ
作成 1991.12.14.-1991.12.14. K.Nakagawa
変更
--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
インクルードファイル
--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
定数の定義
--------------------------------------------------------------------------*/
#define WAIT_A_WHILE_TIME 180 /* 看板の表示時間 */
#define OPENNING_TITLE_DLOG_ID 1001 /* 看板のDLOGリソースID番号 */
#define FIRST_OSEKKYOU_ALRT_ID 1002 /* お説教ALRTリソースID番号 */
#define LAST_OSEKKYOU_ALRT_ID 1003 /* 上と同じだが最後に出すやつ */
#define CONTINUE_ITEM_NO 1 /* "続ける"か"終了" */
#define CANCEL_ITEM_NO 2 /* "中止" */
#define MIN_STR_OSEK_ID 1001 /* STR#の最小値 */
#define MAX_STR_OSEK_ID 1002 /* STR#の最大値 */
#define CUR_STR_OSEK_ID 1003 /* STR#の現在値 */
/*--------------------------------------------------------------------------
型の定義
--------------------------------------------------------------------------*/
typedef struct {
int id; /* お説教のSTR#リソース番号 */
int count; /* 上記リソースの最大インデックス番号 */
} OsekkyouIDandCount;
/*--------------------------------------------------------------------------
広域変数
--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
プロトタイプ宣言
--------------------------------------------------------------------------*/
void main(void);
void OpeningTitle(Boolean);
void WaitAWhile(void);
OsekkyouIDandCount GetTodayInformation(void);
void OsekkyouMain(int,int,Boolean);
static pascal void ResumeIt(void);
/*--------------------------------------------------------------------------
defineを使ったプログラムの定義
--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
外部に公開するプログラム
--------------------------------------------------------------------------*/
void main(void)
{
/* 変数宣言 */
OsekkyouIDandCount aToday; /* 本日、たれる、お説教のID番号など */
int aInt;
/* 手続き */
/* 初期化部分 */
/* ここはマックのマネージャ類に初期化を要求する部分であり */
/* いわば定番の処理とも言えます */
MaxApplZone();
InitGraf(&thePort);
InitFonts();
InitWindows();
TEInit();
InitMenus();
InitDialogs(ResumeIt);
FlushEvents(everyEvent,0);
InitCursor();
/* ここで”低レベルソフトシリーズ お説教”というダイアログを出す */
OpeningTitle(TRUE);
/* ほんでもって、しばらく待っている */
WaitAWhile();
/* ここでダイアログを消す */
OpeningTitle(FALSE);
/* お説教をたれていく */
aToday = GetTodayInformation();
for(aInt = 1; aInt < aToday.count; aInt++)
{
OsekkyouMain(aToday.id,aInt,FALSE);
}
/* 本日は、これまで */
OsekkyouMain(aToday.id,aInt,TRUE);
}
/*
看板の表示(pOpenFlag == TRUEなら)か消滅(pOpenFlag == FALSEなら)
*/
void OpeningTitle(Boolean pOpenFlag)
{
/* 変数宣言 */
static DialogPtr aDialogPtr; /* ダイアログへのポインター */
/* 手続き */
if(pOpenFlag)
{
aDialogPtr = GetNewDialog( /* ダイアログのオープン */
OPENNING_TITLE_DLOG_ID, /* DLOG ID番号 */
(Ptr)0, /* ヒープから確保 */
(WindowPtr)-1); /* 前面に表示する */
if(aDialogPtr)
DrawDialog(aDialogPtr); /* ダイアログの中身を表示 */
}else{
if(aDialogPtr)
DisposDialog(aDialogPtr); /* ダイアログを閉じる */
}
}
/*
しばらく待っている
*/
void WaitAWhile(void)
{
/* 変数宣言 */
long aDummy;
/* 手続き */
Delay(WAIT_A_WHILE_TIME,&aDummy);
}
/*
今日の”お説教”の題材を決める
戻り値のうち、idはSTR#リソースのID番号であり
countはそのSTR#リソースに含まれている文字列の数
エラーのときはid=0,count=0にして返す
*/
OsekkyouIDandCount GetTodayInformation(void)
{
/* 変数宣言 */
OsekkyouIDandCount aResult;
Handle aHandle;
int aMinID,aMaxID,aCurID,aCount,aNextCurID;
/* 手続き */
/* エラー時の戻り値をあらかじめセットしておく */
aResult.id = 0;
aResult.count = 0;
/* STR#リソースの最小値と最大値を得る */
/* これらの情報はOSEKリソースの中にある */
aHandle = GetResource('OSEK',MIN_STR_OSEK_ID);
if((Handle)0 == aHandle)
return aResult;
aMinID = **((int **)aHandle);
ReleaseResource(aHandle);
aHandle = GetResource('OSEK',MAX_STR_OSEK_ID);
if((Handle)0 == aHandle)
return aResult;
aMaxID = **((int **)aHandle);
ReleaseResource(aHandle);
/* 本日の”お説教”に使うSTR#リソースのID番号をえる */
aHandle = GetResource('OSEK',CUR_STR_OSEK_ID);
if((Handle)0 == aHandle)
return aResult;
aCurID = **((int **)aHandle);
/* 次回の”お説教”に使うSTR#リソースのID番号を決める */
aNextCurID = aCurID + 1;
if(aNextCurID > aMaxID)
aNextCurID = aMinID;
/* 次回の”お説教”のためにOSEKリソースを更新する */
**((int **)aHandle) = aNextCurID;
ChangedResource(aHandle);
WriteResource(aHandle);
ReleaseResource(aHandle);
/* 決定したID番号のSTR#リソースの持っている文字列の個数を得る */
aHandle = GetResource('STR#',aCurID);
if((Handle)0 == aHandle)
return aResult;
aCount = **((int **)aHandle);
ReleaseResource(aHandle);
aResult.id = aCurID;
aResult.count = aCount;
return aResult;
}
/*
お説教のダイアログを出していく
pSTRidはSTR#リソースのID番号
pIndexはSTR#リソースのインデックス番号
pIsEndはTRUEなら最終のダイアログを出す
*/
void OsekkyouMain(int pSTRid,int pIndex,Boolean pIsEnd)
{
/* 変数宣言 */
static Boolean aEndFlag = FALSE; /* 終了フラグ */
Str255 aStr255;
int aItem;
/* 手続き */
/* すでに終了フラグが立っているなら戻る */
if(aEndFlag)
return;
/* パラメータ異常なら戻る */
if(pSTRid <= 0 || pIndex <= 0)
return;
/* STR#リソースを得る */
GetIndString(aStr255,pSTRid,pIndex);
/* 文字列をセットする */
ParamText(aStr255,"¥p","¥p","¥p");
/* アラートを出す */
aItem = Alert(pIsEnd ? LAST_OSEKKYOU_ALRT_ID : FIRST_OSEKKYOU_ALRT_ID,
(ProcPtr)0);
/* 中止であるなら終了フラグを立てる */
if(CANCEL_ITEM_NO == aItem)
aEndFlag = TRUE;
}
/*--------------------------------------------------------------------------
外部に公開しないプログラム
--------------------------------------------------------------------------*/
/*
爆弾でたぞー!
*/
static pascal void ResumeIt(void)
{
ExitToShell();
}
/*--------------------------------------------------------------------------
このファイルはここまで
--------------------------------------------------------------------------*/