前提・実現したいこと
WindowFormsにてVB.NETで丸い角のかわいいボタンを作成したかったのでGoogle先生を頼りながら作成してみましたが、3点ほど問題が解決できなかったので質問させてもらう事にしました。
作業にあたってVBについて調べたところ「四角いボタンしかないらしい」から「カスタムコントロールという物で自作する必要があるらしい」という事がわかり、下記の記事を参考にC#からVBに書き換える作業を行いました。
WindowFormsで丸いボタン
[https://qiita.com/ueruku/items/3693da7ea6a41664bca6]
変換ツールや調査と修正を繰り返して角丸ボタンの表示にまではこぎつけましたが、まだ上手くいっていない個所があるようで、いよいよ手詰まりになってしまいました。
私がプログラミング初学者であり、VBも初めてさわりました。
もしかしたら根本的に理解が間違っている個所などあるかもしれません。
なにとぞご協力お願いします。
発生している問題
1.一定の大きさ以下になると四角に塗りつぶされてしまう。
2.作成したボタンの枠線の表示が綺麗にならず、左下が見切れているように見える(実際に切れている…?)
3.テキストの中央寄せ表示ができない。
試したこと
1.ボタンの直径が小さくなるとエラーになるという事はわかったのですが、その解決方法がわかりませんでした。
2.GetGraphicsPathの中でwidthの値を変えるなどしてみましたが、ボタン自体が見切れるような結果になり、上手くいきませんでした。
3.テキストの大きさを得る方法を検索してみましたが、上手くヒットしませんでした。
該当のソースコード
VB.NETで作成中のカスタムコントロールです。ボタンを継承しています。
VB.NET
1Imports System.ComponentModel 2Imports System.Drawing.Drawing2D 3 4Public Class CustomControl 5 6 <Browsable(True), Description("ボタンの縁の表示"), Category("表示")> 7 Public Property DisplayBorder As Boolean 8 Get 9 Return _DisplayBorder 10 End Get 11 Set(value As Boolean) 12 _DisplayBorder = value 13 End Set 14 End Property 15 16 <Browsable(True), Description("角丸の半径"), Category("表示")> 17 Public Property Radius As Integer 18 Get 19 If (_Radius < 0) Then 20 Return 0 21 End If 22 23 Dim diameter = (CType(_Radius, UInteger) * 2) 24 If ((Width < diameter) OrElse (Height < diameter)) Then 25 Return (Width < Height) 26 End If 27 28 Return _Radius 29 End Get 30 Set 31 _Radius = Value 32 Refresh() 33 End Set 34 End Property 35 36 Private _DisplayBorder As Boolean = True 37 Private _BorderColor As Color = Color.Gray 38 Private _Radius As Integer = 20 39 40 Protected Overrides ReadOnly Property CreateParams As CreateParams 41 Get 42 Dim WS_EX_TRANSPARENT = 32 43 Dim cp = MyBase.CreateParams 44 CreateParams = MyBase.CreateParams 45 CreateParams.ExStyle = (cp.ExStyle Or WS_EX_TRANSPARENT) 46 Return cp 47 End Get 48 End Property 49 50 Protected Overrides Sub InitLayout() 51 Region = GetRegion() 52 End Sub 53 54 Protected Overrides Sub OnResize(ByVal e As EventArgs) 55 Region = GetRegion() 56 End Sub 57 58 Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) 59 Dim g = e.Graphics 60 g.SmoothingMode = SmoothingMode.AntiAlias 61 g.FillPath(New SolidBrush(BackColor), GetGraphicsPath(True)) 62 If DisplayBorder Then 63 g.DrawPath(New Pen(New SolidBrush(ForeColor)), GetGraphicsPath(True)) 64 End If 65 66 If (Text <> "") Then 67 '全体の幅、高さの半分からテキストの幅、高さの半分を引きたい(中央寄せになる?) 68 g.DrawString(Text, Font, New SolidBrush(ForeColor), (Width / 2), (Height / 2)) 69 End If 70 71 End Sub 72 73 Protected Function GetGraphicsPath(Optional ByVal forPaint As Boolean = False) As GraphicsPath 74 Dim diameter As Integer = (Radius * 2) 75 Dim gp = New GraphicsPath 76 77 If (2 < diameter) Then 78 Dim shrink = 0 79 gp.StartFigure() 80 gp.AddArc((0 + shrink), (0 + shrink), diameter, diameter, 180, 90) 81 gp.AddArc((Width - (diameter - shrink)), (0 + shrink), diameter, diameter, 270, 90) 82 gp.AddArc((Width - (diameter - shrink)), (Height - (diameter - shrink)), diameter, diameter, 0, 90) 83 gp.AddArc((0 + shrink), (Height - (diameter - shrink)), diameter, diameter, 90, 90) 84 gp.CloseFigure() 85 Else 86 Dim shrink = 1 87 gp.AddRectangle(New Rectangle(0, 0, (Width - shrink), (Height - shrink))) 88 End If 89 90 Return gp 91 End Function 92 93 Protected Function GetRegion() As Region 94 Return New Region(GetGraphicsPath) 95 End Function 96 97End Class
補足情報(FW/ツールのバージョンなど)
開発環境 Windows
ツール VisualStudio2019
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/15 02:53
2020/05/19 11:15