ラベルの六角形の枠線

タグの編集
投稿者 tecc  (社会人) 投稿日時 2010/2/26 23:43:59
[2008] EE

以前、投稿した六角形のラベルの続きです。

Public Class Form1
    Private Sub AddMyLabel()
        Dim myLabel1 As New Mylabel
        myLabel1.Location = New Point(114, 97)
        myLabel1.Width = 400
        myLabel1.Height = 50
        myLabel1.Text = "1234567891011121314151617181920"
        myLabel1.BackColor = Color.Black
        myLabel1.TextAlign = ContentAlignment.BottomCenter
        Me.Controls.Add(myLabel1)
End Sub

Public Class Mylabel
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        Dim pa As New GraphicsPath
        Dim points(5) As Point
        Dim w As Integer = MyBase.Width
        Dim h As Integer = MyBase.Height
        pa.StartFigure()
        points(0) = New Point(0, h / 2)
        points(1) = New Point(360 / (h / 2), 0)
        points(2) = New Point(w - (360 / (h / 2)), 0)
        points(3) = New Point(w, h / 2)
        points(4) = New Point(w - (360 / (h / 2)), h)
        points(5) = New Point(360 / (h / 2), h)
        pa.AddPolygon(points)
        pa.CloseFigure()
        Dim rgn As New Region(pa)
        MyBase.Region = rgn
        rgn.Dispose()
'--ボーダーカラーの設定 
        Dim p As Color = Color.Aquamarine
        Dim db As Color = Color.Aquamarine
        ControlPaint.DrawBorder(e.Graphics, e.ClipRectangle, p, 2, _
            ButtonBorderStyle.Solid, p, 2, ButtonBorderStyle.Solid, p, 2, _
            ButtonBorderStyle.Solid, p, 2, ButtonBorderStyle.Solid)
'--ここまで 
End Sub

ラベルを継承しイベントをオーバーライドしてボーダーカラーの設定を行おうとしたのですが
左右の斜めの部分が描写されません。斜めの部分を描写する事は可能ですか?
宜しく御願いします。

できないようであれば、ラベルの座標にピクチャーボックスを置いて枠線を作るようにします。
投稿者 るしぇ  (社会人) 投稿日時 2010/2/27 01:00:03
この前の質問の時にテストしてる時に思ったんだけど、ボーダーとして既存の処理に期待する
より自分で書いた方が早いかなと。

> できないようであれば、ラベルの座標にピクチャーボックスを置いて枠線を作るようにします。
OnPaint 使っているんだから、e.Graphics を利用して自分で線を描画すればいいのでは?
[DOBON.NET > .NET Tips > 角を丸めて四角を描く]
http://dobon.net/vb/dotnet/graphics/linejoin.html
投稿者 るしぇ  (社会人) 投稿日時 2010/2/27 02:21:30
あ、違うわ。。。一応描けてるのね?
フォームの端をドラッグして大きさ変えてやると描画が上手くいかないね。。。
黒いところの範囲を微調整するべきなのかなぁ。。。
投稿者 tecc  (社会人) 投稿日時 2010/2/27 02:54:45
返信ありがとうございます。

参考URLを拝見しました。その結果、期待する動作になりました。
本当にありがとうございます。
一応、僕みたいな初心者が見る事もあるかもしれないので乗せておきます。

名前空間: System.Drawing.Drawing2D
Graphics.DrawPath: GraphicsPath を描画します。

[CODE]
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        Dim pa As New GraphicsPath
        Dim points(5) As Point
        Dim w As Integer = MyBase.Width
        Dim h As Integer = MyBase.Height
        pa.StartFigure()
        points(0) = New Point(0, h / 2)
        points(1) = New Point(360 / (h / 2), 0)
        points(2) = New Point(w - (360 / (h / 2)), 0)
        points(3) = New Point(w, h / 2)
        points(4) = New Point(w - (360 / (h / 2)), h)
        points(5) = New Point(360 / (h / 2), h)
        pa.AddPolygon(points)
        pa.CloseFigure()
        Dim rgn As New Region(pa)
        MyBase.Region = rgn
        rgn.Dispose()
        Dim p As New Pen(Color.Aquamarine, 2)
        Dim g As Graphics = e.Graphics
        g.DrawPath(p, pa)
    End Sub
