自作コントロール(矢印)について悩んでいます

タグの編集
投稿者 やむちゃ  (社会人) 投稿日時 2016/9/30 17:32:11
初めて投稿致します(VB.NET初心者です)

┬─┬─┬─┬─┬─
│月│9 │9 │9 │9                                    
┼─┼─┼─┼─┼─
│日│1 │2 │3 │4  
┼─┼─┼─┼─┼─
│   ――――→
│      3
┼─┼─┼─┼─┼─

上の図のようなWBSをVB.NETで作ろうと考えています。
(Windows7Pro & VisualBasic2010)

WBSには進捗を表す矢印コントロールが必要で
以下①~③の機能を考えています。

①マウスでの移動及びサイズ変更が可能とする。
②サイズ変更時は左右方向にしか大きさを変更できないようにする。
③移動及びサイズ変更はグリッド単位とし、グリッドの情報を反映したい。
 →上図の場合、9/1~3なので、矢印の下に「3」と表示している。
  
色々調べて、グリッド部はTableLayoutPanelで
月日の部分は、TableLayoutPanelの各CellにLabelを当てはめています。

肝心の矢印コントロールは、今のところ
・PictureBoxに矢印を書いて、それをユーザーコントロール化する。
 →本来はそこにグリッド情報を表示するLabelも必要なのでしょうが
  色々難しそうなので、保留にしてます。
くらいしか思い浮かばず悩んでいます。

上記①~③の機能を備えた矢印コントロールを自作するにあたり
皆様の知恵をお貸しいただけませんでしょうか。
宜しくお願い致します。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/9/30 20:20:13
自分のところでは DataGridView を使いました。
日数が多くなれば横スクロールで対応できますし、固定列も作れますので。


マウスドラッグで範囲選択させてから、
右クリックでメニューを出して確定 or キャンセル。
矢印を描くのではなく、確定期間内のセル背景色を変える事で表現しています。


期間を確定させた後は、データ入力用のダイアログを表示させて完了。
ここでいうデータとは、そちらの仕様で言えば、矢印の下に表示する「3」のことなので、
そちらは範囲を確定させれば、ダイアログなど出さずとも即時確定しますね。


ちなみに入力させたデータは、セルをマージして表示させました。
実際にはマージ機能が無いので、CellPainting イベントを利用して
それっぽく見せただけですけれども。
投稿者 やむちゃ  (社会人) 投稿日時 2016/9/30 21:37:49
魔界の仮面弁士 様

早々にご回答いただきありがとうございます。

グリッドをTableLayoutPanelからDataGridViewに変更する事は
問題ないかもしれませんが、
基本設計が、矢印を用いる事を前提としている為、
代替案として、セルの背景色で期間を表現するのは、無理そうです。

矢印のコントロールについて、何かご教示いただけると嬉しいです。

以上、宜しくお願いいたします。
投稿者 やむちゃ  (社会人) 投稿日時 2016/10/5 21:24:42
とりあえず、矢印コントロールの必要がなくなった為、本質問はクローズとさせていただきます。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/10/13 11:44:38
直線なら、フォームに LineShape を貼るだけで表現できます。
(Microsoft.VisualBasic.PowerPacks 名前空間の LineShape クラス)

ただ、ドラッグ等を考慮するのなら、自前で描画した方が良いでしょう。

矢印画像を用意して伸縮させるのも確かに手ではありますが、
矢尻も伸張してしまうので、LineCap.ArrowAnchor で描画するのが良い気がします。
http://dobon.net/vb/dotnet/graphics/drawarrow.html
投稿者 やむちゃ  (社会人) 投稿日時 2016/10/18 19:49:50
魔界の仮面弁士さま
アドバイスありがとうございます。
ただ、この件はLineShapeやRectangleShapeを組み合わせたコントロールを
自作する必要が出てきました。。。
また質問させていただくかも知れませんが、よろしくお願い致します。