ホーム | プログラミングTClock |
2004/02/02記。02/10修正。
ここでは、ソースをいじって、TClock Lightに新しい書式を加える例を紹介します。「睦月」、「如月」……のような和風の月名を表示させてみます。いじるソースは、dll/format.c、dll/formattime.c、dll/tcdll.hだけです。
書式拡張の基本は、dll/format.c で配列 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 を追加すると、和風の月名が表示されます。
