ホーム | プログラミングTClock |


2004/02/02記。02/10修正。

書式拡張の簡単なサンプル

ここでは、ソースをいじって、TClock Lightに新しい書式を加える例を紹介します。「睦月」、「如月」……のような和風の月名を表示させてみます。いじるソースは、dll/format.c、dll/formattime.c、dll/tcdll.hだけです。

書式拡張の基本は、dll/format.c で配列 format_handers に書式と書式処理用の関数を加え、どこかのソースに書式処理用の関数を記述する、ということです。

配列 format_handers への追加

dll/format.c で配列 format_handers を初期化しているところに、新しい書式文字列と、関数を追加します。書式は "JM" 、関数は JpMonthHandler とします。

struct {
    wchar_t ch;
    wchar_t* prefix;
    HANDLERFUNC func;
} format_handers[] =
{
    { '/', NULL, SDateHandler },
    { ':', NULL, STimeHandler },
    (中略)
    { 0, L"USTR", UStrHandler },
    
    { 0, L"JM", JpMonthHandler },
    // add your functions
}

文字列の用意

Windows APIでは和風の月名は取り出せませんので、自分で用意しなければなりません。dll/formattime.cの頭で、外部変数に次のような配列 m_JpMonth を追加します。

static wchar_t m_EraStr[11];
static int m_AltYear;

static wchar_t *m_JpMonth[12] = 
    { L"睦月", L"如月", L"弥生", L"卯月", L"皐月", L"水無月", 
      L"文月", L"葉月", L"長月", L"神無月", L"霜月", L"師走" };

書式処理用の関数を作成

dll/formattime.c に書式 JM を処理する関数 JpMonthHandler を作ります。まず、pstruc->pt から月の数を取り出します。構造体 SYSTEMTIME のメンバ変数 wMonth では、1月 = 1、2月 = 2、なので値から1引きます。

"JM" の分だけポインタ pstruc->sp を進めます。

ポインタ p が 配列 m_JpMonth の中の月名を指すようにして、pstruc->dp にコピーします。

void JpMonthHandler(FORMATHANDLERSTRUCT* pstruc)
{
    const wchar_t *p;
    int month;
    
    month = (int)pstruc->pt->wMonth - 1;
    
    pstruc->sp += 2;
    
    p = m_JpMonth[month];
    while(*p && *pstruc->dp) *pstruc->dp++ = *p++;
}

dll/tcdll.h に JpMonthHandler の宣言を加えます。

void TIMEHandler(FORMATHANDLERSTRUCT* pstruc);
void MSecondHandler(FORMATHANDLERSTRUCT* pstruc);
void JpMonthHandler(FORMATHANDLERSTRUCT* pstruc);

できあがり

TClockのプロパティの書式で、「自分で書式を入力する」に JM を追加すると、和風の月名が表示されます。

できあがりの画面