表みたいなControlとか

表による表現をする場合、DataGridViewを弄ってみたり、ListViewをカスタムドローしてみたり、それでも足りなきゃ商用コンポーネントを買ってみたりもするわけですが。
でも、微妙にニーズが合わないこともあるわけで(・∀・)
その落差を埋めるために、色々と小細工したり、仕様を変えてみたりなんて努力をすることもありますが。


でも、変な努力をするよりはスクラッチで書いちまった方が速くネ(゚Д゚,,)?、っというわけで、そんなサンプルを作っていた日。
汎用コンポーネントを作るとそれなりに面倒だけど、1日かそこいらでできる程度のものなら、標準Controlを弄るより面倒も無いし、商用製品を買うために稟議書を書く面倒も無い、っと(・∀・)
まあ、自分の所なんかではこういうのを良くやるわけですよ。


作ってみたのは行と列ヘッダを持ち、縦方向スクロールありの表Control。
OnMouseDown()、OnMouseUp()、OnMouseMove()の処理を書いたり、描画処理ではGraphics.FillRectangle()だのGraphics.DrawLine()だのをシコシコ書いていくわけですが。
こういうの、作るのが面倒だと思う人もいるようですが、ソウデモナイですよ(*´∀`)
例えばWebなんかでは凝ったUIを作るためにHTMLやCSSJavaScriptをシコシコ書くわけですが、それと比べて面倒というほどの事はないというか、むしろこっちのが楽ジャネ?、とも思いますし。


で、ついでに、この前見つけたSourceMonitorでMetricsも計ってみたり(・∀・)
計測結果はこんなん。

[CalendarView.cs]
Lines: 873
Statements: 299
Methods: 43

LinesやMethodsが多いのは、マウスのトラッカーやレンダーを部品わけせずに1つのクラスでControlとして作ってしまっているから。
後、Controlなので、色だの高さや幅だの、描画関連のプロパティで数は増えてますが(´ω`)

Calls per Method: 2.37
Statements per Method: 4.79

で、描画関連だとか、単純なプロパティが多い分、この辺の値は小さくなる傾向に。
ちなみに描画に関しては、色々とやりたくなったらその部分はレンダークラスとして分離して、描画処理を切り替えられるようにしたりする*1わけですが、今回はまあその辺は適当に(゜∀゜)

Max Complexity: 9
Avg Complexity: 1.72
Max Depth: 5
Avg Depth: 2.27

ちなみにComplexityが9なのはPreProcessMessage()で、キーメッセージによるスクロール処理の分岐のところでした(゚д゚)
後は、描画や位置計算なんかは、行ヘッダ、列ヘッダ、セル単位なんかで細かい単位に分割しているので、ソース全体としてDepthやComplexityの値はそう大きくなってないですニョロ。


明日はまた見積もりDaysなお燗(´ω`)

*1:SimpleRendarだとかOffice2003Rendarだとか、そんなカンジで