表みたいなControlとか
表による表現をする場合、DataGridViewを弄ってみたり、ListViewをカスタムドローしてみたり、それでも足りなきゃ商用コンポーネントを買ってみたりもするわけですが。
でも、微妙にニーズが合わないこともあるわけで(・∀・)
その落差を埋めるために、色々と小細工したり、仕様を変えてみたりなんて努力をすることもありますが。
でも、変な努力をするよりはスクラッチで書いちまった方が速くネ(゚Д゚,,)?、っというわけで、そんなサンプルを作っていた日。
汎用コンポーネントを作るとそれなりに面倒だけど、1日かそこいらでできる程度のものなら、標準Controlを弄るより面倒も無いし、商用製品を買うために稟議書を書く面倒も無い、っと(・∀・)
まあ、自分の所なんかではこういうのを良くやるわけですよ。
作ってみたのは行と列ヘッダを持ち、縦方向スクロールありの表Control。
OnMouseDown()、OnMouseUp()、OnMouseMove()の処理を書いたり、描画処理ではGraphics.FillRectangle()だのGraphics.DrawLine()だのをシコシコ書いていくわけですが。
こういうの、作るのが面倒だと思う人もいるようですが、ソウデモナイですよ(*´∀`)
例えばWebなんかでは凝ったUIを作るためにHTMLやCSSにJavaScriptをシコシコ書くわけですが、それと比べて面倒というほどの事はないというか、むしろこっちのが楽ジャネ?、とも思いますし。
で、ついでに、この前見つけた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だとか、そんなカンジで