Kuin Advent Calendar 2016 - 12日目

この記事は【Kuin Advent Calendar 2016】の12日目の記事です。

←前の日の記事   →次の日の記事

【記事中で紹介しているコードについて】
コンパイルが通らない場合など、不具合があれば、@tatt61880まで連絡いただけると助かります。よろしくお願いいたします。


カレンダーを出力するKuinのコードです。
[Image:calendar.kn.png]
calendar.kn
{
	カレンダーを表示します。
	実行時のコマンドライン引数で何年何月のカレンダーを出力するかを指定します。
	指定しなければ今月のカレンダーを表示します。
}
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


←前の日の記事   →次の日の記事