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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VB

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

VB.NET

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

Q&A

解決済

1回答

4795閲覧

Visual Studioのカスタムコントロールの罫線描画について

trainy

総合スコア8

VB

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

VB.NET

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

0グッド

0クリップ

投稿2017/03/29 05:45

編集2017/03/29 08:09

###前提・実現したいこと
System.Windows.Forms.Buttunを継承したカスタムコントロールにてOnPaintを利用して幅と色を指定して罫線を引いています。
コントロールの上にエクスプローラ等の別画面を開いた際、罫線が画面上に見えているコントロールの幅にて引かれます。その後エクスプローラを閉じた時にその罫線が消えずに残るので、ボタンの中に罫線が引かれたままになってしまいます。(マウスオーバーすると消えます)
エクスプローラを閉じた時に自動で罫線も元の大きさにもどしたいのですがやり方を教えていただけますでしょうか。
ボタン内のbackcolorや文字を再描画できれば良いと思うのですが、、、。

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード

Visual

1Public Class CustomButton 2 Inherits Button 3 ''' <summary>枠線色</summary> 4 Private pBorderColor As Color = Color.FromArgb(213I, 223I, 229I) 5 ''' <summary>枠線影色</summary> 6 Private pBorderShadow As Color = Color.White 7 ''' <summary>枠線太さ</summary> 8 Private pBorderWidth As Integer = 1 9 ''' <summary>枠線スタイル</summary> 10 Private pBorderStyle As ButtonBorderStyle = ButtonBorderStyle.Solid 11 ''' <summary>枠線スタイル</summary> 12 Private pTextAlign As HorizontalAlignment 13 14 ''' <summary>枠線</summary> 15 Public Property BorderColor() As Color 16 Get 17 Return pBorderColor 18 End Get 19 Set(ByVal value As Color) 20 pBorderColor = value 21 End Set 22 End Property 23 24 ''' <summary>枠線影色</summary> 25 Public Property BorderShadow() As Color 26 Get 27 Return pBorderShadow 28 End Get 29 Set(ByVal value As Color) 30 pBorderShadow = value 31 End Set 32 End Property 33 34 ''' <summary>枠線太さ</summary> 35 Public Property BorderWidth() As Integer 36 Get 37 Return pBorderWidth 38 End Get 39 Set(ByVal value As Integer) 40 pBorderWidth = value 41 End Set 42 End Property 43 44 ''' <summary>枠線スタイル</summary> 45 Public Property BorderStyle() As ButtonBorderStyle 46 Get 47 Return pBorderStyle 48 End Get 49 Set(ByVal value As ButtonBorderStyle) 50 pBorderStyle = value 51 End Set 52 End Property 53 54 Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) 55 MyBase.OnPaint(e) 56 57 Dim tBorderRect As Rectangle = e.ClipRectangle 58 ControlPaint.DrawBorder(e.Graphics, tBorderRect, BorderColor, pBorderWidth, 59 pBorderStyle, BorderColor, pBorderWidth, pBorderStyle, 60 BorderColor, pBorderWidth, pBorderStyle, BorderColor, pBorderWidth, pBorderStyle) 61 62 End Sub 63 64End Class 65

###試したこと
Windows7にて現象が再現します。
クラシックのテーマだと確実に再現します。
上記テーマでなくても、画面外にフォームを移動してコントロールが画面枠に重なるようにすると再現します。
ダブルバッファリングを有効にしてみましたがダメでした。

###補足情報(言語/FW/ツール等のバージョンなど)
.netFramework4.0、Visual Studio 2015

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

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

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

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

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

guest

回答1

0

ベストアンサー

ちょっと同じ現象はでないのですが、フォームを画面外に移動して戻すと罫線色で文字が消えました。

VB.net

1Dim tBorderRect As Rectangle = e.ClipRectangle

これだと再描画が必要な部分になってしまうので、

VB.net

1Dim tBorderRect As Rectangle = Me.ClientRectangle

これでどうでしょうか。

投稿2017/03/29 13:52

crowmt

総合スコア402

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

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

trainy

2017/03/29 23:57

ご回答ありがとうございます。 まさにおっしゃる通りで、変更したら正常に動くようになりました。 今月末納期なためレイアウトに関しては諦めかけていたので感動です。 ありがとうございました。
crowmt

2017/03/30 12:59

無事に解決できたようで何よりです、 こちらも納期地獄で死にかけております。 お互い頑張りましょう!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問