home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix Heaven Sunny 2
/
APPARE2.BIN
/
oh_towns
/
art2
/
src.lzh
/
MAIN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-19
|
9KB
|
324 lines
/*====================================================
ARTemis
(version 1.3)
FM-TOWNS 用ペイントツール
by 松内 良介 1994
====================================================*/
/*
main.c
main(), APL_init()
・GUIライブラリ、各モジュールの初期化
・MMI_ExecSystem() による GUIシステムの起動
・終了時の後片付け処理
*/
#define MODULE_MAIN
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <fmcfrb.h>
#include <file_dlg.h>
#include <egb.h>
#include <ctype.h>
#include <direct.h>
#include <dos.h>
#include "art.h"
#include "imagewin.h"
#include "imgbtn.h"
#include "pensel.h"
#include "colsel.h"
#include "guisub.h"
#include "desktop.h"
void getExecDir(char *argv0, char *buf)
// buf: _MAX_PATH バイトのバッファ
{
uint nouse;
char curdir[_MAX_PATH],curdir2[_MAX_PATH];
_getcwd(curdir, _MAX_PATH);
char drive[_MAX_DRIVE],dir[_MAX_DIR],basename[_MAX_FNAME],ext[_MAX_EXT];
_splitpath(argv0,drive,dir,basename,ext);
if (drive[0] != 0)
_dos_setdrive(toupper(drive[0])-'A'+1, &nouse);
_getcwd(curdir2,_MAX_PATH);
strcat(dir,".");
_chdir(dir);
_getcwd(buf, _MAX_PATH);
_chdir(curdir2);
_dos_setdrive(toupper(curdir[0])-'A'+1, &nouse);
_chdir(curdir);
if (strlen(buf) > 3)
strcat(buf, "\\");
}
char *guiEgbPtr ; /* EGB のワークアドレス */
unsigned int *guiColTbl; /* 色変換テーブルのアドレス */
int IMGBOXproto = -1; /* IMGBOX部品のひな型のID */
int IMGBTNproto = -1;
int imgwin_cnt;
int scrPixelSize;
int paramNizimi = 50;
int paramKosuri = 128;
char dirExec[_MAX_PATH];
void main(int argc, char *argv[])
{
getExecDir(argv[0],dirExec);
MMICTRL ctrl,ctrl2;
extern int APL_init() ;
int i;
BOOL fScr32K = FALSE;
for (i=1; i<argc; i++)
{
if (argv[i][0] == '-')
{
if (strcmp(argv[i]+1,"32k")==0 || strcmp(argv[1]+1,"32K") == 0)
fScr32K = TRUE;
}
}
/* 致命的エラーハンドラの登録 */
FM_SetVector() ;
if (!fScr32K)
{
char para[12];
RESOLUTION buf[2];
DWORD(para+0)=1;
DWORD(para+4)=24;
DWORD(para+8)=0;
if (EGB_getResolutionMax(0,para,buf) != -1)
ctrl.page0 = SCREEN16M , scrPixelSize = 24;
else
ctrl.page0 = SCREEN32K , scrPixelSize = 16;
}
else
ctrl.page0 = SCREEN32K, scrPixelSize = 16;
ctrl.page1 = SCREENUNUSED ;
ctrl.writePage = 0 ; /* 書き込みページ */
ctrl.displayPage = 1 ; /* 表示ページフラグ */
ctrl.priority = 0 ; /* 表示プライオリティ */
ctrl.mode = SCREENAVAILABLE ;
ctrl.width = SCREENEXPAND ;
ctrl.size = 0 ; /* メモリ領域の大きさ */
ctrl.ptr = NULL ; /* メモリ領域のアドレス */
ctrl.asize = 0 ; /* ユーザ領域の大きさ */
ctrl.aptr = NULL ; /* ユーザ領域のアドレス */
ctrl.move.lupx = -10000; /* 部品移動枠 */
ctrl.move.lupy = 20 ; /* (ダイアログ移動範囲制限(y座標)) */
ctrl.move.rdwx = 10000;
ctrl.move.rdwy = 10000;
ctrl.white = 15 ; /* 白の色番号 */
ctrl.black = 8 ; /* 黒の色番号 */
ctrl.gray = 7 ; /* 灰色の色番号 */
ctrl.xor = 6 ; /* 反転色の色番号 */
if (MMI_Open(&ctrl) == NOERR)
{
/* 初期化に成功すればメインループに入る. */
if (APL_init() == NOERR)
{
FDG_SaveCurDir() ;
FDG_InitFileDlg() ;
RM_setFileDlgStyle(1);
MMI_ExecSystem() ;
FDG_FreeFileDlg();
FDG_RecovCurDir() ;
}
/* ARTemis 内の各モジュールの終了処理 */
pensel_end();
pic_close();
}
/* 終了処理 */
MMI_Close() ;
/* 致命的エラーハンドラの復帰 */
FM_ResetVector() ;
/* キークリック音のOFF */
KYB_clic(1);
}
int APL_init()
{
extern MMIINIT initDataABOUT ;
extern MMIINIT initDataZALERT ;
extern MMIINIT initDataZCOLSEL ;
extern MMIINIT initDataZCREATE ;
extern MMIINIT initDataZDESKTOP ;
extern MMIINIT initDataZIMGWIN ;
extern MMIINIT initDataZPENSEL ;
extern MMIINIT initDataZSETUP ;
extern MMIINIT initDataZALLSCR ;
extern int set_icontable(void);
register int ret ;
/* EGB ワークアドレスの取得. */
guiEgbPtr = MMI_GetEgbPtr() ;
/* ハイパ型部品の初期化 */
if ((ret = MMI_initHyper()) < 0)
return ret ;
/* ダイアログ型部品の初期化 */
if ((ret = MMI_initDialogL40()) < 0)
return ret ;
/* アラート型部品の初期化 */
if ((ret = MMI_initAlertL40()) < 0)
return ret ;
/* ウインドウ型部品の初期化 */
if ((ret = MMI_initWindowL40()) < 0)
return ret ;
/* メッセージ型部品の初期化 */
if ((ret = MMI_initMessageL40()) < 0)
return ret ;
/* メニュー型部品の初期化 */
if ((ret = MMI_initMenuL40()) < 0)
return ret ;
/* ボタン型部品の初期化 */
if ((ret = MMI_initButtonL40()) < 0)
return ret ;
/* ドロウボタン型部品の初期化 */
if ((ret = MMI_initDrawButtonL40()) < 0)
return ret ;
/* アイコンボタン型部品の初期化 */
if ((ret = MMI_initIconL40()) < 0)
return ret ;
/* トグルアイコン型部品の初期化 */
if ((ret = MMI_initToggleIconL40()) < 0)
return ret ;
/* メニューアイテム型部品の初期化 */
if ((ret = MMI_initMenuItemL40()) < 0)
return ret ;
/* スクロール型部品の初期化 */
if ((ret = MMI_initScrollBarL40()) < 0)
return ret ;
/* テキスト型部品の初期化 */
if ((ret = MMI_initTextL40()) < 0)
return ret ;
/* リストメニュー型部品の初期化 */
if ((ret = MMI_initListMenuL40()) < 0)
return ret ;
/* 数値入力型部品の初期化 */
if ((ret = MMI_initNumBoxL40()) < 0)
return ret ;
/* イメージボックス型部品の初期化 */
if ((ret = MMI_initImageBox()) < 0)
return ret;
/* イメージボタン型部品の初期化 */
if ((ret = MMI_initImageBtn()) < 0)
return ret ;
/* デフォルトビジュアルエフェクトの登録 */
MMI_SetUpVisualEffect() ;
/* 背景データの初期化 */
EGB_tmenuPalette2(guiEgbPtr) ;
/* データの登録 */
if ((ret = MMI_Init(&initDataABOUT)) < 0)
return ret ;
if ((ret = MMI_Init(&initDataZALERT)) < 0)
return ret ;
if ((ret = MMI_Init(&initDataZCOLSEL)) < 0)
return ret ;
if ((ret = MMI_Init(&initDataZCREATE)) < 0)
return ret ;
if ((ret = MMI_Init(&initDataZDESKTOP)) < 0)
return ret ;
if ((ret = MMI_Init(&initDataZIMGWIN)) < 0)
return ret ;
if ((ret = MMI_Init(&initDataZPENSEL)) < 0)
return ret ;
if ((ret = MMI_Init(&initDataZSETUP)) < 0)
return ret ;
if ((ret = MMI_Init(&initDataZALLSCR)) < 0)
return ret ;
/* SIDEWORKメニューを登録する */
MMI_SetUpSDKMenu( idDesktopMItem_System , 2 ) ;
/* ARTemisの各モジュールの初期化 */
if ((ret = IMGBOX_makePrototype(&IMGBOXproto)) < 0)
return ret;
if ((ret = IMGBTN_makePrototype(&IMGBTNproto)) < 0)
return ret;
if ((ret = desktop_init()) < 0)
return ret ;
if ((ret = imagewin_init()) < 0)
return ret ;
if ((ret = pic_init()) < 0)
return ret ;
if ((ret = pensel_init()) < 0)
return ret ;
if ((ret = colsel_init()) < 0)
return ret ;
/* カラーテーブルの設定 */
scrplt_init();
/* アイコンテーブルの設定 */
if ((ret = set_icontable()) < 0)
return ret ;
// 解像度に合わせて部品のサイズを調整
WINCTRL *pctrl;
MMI_GetControl(&pctrl);
FRAME fr;
RM_getFrame(idBackDialog, &fr);
fr.X2 = pctrl->bound.X2;
fr.Y2 = pctrl->bound.Y2;
RM_setFrame(idBackDialog, &fr);
RM_getFrame(idDesktopDialog, &fr);
fr.X2 = pctrl->bound.X2;
RM_setFrame(idDesktopDialog, &fr);
RM_offsetFrame(idDesktopExitIcon, pctrl->bound.X2+1 - 512, 0);
RM_offsetFrame(idDesktopHelpIcon, pctrl->bound.X2+1 - 512, 0);
RM_offsetFrame(idDesktopSkbIcon, pctrl->bound.X2+1 - 512, 0);
/* ツールボックス、ペン選択パレットの接続 */
MMI_SendMessage( idBrushT2Hyper, MM_DETACH, 0);
{
FRAME fr,fr2;
fr = OBJHYP(idBrushTinyDlg).fr;
fr2 = OBJHYP(idBrushT2Hyper).fr;
RM_moveFrameTo(&fr2, fr.X+2, fr.Y+2);
MMI_SendMessage( idBrushT2Hyper, MM_MOVE, 1, &fr2);
}
MMI_SendMessage( idBrushT2Hyper, MM_ATTACH, 2, idBrushTinyDlg, 1);
/* ペン先選択ウィンドウの接続 */
MMI_SendMessage( idBrushTinyDlg, MM_ATTACH, 1, idDesktopToolAttachHyper );
/* 色選択ウィンドウの接続 */
MMI_SendMessage( idColSelDlg, MM_ATTACH, 1, idDesktopToolAttachHyper );
/* 背景を表示する */
MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;
double freemem = (double)(TL_checkMemory(0)*4) / 1024.0;
if (freemem < 2.0)
{
char msg[500];
sprintf(msg,
"このマシンで現在 ARTemis が作業のために使えるメモリは"
" %3.1fメガバイトで、あまり余裕がありません。"
"できればあと %3.1fメガバイト程度のメモリを追加することを"
"おすすめします。", freemem, 3.0-freemem);
dispBigAlertMessage("メモリ不足にご注意を…", msg);
}
return NOERR ;
}