: #define MODULE_PENSELS : /* : pensels.c : */ : : #define PENSEL_XNUM 5 : #define PENSEL_YNUM 3 : : /*--------------------------------------------------------*/ : /* 各部品ID */ : /*--------------------------------------------------------*/ : : int idPenEdDlg = -1 ; : int idPenEdTitleMsg = -1 ; : int idPenEdDBtn = -1 ; : int idPenEdToolTIcon[5] = -1 ; : int idPenEdOkDBtn = -1 ; : int idPenEdOkMsg = -1 ; : int idPenEdCancelDBtn = -1 ; : int idPenEdCancelMsg = -1 ; : int idPenEdGrayMsg = -1 ; : int idPenEdGrayNumMsg = -1 ; : int idPenEdGraySBar = -1 ; : int idPenEdSampleDBtn = -1 ; : int idPenEdEditHSBar = -1 ; : int idPenEdEditVSBar = -1 ; : int idPenEdSizeDBtn = -1 ; : int idPenEdSizeMsg = -1 ; : int idPenSelDlg = -1 ; : int idPenSelTitleMsg = -1 ; : int idPenSelSBar = -1 ; : int idPenSelConcMsg = -1 ; : int idPenSelConcTIcon = -1 ; : int idPenSelSampleDBtn[4] = -1 ; : int idPenSelEraseIcon = -1 ; : int idPenSelEndDBtn = -1 ; : int idPenSelEndMsg = -1 ; : int idPenSelListDlg = -1 ; : int idPenSelIBTN[15] = -1 ; : int idPenSelEditDBtn = -1 ; : int idPenSelEditMsg = -1 ; : int idPenSelSaveDBtn = -1 ; : int idPenSelSaveMsg = -1 ; : int idPenSelLoadDBtn = -1 ; : int idPenSelLoadMsg = -1 ; : int idBrushSmallDlg = -1 ; : int idBrushT1Hyper = -1 ; : int idBrushTitleMsg[2] = -1 ; : int idBrushWinSizeIcon[2] = -1 ; : int idBrushT3Hyper = -1 ; : int idBrushPenSampleTIcon[4] = -1 ; : int idBrushEraseIcon[2] = -1 ; : int idBrushTinyDlg = -1 ; : int idBrushT5Hyper = -1 ; : int idBrushPenDispDBtn = -1 ; : int idBrushT4Hyper = -1 ; : int idBrushT2Hyper = -1 ; : int idBrushMsg[2] = -1 ; : int idBrushModeMenu = -1 ; : int idBrushModeMItem = -1 ; : int idBrushModeSelMenu = -1 ; : int idBrushModeSelMItem[7] = -1 ; : int idBrushGrayNumMsg = -1 ; : int idBrushGraySBar = -1 ; : : int brushIMGBOXpendisp_tiny = -1; : int brushIMGBOXpendisp_tinyFunc(); : int *penselIMGBOXpensample = NULL; : int penselIMGBOXpensampleFunc(); : int penselIMGBOXpenlist = -1; : int penselIMGBOXpenlistFunc(); : int penedIMGBTN = -1; : int penedIMGBTNFunc(); : : /*--------------------------------------------------------*/ : /* モジュール内変数 */ : /*--------------------------------------------------------*/ : : int pen_x=0; /* 0〜3:ペン候補のうちどれを選んでいるか */ : int pensel[10]; /* 各ペン先候補(0〜3)が、何番のペンを選択しているか */ : LIST *penSampleList; : LIST *penList; : : int list_x=0; /* ペンリスト上のカーソルの位置 */ : int list_y=0; : : /*--------------------------------------------------------*/ : /* 補助関数 */ : /*--------------------------------------------------------*/ : : int grayToColor(int gray) : { : int g; : g = (255 - _min(255,_max(0,gray))) >> 3; : return g*(1024+32+1); : } : : static int getPenListPosition(int n, FRAME *fr_) : /* 引数 n = リスト内番号 */ : /* 返値 0=成功 -1=画面外 */ : /* fr←(x,y,wid,ht) */ : { : FRAME fr; : int x,y; : x = n % PENSEL_XNUM; : y = n / PENSEL_XNUM; : int ptr,a; : MMI_SendMessage(idPenSelSBar,MM_GETSCROLL,5,&ptr,&a,&a,&a,&a); : y -= ptr; : if (y < 0 || PENSEL_YNUM <= y) : return -1; : fr = OBJHYP(idPenSelSampleDBtn[y*PENSEL_XNUM + x]).fr; : fr.WID = fr.X2 - fr.X + 1; : fr.HT = fr.Y2 - fr.Y + 1; : *fr_ = fr; : return 0; : } : : /*--------------------------------------------------------*/ : /* モジュールの初期化 */ : /*--------------------------------------------------------*/ : : int pensel_init(void) : { : int i; : HYPER hyp; : for (i=0; i 0) : WGB_PSET(guiEgbPtr,x0+x,y0+y,grayToColor(g),0); : } : } : return NOERR ; : } : : /* ペン標本のボタン実行(ペン先選択) */ : // initDataPENSEL:idBrushPenDispDBtn:MJ_DBUTTONL40の呼び出し関数 : int brushDBTNpendispFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : /* 他の部品を選択不可にする */ : MTL_setFlagObj(idDesktopSelectiveHyper, MS_UNSELECT) ; : /* ペン先選択ダイアログの表示 */ : RM_moveCenter(idPenSelDlg); : MMI_SendMessage(idPenSelDlg, MM_ATTACH, 1, idDesktopAlertHyper); : MMI_SendMessage(idPenSelDlg, MM_SHOW, 0); : /* イベントループ */ : MMI_ExecSystem(); : /* ペン先選択ダイアログの消去 */ : MMI_SendMessage(idPenSelDlg, MM_ERASE, 0); : MMI_SendMessage(idPenSelDlg, MM_DETACH, 0); : /* ペン先標本の再表示 */ : MMI_SendMessage(brushIMGBOXpendisp_tiny, MM_SHOW, 0); : /* 他の部品を選択可能にもどす */ : MTL_resetFlagObj(idDesktopSelectiveHyper, ~MS_UNSELECT) ; : return NOERR ; : } : : /* サイズボタン */ : /* initDataPENSEL:brushICONwinsize[0]:MJ_ICONL40の呼び出し関数 */ : /* initDataPENSEL:brushICONwinsize[1]:MJ_ICONL40の呼び出し関数 */ : int brushICONwinsizeFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : return NOERR ; : } : : /* イレーズボタン */ : /* initDataPENSEL:brushICONerase[0]:MJ_ICONL40の呼び出し関数 */ : /* initDataPENSEL:brushICONerase[1]:MJ_ICONL40の呼び出し関数 */ : int brushICONeraseFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : return NOERR ; : } : : /* 描画モード選択 */ : // initDataPENSEL:brushMITEMmodesel[0..6]:MJ_MITEML40の呼び出し関数 : int brushMITEMmodeselFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : static char msgbuf[20]; : WINCLIP *clip; : sprintf(msgbuf,"%-9s",OBJDATA(MITEML40,kobj).string); : MMI_SendMessage(idBrushModeMItem, MM_SETMSG, 1, msgbuf); : WIN_beginUpDateObj(idBrushModeMItem, &clip); : MMI_SendMessage(idBrushModeMItem, MM_SHOW, 1, msgbuf); : WIN_endUpDateObj(clip); : return NOERR ; : } : : /* 描画濃度設定 */ : /* initDataPENSEL:brushSBARgray:MJ_SCRLL40の呼び出し関数 */ : int brushSBARgrayFunc(kobj) : int kobj ; : { : int ptr,a; : WINCLIP *clip; : static char msgbuf[5]; : /* idBrushGrayNumMsg の表示文字列の更新 */ : MMI_SendMessage( kobj, MM_GETSCROLL, 5,&ptr,&a,&a,&a,&a ) ; : sprintf( msgbuf,"%3d%%", ptr ); : MMI_SendMessage( idBrushGrayNumMsg, MM_SETMSG, 1, msgbuf ); : /* 表示の更新 */ : WIN_beginUpDateObj( idBrushGrayNumMsg, &clip ); : MMI_SendMessage( idBrushGrayNumMsg, MM_SHOW, 0 ); : WIN_endUpDateObj( clip ); : return NOERR ; : } : : /* */ : // initDataPENSEL:idBrushPenSampleTIcon[0..3]:MJ_TICONL40の呼び出し関数 : int brushTICONpensampleFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : int i; : for (i=0 ; i 0) : WGB_RBOXFILL(guiEgbPtr,fr.X+6*j,fr.Y+6*i,6,6, : grayToColor(editpat[editwid*i+j]), 0); : } : WIN_endUpDateObj(clip); : MG_mosDisp(3); : } : else if (messId == MM_MOUSEON) : { : WIN_beginUpDateObj(kobj, &clip); : if (pev->what == EVMOSDN && (pev->shift & SLEFTBTN) != 0) : { : /* マウス座標からペン先パターン内座標へ変換する関数 */ : POINT convPt(POINT pt) : { : POINT p; : p.x = (pt.x - fr.X) / 6; : p.y = (pt.y - fr.Y) / 6; : return p; : } : int ret; : EVENT *ev; : POINT lastp; : /* 最初の描画点を得る */ : lastp = convPt(*(POINT*)&pev->info); : /* イベントループ */ : for (;;) : { : int what,shift; : POINT *pt; : /* イベントセンス */ : MMI_iosense(); : if ((ret = MMI_GetEvnt(EVMOSDRAG|EVMOSUP,&ev))==NOERR) : { : /* イベント種別、シフト状態、マウス座標を得る */ : what = ev->what, shift = ev->shift; : pt = (POINT *) &ev->info; : /* マウスボタンが放されたら、自由曲線描画を終了 */ : if (what!=EVMOSDRAG && (shift&SLEFTBTN)!=0) : break; : /* ボタン部品の中でマウスがドラッグされれば描画 */ : if (MMI_CheckInside(kobj, pt) >= NOERR) : { : POINT p; : p = convPt(*pt); : if (0 <= p.x && p.x < editwid && : 0 <= p.y && p.y < editht) : editpat[editwid * p.y + p.x] = gray; : MG_mosDisp(2); : WGB_RBOXFILL(guiEgbPtr,fr.X+6*p.x,fr.Y+6*p.y, : 6,6, grayToColor(gray),0); : MG_mosDisp(3); : lastp = p; : } : } : } : } : WIN_endUpDateObj(clip); : } : return NOERR ; : } : : /* initDataPENSEL:penedTICONtool[0..4]:MJ_TICONL40の呼び出し関数 */ : int penedTICONtoolFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : : : return NOERR ; : } : : /* initDataPENSEL:penedDBTNok:MJ_DBUTTONL40の呼び出し関数 */ : int penedDBTNokFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : MMI_SetHaltFlag(TRUE); : return NOERR ; : } : : /* initDataPENSEL:penedDBTNcancel:MJ_DBUTTONL40の呼び出し関数 */ : int penedDBTNcancelFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : MMI_SetHaltFlag(TRUE); : return NOERR ; : } : : /* initDataPENSEL:penedSBARedit_hori:MJ_SCRLL40の呼び出し関数 */ : /* initDataPENSEL:penedSBARedit_vert:MJ_SCRLL40の呼び出し関数 */ : int penedSBAReditFunc(kobj) : int kobj ; : { : return NOERR ; : } : : int penedSBARgrayFunc(void) : { : int ptr,a; : static char numbuf[10]; : MMI_SendMessage(idPenEdGraySBar,MM_GETSCROLL,5,&ptr,&a,&a,&a,&a); : sprintf(numbuf, "%3d", ptr); : MMI_SendMessage( idPenEdGrayNumMsg, MM_SETMSG, 1, numbuf ); : MMI_SendMessage( idPenEdGrayNumMsg, MM_SHOW, 0 ); : return NOERR ; : } : : /* initDataPENSEL:penedDBTNsize:MJ_DBUTTONL40の呼び出し関数 */ : int penedDBTNsizeFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : return NOERR ; : } : : /*--------------------------------------------------------*/ : /* ペン先選択ダイアログ */ : /*--------------------------------------------------------*/ : : static int save_penlist(void) : { : static char *extstr[] = {"*.*",NULL}; : int atr,ret,i; : unsigned int select_cnt; : char pathname[80]; : /* ファイルダイアログのタイトル、表示位置を設定 */ : FDG_SetTitle("ペンデータ保存", "保存", "取消"); : RM_moveCenter(FDG_GetMainID()); : /* ファイルダイアログの表示 */ : ret = FDG_DspFileDlg(idDesktopFileDlgHyper, : FDG_TEXT,NULL,extstr,&select_cnt); : /* 「実行」が押されたならファイル名を取得 */ : if (ret) : FDG_GetPathName(pathname, &atr, 0); : /* ペン先データの保存 */ : if (ret) : { : FILE *fp; : if ((fp = fopen(pathname, "wb")) == NULL) : goto NOSAVE; : for (list_top(penList); !list_isOut(penList); list_next(penList)) : { : PEN *pen; : char *buf; int wid,ht; : int wh[2]; : list_getData(penList, &pen); : pen_getPattern(pen, &buf,&wid,&ht); : if (buf!=NULL) : { : wh[0] = wid; : wh[1] = ht; : fwrite(wh, sizeof(wh),1, fp); : fwrite(buf, wid*ht, 1, fp); : } : } : fclose(fp); : NOSAVE: : ; : } : /* 終了 */ : if (ret) : return 0; : else : return -1; : } : : static int load_penlist(void) : { : static char *extstr[] = {"*.*",NULL}; : int atr,ret,i; : unsigned int select_cnt; : char pathname[80]; : /* ファイルダイアログのタイトル、表示位置を設定 */ : FDG_SetTitle("ペンデータ読込", "保存", "取消"); : RM_moveCenter(FDG_GetMainID()); : /* ファイルダイアログの表示 */ : ret = FDG_DspFileDlg(idDesktopFileDlgHyper, : FDG_TEXT,NULL,extstr,&select_cnt); : /* 「実行」が押されたならファイル名を取得 */ : if (ret) : FDG_GetPathName(pathname, &atr, 0); : /* ペン先データの読み込み */ : if (ret) : { : FILE *fp; : if ((fp = fopen(pathname, "rb")) == NULL) : goto NOSAVE; : while (!feof(fp)) : { : int wh[2]; : char *buf; int wid,ht; : PEN *pen; : fread(wh, sizeof(wh), 1, fp); : wid = wh[0]; ht = wh[1]; : if ((pen = pen_new(wid,ht)) == NULL) : break; : pen_getPattern(pen, &buf,&wid,&ht); : fread(buf, wid*ht,1, fp); : pen_setPattern(pen, buf,wid,ht); /* あんましキレイじゃない */: : list_insertData(penList, &pen); : } : fclose(fp); : NOSAVE: : ; : } : /* 終了 */ : if (ret) : return 0; : else : return -1; : } : : /*--------------------------------------------------------*/ : /* ペン先選択ダイアログ・部品実行関数 */ : /*--------------------------------------------------------*/ : : int penselIMGBOXpensampleFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : int i; : PEN *pen; : FRAME fr; : for (i = 0; i < sizeof(idPenSelSampleDBtn) / sizeof(int); i++) : if (kobj == penselIMGBOXpensample[i]) : goto FOUND; : return NOERR; : FOUND: : fr = OBJHYP(kobj).fr; : list_moveTo(penList, pensel[i]); : WGB_BOXFILL(guiEgbPtr, fr.X, fr.Y, fr.X2, fr.Y2, RMcol(WHITE), 0); : if (list_getData(penList, &pen) == 0) : { : char *buf; int wid,ht; : int x,y,x0,y0; : pen_getPattern(pen,&buf,&wid,&ht); : x0 = fr.X + ( (fr.X2 - fr.X + 1) - wid ) / 2; : y0 = fr.Y + ( (fr.Y2 - fr.Y + 1) - ht ) / 2; : if (buf != NULL) : { : for (y=0; y 0) : WGB_PSET(guiEgbPtr,dspx+x,dspy+y,grayToColor(g),0); : } : } : END: : /* ペンリスト選択カーソル描画 */ : FRAME sel; : if (getPenListPosition(PENSEL_XNUM * list_y + list_x, &sel) == 0) : { : WGB_RBOXLINE(guiEgbPtr, sel.X,sel.Y,sel.WID,sel.HT, : RMcol(BLACK), 0); : WGB_RBOXLINE(guiEgbPtr,sel.X+1,sel.Y+1,sel.WID-2,sel.HT-2, : RMcol(BLACK),0); : } : return NOERR ; : } : : /* initDataPENSEL:idPenSelSBar:MJ_SCRLL40の呼び出し関数 */ : int penselSBARFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : : : : return NOERR ; : } : : /* initDataPENSEL:penselTICONconc:MJ_TICONL40の呼び出し関数 */ : int penselTICONconcFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : return NOERR ; : } : : /*initDataPENSEL:idPenSelSampleDBtn[0..3]:MJ_DBUTTONL40の呼び出し関数*/ : int penselDBTNpensampleFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : int oldx,i; : for (i=0; i 0) len = 3; else len = 1; : MMI_SendMessage(idPenSelSBar,MM_SETSCROLL,5,ptr,min,max,len,page); : MMI_SendMessage(idPenSelDlg, MM_ATTACH, 1, idDesktopAlertHyper); : MMI_SendMessage(idPenSelDlg, MM_SHOW, 0); : return NOERR ; : } : : /* initDataPENSEL:penselDBTNend:MJ_DBUTTONL40の呼び出し関数 */ : int penselDBTNendFunc(kobj, messId, argc, pev, trigger) : int kobj ; : int messId ; : int argc ; : EVENT *pev ; : int trigger ; : { : MMI_SetHaltFlag(TRUE); : return NOERR ; : } : : // initDataPENSEL:idPenSelSampleDBtn[0..14]:MJ_BUTTONL40の呼び出し関数 : int penselBTNpenselFunc(kobj) : int kobj ; : { : int i; : int ptr,a; : MMI_SendMessage(idPenSelSBar, MM_GETSCROLL, 5, &ptr,&a,&a,&a,&a); : for (i=0; i