この記事は【Kuin Advent Calendar 2016】の12日目の記事です。
【記事中で紹介しているコードについて】
コンパイルが通らない場合など、不具合があれば、@tatt61880まで連絡いただけると助かります。よろしくお願いいたします。
{
カレンダーを表示します。
実行時のコマンドライン引数で何年何月のカレンダーを出力するかを指定します。
指定しなければ今月のカレンダーを表示します。
}
const title: []char :: "Calendar"
var font: draw@Font
var year: int
var month: int
var h: int
var d: int
func main()
do lib@intToDate(lib@now(), &@year, &@month, &, &, &, &)
if(^lib@cmdLine() > 0)
do @year :: lib@cmdLine()[0].toInt(&)
if(^lib@cmdLine() > 1)
do @month :: lib@cmdLine()[1].toInt(&)
end if
end if
assert @year >= 1582
assert 1 <= @month & @month <= 12
var m: int :: (@month + 9) % 12 + 3
var y: int :: @year - (m > 12 ?(1, 0))
do @h :: (y + y / 4 - y / 100 + y / 400 + (13 * (m + 1)) / 5) % 7
do y :+ 1
do @d :: 28 + [3, 3, (y % 400 = 0 | y % 100 <> 0 & y % 4 = 0) ?(1, 0), 3, 2, 3, 2, 3, 3, 2, 3, 2][m % 12]
const wndSizeW: int :: 360
const wndSizeH: int :: 240
var wndMain: wnd@Wnd :: wnd@makeWnd(null, %aspect, wndSizeW, wndSizeH, @title)
var drawMain: wnd@Draw :: wnd@makeDraw(wndMain, 0, 0, wndSizeW, wndSizeH, %scale, %scale, false)
do @font :: draw@makeFont("Meiryo", 20, false, false, false, 20.0)
do drawMain.onPaint :: onPaint
func onPaint(wnd: wnd@WndBase, width: int, height: int)
do @font.draw(10.0, 5.0, "\{@year}/\{@month.toStrFmt("02d")}", 0xFFFFFFFF)
for i(@h, @d + @h - 1)
do @font.draw(10.0 + 50.0 * (i % 7) $ float, 40.0 * (i / 7 + 1) $ float, (i - @h + 1).toStrFmt("2d"), 0xFFFFFFFF)
end for
do draw@render(0)
end func
while(wnd@act())
end while
end func