[/CDOE]


  

投稿者 tecc  (社会人) 投稿日時 2010/2/27 02:57:28
前のコードの状態のままでは 左右の頂点のみ描写されてしまいました。
参考URLにSystem.Drawing.Drawing2Dの使用方法があったのでそちらを
拝見しMSDNでメンバを調べた次第です。
投稿者 るしぇ  (社会人) 投稿日時 2010/2/27 03:26:45
>前のコードの状態のままでは 左右の頂点のみ描写されてしまいました。
>参考URLにSystem.Drawing.Drawing2Dの使用方法があったのでそちらを
>拝見しMSDNでメンバを調べた次第です。 
了解です。

原因というか、追加情報。
Rectangle:長方形,矩形(くけい)
の示す通り、長方形で縁取りされた後、Region で六角形部分の描画がされてそうだから
自分で描画するのが妥当ですね。

>フォームの端をドラッグして大きさ変えてやると描画が上手くいかないね。。。
なんか、ウチの環境しばらく使わなかったら、描画関係のメソッド実行したら
変な動きをするように。。。orz
プロジェクト作成しなおしたら問題なくなりました。
(一時、ウチの環境では縞模様に描画されてしまってましたw)

余談ですが、早めに Option Strict On の設定を覚えた方が実力が上がりやすいです。
プロジェクトのプロパティで[コンパイル]のページで指定すれば全体に適用されます。
新規プロジェクト作成時に常に設定するには、[ツール]-[オプション]画面から
[プロジェクトおよびソリューション]-[Visual Basic の規定値]で設定しておきます。
Option Strict On の意味についてはヘルプ等を参照下さい。

更に言えば、質問時のサンプルコードで重要なコードまで削除されているので
気をつけましょう。(継承で Inherits のコードを省略するのは致命的です。)
サンプルコードとして最小限のコードを投稿しようとする姿勢は買いますけどね。
Option Strict On '1ファイル毎にOn/Off指定することもできます。 
Imports System.Drawing.Drawing2D 'GraphicsPath のインポートも1ファイル毎に指定できます。 

Public Class Form1
    Private Sub AddMyLabel()
        Dim myLabel1 As New Mylabel
        myLabel1.Location = New Point(114, 97)
        myLabel1.Width = 400
        myLabel1.Height = 50
        myLabel1.Text = "1234567891011121314151617181920"
        myLabel1.BackColor = Color.Black
        myLabel1.TextAlign = ContentAlignment.BottomCenter
        Me.Controls.Add(myLabel1)
    End Sub

    Public Sub New()

        ' この呼び出しは、Windows フォーム デザイナで必要です。 
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。 
        Call AddMyLabel()
    End Sub
End Class

Public Class Mylabel
    Inherits Label '継承 

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        Dim pa As New GraphicsPath
        Dim points(5) As Point
        Dim w As Integer = MyBase.Width
        Dim h As Integer = MyBase.Height
        pa.StartFigure()
        points(0) = New Point(0, CInt(h / 2))
        points(1) = New Point(CInt(360 / (h / 2)), 0)
        points(2) = New Point(CInt(w - (360 / (h / 2))), 0)
        points(3) = New Point(w, CInt(h / 2))
        points(4) = New Point(CInt(w - (360 / (h / 2))), h)
        points(5) = New Point(CInt(360 / (h / 2)), h)
        pa.AddPolygon(points)
        pa.CloseFigure()
        Dim rgn As New Region(pa)
        MyBase.Region = rgn
        rgn.Dispose()
        '--ボーダーカラーの設定  
        Dim p As New Pen(Color.Aquamarine, 2) '←太くして縁取りは良い案ですね。 
        e.Graphics.DrawPath(p, pa)
        p.Dispose() 'リソース解放しておいた方が良い 
        '--ここまで  
    End Sub
End Class