質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

7625閲覧

VB.NETでの角丸ボタンの作成とテキストの中央寄せ表示方法

unio

総合スコア12

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/05/12 03:38

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1.ボタンの直径が小さくなるとエラーになる

これはどうしようもないかも。
プロパティ代入時にチェックするくらいでしょうか。

2.ボタン自体が見切れるような結果

・Width, Height ではなく、ClientSize.Width, ClientSize.Height を元に計算
・背景を塗りつぶす処理よりも線を引く処理での高さ、幅を小さくする

3.テキストの大きさを得る方法

「Graphics.MeasureString メソッド」
https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.graphics.measurestring

「TextRenderer.MeasureText メソッド」
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.textrenderer.measuretext

で取得できますが、StringFormat や TextFormatFlags を指定して ClientRectangle に描画したほうが楽です。

「方法: 描画テキストを配置する」
https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/advanced/how-to-align-drawn-text

投稿2020/05/12 14:06

KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unio

2020/05/15 02:53

回答ありがとうございます。小さな角丸ボタンなどは別の方法を考えたほうが良さそうですね。 テキスト配置はいくつも方法があるようなので参考に色々と試してみます。 無事完成したら自己解決に記載します!ありがとうございます!
unio

2020/05/19 11:15

自己解決ではないのでやはりこちらに記載・・・ おかげ様で2と3は無事に解決しました!1は引き続き調査してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問