TOP Column Menu 戻る
WideStudio かんどころ(7)
WideStudioによる無作法なC++  2003/05/12

第七回 本格的カレンダーのプログラムを作る
デザインを定義する

復習
前回までで、ある年月のカレンダー作成にあたっては、その月の1日の曜日がわかり、月末が何日かわかれば出来るということでした。

定義ファイルを作ってみよう
前回までのカレンダーのデザインでは各配列の最初の配列を元にデザインは作成されました。今回は明確にデザインを定義してみましょう。

横幅についてまず定義しましょう。

WideStudioでは横幅は整数なのでデザイン的に各要素(①〜⑤)の横幅の個数で割り切れる必要がある。
6は3の倍数であるので
横幅は6×7つまり42の倍数である必要があるわけです。

//カレンダーの横幅を CAL_WD として今回は42の6倍の252とした
#define CAL_WD 252
//日のボタン⑤ DD_WD の幅はカレンダーの横幅の7分の1である
#define DD_WD ((CAL_WD)/7)
//月のボタン③ MM_WD の幅はカレンダーの横幅の6分の1である
#define MM_WD ((CAL_WD)/6)
//曜日のボタン④ YB_WD の幅は⑤の日 DD_WD のボタンと同じ横幅である
#define YB_WD DD_WD
//月のボタン③ MM_HT の高さを30とする
#define MM_HT 30
//日のボタン⑤ DD_HT の高さは横幅と同じとする
#define DD_HT DD_WD
//曜日のボタン④ YB_HTの高さはMM_HT と同じにする
#define YB_HT MM_HT
//タイトルラベルTTL_HT(①)についての高さは日のボタン⑤ DD_HT と同じにする
#define TTL_HT DD_HT
//年移動ボタンYY_HT(②)についての高さはタイトルラベル① TTL_HT と同じにする
#define YY_HT TTL_HT
//年移動ボタン② YY_WD の幅はカレンダーの横幅の3分の1である
#define YY_WD (CAL_WD/3)
//タイトルラベル①の幅TTL_WDは年移動ボタン② YY_WD の幅と同じにする
#define TTL_WD YY_WD
//Y軸のオフセットの値を0とする
#define ST_TOP 0
//X軸のオフセットの値を0とする
#define ST_LEFT 0
//オフセットの値については
//Y軸についてカレンダーのスタートを日ボタンの半分からすたーとし
//#define ST_TOP (DD_HT/2)
//X軸についてカレンダーのスタートを日ボタンの半分からすたーとし
//#define ST_TOP (DD_WD/2)
calender.hの内容

// CAL_WDは6×7(42)の倍数であること
#define CAL_WD 252
#define DD_WD ((CAL_WD)/7)
#define MM_WD ((CAL_WD)/6)
#define YB_WD DD_WD
#define MM_HT 30
#define DD_HT DD_WD
#define YB_HT MM_HT
#define TTL_HT DD_HT
#define YY_HT TTL_HT
#define YY_WD (CAL_WD/3)
#define TTL_WD YY_WD

#define ST_TOP 0
#define ST_LEFT 0
// #define ST_TOP (DD_HT/2)
// #define ST_LEFT (DD_WD/2)

上記定義を前提とすればタイトル部分のデザイン設定は以下のようになる
int set_ttl(void)
{
    int i,ht;
    char *mvyy_ttl[]={"<<前年移動","次年移動>>",NULL};
    newvlab_000->setProperty(WSNwidth,TTL_WD);
    newvlab_000->setProperty(WSNx,(ST_LEFT+YY_WD));
    newvlab_000->setProperty(WSNy,ST_TOP);
    newvlab_000->setProperty(WSNheight,TTL_HT);
    ht=TTL_HT;
    mvyy[0]->setProperty(WSNx,ST_LEFT);
    mvyy[1]->setProperty(WSNx,(ST_LEFT+YY_WD+TTL_WD) );
    for(i=0;i<2;i++){
        mvyy[i]->setProperty(WSNwidth,YY_WD);
        mvyy[i]->setProperty(WSNy,ST_LEFT);
        mvyy[i]->setProperty(WSNheight,ht);
        mvyy[i]->setProperty(WSNlabelString,mvyy_ttl[i]);
    }
    return(ht+ST_TOP);
}

同様に定義を前提とすれば曜日部分のデザイン設定は以下のようになる
int set_yobi(int sty)
{
    char *yb_ttl[]={
    "日","月","火","水","木","金","土",NULL
    };
    int i,x,ht;
    ht=YB_HT;
    for(i=0;i<7;i++){
        x=ST_LEFT+i*YB_WD;
        yb[i]->setProperty(WSNheight,ht);
        yb[i]->setProperty(WSNwidth,YB_WD);
        yb[i]->setProperty(WSNx,x);
        yb[i]->setProperty(WSNy,sty);
        yb[i]->setProperty(WSNlabelString,yb_ttl[i]);
    }
    return((sty+ht));
}