System.Drawingについて

タグの編集
投稿者 ALPHA  (社会人) 投稿日時 2016/11/7 20:49:33
始めてまして。
まだ3流PGですが、2流へのステップアップをとりあえず目指しています。

VB(VS2013)で開発しているのですが、
・スプレッドなるアドインを使っての開発
・一部の画面は、図形のレイアウトも有り
と、今までに経験が無く、ちょっと厄介な感じです。。。

今、一部の画面、簡単に言うとVisioっぽい画面を作るのに調査しているのですが
工数も無くなって来た為、悩んでいます。

色々調べて、公式サイトで、
『「Customシェイプクラスの利用により、.NET Frameworkより提供されている
System.Drawing名前空間の各機能を用いた独自のシェイプオブジェクトを作成することができます。
また、作成されたオブジェクトはSPREADより提供されている各シェイプと同様に制御することが可能です」』
という記載を見つけ、下記の★サンプルコードである程度複雑な図形も可能だと分かりました。

ただ、フローチャートで良く見る、四角の両端が二重線になっているような記号のように
オリジナルの記号を作りたいようです。
(正直、Visioでやってよーと思います)

とにかく、System.Drawingについての知識が皆無である為、
下記のソースの「gpath」に、複数の図形を組み合わせたり、図形の一部を変更したものを渡して、
カスタムシェイプというものを作るにはどのようにすれば良いのか良く分かりません。
(具体的には、「System.Drawing.Point」って、線を繋いで図形にしているようですが
その線の一部を変更するには?という疑問などです)

有識者の皆様、ご回答宜しくお願いします。

★サンプルコード(このように稲妻のような図形が出来ます)


 Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles MyBase.Load

   'グラフィックを作成します 
   Dim pts As System.Drawing.Point() = {New System.Drawing.Point(25, 0), _
               New System.Drawing.Point(0, 50), _
               New System.Drawing.Point(20, 50), _
               New System.Drawing.Point(5, 100), _
               New System.Drawing.Point(40, 40), _
               New System.Drawing.Point(20, 40), _
               New System.Drawing.Point(40, 0), _
               New System.Drawing.Point(25, 0)}

   Dim gpath As System.Drawing.Drawing2D.GraphicsPath = New System.Drawing.Drawing2D.GraphicsPath
   gpath.AddPolygon(pts)

   'カスタムシェイプオブジェクトを作成します 
   Dim pso As New FarPoint.Win.Spread.DrawingSpace.CustomShape
   '作成したグラフィックを設定します 
   pso.Shape = gpath
   '各属性を設定します 
   pso.SetBounds(120, 10, 120, 120)
   pso.BackColor = Color.Red
   pso.AlphaBlendBackColor = 90
   pso.ShadowColor = Color.Blue
   pso.AlphaBlendShadowColor = 90
   pso.ShadowDirection = FarPoint.Win.Spread.DrawingSpace.ShadowDirection.Right
   pso.ShadowOffset = 5

   FpSpread1.ActiveSheet.AddShape(pso)

投稿者 YuO  (社会人) 投稿日時 2016/11/8 22:58:05
まず,パス,というのは複数の図形の集まり,というのが近いでしょうか。
Windows GDI時代からある考え方です。

MSDN)
https://msdn.microsoft.com/ja-jp/library/kz53wdz9(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/dd162779(v=vs.85).aspx


提示されているコードでは,AddPolygonを使っているので,Polygon,つまりは多角形をパスに追加しています。
Pointの配列は,多角形の頂点になります。
MSDN)
https://msdn.microsoft.com/ja-jp/library/16k3da3w(v=vs.110).aspx

同じように,Addなんたら,というメソッドを使うことで,曲線を追加したり,文字の輪郭を追加したりすることができます。



入門的なところでパスを扱っているところとなると,
・DOBON.NETさんのところ
http://dobon.net/vb/dotnet/graphics/drawpath.html
・WisdomSoftさんのところ
http://www.wisdomsoft.jp/494.html
http://wisdom.sakura.ne.jp/system/msnet/msnet_win11.html (旧サイト)
などが見つかりました。MSDNより,このようなサイトの方がわかりやすいと思います。
投稿者 ALPHA   (社会人) 投稿日時 2016/11/25 20:17:59
Yu0さん

参考になるサイトをご紹介いただいてありがとうございます。
私も3流PGなりに調べて、試してみたのですが、設定可能なのは、graphicspathクラスによるパス情報のみで、draw系の機能(Penで色を変えたり等)は使えないようです。
私が調べた限りですが。
もしそうだったら、「System.Drawing名前空間の各機能を用いた~」なんて書くなよーって思いますが。。。

投稿者 ALPHA   (社会人) 投稿日時 2016/11/28 21:05:14
結局、graphicspathクラスによるパス指定しか出来ないようですので、解決していませんが、解決とします。
投稿者 masaX  (社会人) 投稿日時 2016/11/29 10:43:00
こんな風なのはどうですか?(同じような図形を描画してみました)
わりと自由に図形が描画できると思います。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'ImageオブジェクトのGraphicsオブジェクトを作成する
        Dim g As Graphics = Me.CreateGraphics

        Dim xx As Integer = 0
        '多角形の点の配列を作成
        Dim ps As Point() = {New System.Drawing.Point(25 + xx, 0),
                New System.Drawing.Point(0 + xx, 50),
                New System.Drawing.Point(20 + xx, 50),
                New System.Drawing.Point(5 + xx, 100),
                New System.Drawing.Point(40 + xx, 40),
                New System.Drawing.Point(20 + xx, 40),
                New System.Drawing.Point(40 + xx, 0),
                New System.Drawing.Point(25 + xx, 0)}
        Dim bra As New SolidBrush(カラー_32bit("80FF0000"))
        '多角形を描画する
        g.FillPolygon(bra, ps)

        '多角形2の点の配列を作成
        xx = 5
        Dim ps2 As Point() = {New System.Drawing.Point(25 + xx, 0),
                New System.Drawing.Point(0 + xx, 50),
                New System.Drawing.Point(20 + xx, 50),
                New System.Drawing.Point(5 + xx, 100),
                New System.Drawing.Point(40 + xx, 40),
                New System.Drawing.Point(20 + xx, 40),
                New System.Drawing.Point(40 + xx, 0),
                New System.Drawing.Point(25 + xx, 0)}
        Dim bra2 As New SolidBrush(カラー_32bit("80808080"))
        '多角形2を描画する
        g.FillPolygon(bra2, ps2)

        '多角形の周りに線を描画する
        g.DrawPolygon(Pens.Black, ps)

        'リソースを解放する
        bra.Dispose()
        bra2.Dispose()
        g.Dispose()
    End Sub

    Public Function カラー_32bit(hx As String) As Color
        Dim colTx As String = "&H" & hx
        Dim db As Double = Val(colTx)
        Dim int As Integer = CInt(db)
        Dim col As Color = Color.FromArgb(int)
        Return col
    End Function