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

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

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

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

Q&A

解決済

3回答

2009閲覧

継承したTextBoxが上寄せになってしまう

Kruth

総合スコア13

VB.NET

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

0グッド

0クリップ

投稿2020/01/07 06:50

編集2020/01/07 06:59

https://www.projectgroup.info/tips/Microsoft.NET/comm_0016.html

上記サイトを参考に、枠線の色を変更出来るTextBoxを作成しました。
ビルドしてFormに置き、実際に入力してみると通常のTextBoxより上に表示されてしまいます。

コードの中で影響を及ぼしている箇所があるんでしょうか?
また、中央に表示させるにはどうしたらいいでしょうか?

よろしくお願いします。

VB.NET

1Imports System.Drawing 2Imports System.Windows.Forms 3Imports System.ComponentModel 4 5Public Class ColorTextBox 6 Inherits TextBox 7 Private Const WM_PAINT = &HF 8 Private _CustomBorderColor As Color = Color.FromArgb(171, 173, 179) 9 10 ''' <summary> 11 ''' TextBoxの枠線の色を指定します。 12 ''' </summary> 13 <Description("TextBoxの枠線の色を指定します。")> 14 Public Property CustomBorderColor() As Color 15 Get 16 Return _CustomBorderColor 17 End Get 18 Set(ByVal value As Color) 19 If _CustomBorderColor <> value Then 20 _CustomBorderColor = value 21 Me.Refresh() 22 End If 23 End Set 24 End Property 25 26 ''' <summary> 27 ''' WndProcメソッドオーバーライド 28 ''' </summary> 29 ''' <param name="m"></param> 30 Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 31 MyBase.WndProc(m) 32 If (m.Msg = WM_PAINT) Then 33 Using g As Graphics = CreateGraphics() 34 If _CustomBorderColor <> Color.FromArgb(171, 173, 179) Then 35 Dim p As New System.Drawing.Pen(_CustomBorderColor) 36 g.DrawRectangle(p, 0, 0, Me.Width - 1, Me.Height - 1) 37 Else 38 ControlPaint.DrawVisualStyleBorder(g, New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)) 39 End If 40 End Using 41 End If 42 End Sub 43End Class

追記
参考画像はっておきます
左:継承TB 右:通常TB
sample

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

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

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

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

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

guest

回答3

0

ウインドウには、クライアント領域と、非クライアント領域があります。
フォームでいうとタイトルバー、枠線、AutoScroll のときのスクロールバーが非クライアント領域になります。

BorderStyle.FixedSingle のとき、非クライアント領域は存在せず、枠線はクライアント領域に描画されます。

対して、BorderStyle.Fixed3D のとき、枠線は非クライアント領域に描画されますので CreateGraphics で作成した Graphics オブジェクトでは上書きできません。

非クライアント領域に描画するには、GetWindowDC API で取得したデバイスコンテキストハンドルから Graphics オブジェクトを作成して描画します。

VB

1Imports System.Drawing 2Imports System.Windows.Forms 3Imports System.ComponentModel 4Imports System.Runtime.InteropServices 5 6Public Class ColorTextBox 7 Inherits TextBox 8 9 Private _CustomBorderColor As Color = Color.FromArgb(171, 173, 179) 10 11 Public Property CustomBorderColor() As Color 12 Get 13 Return _CustomBorderColor 14 End Get 15 Set(ByVal value As Color) 16 If _CustomBorderColor <> value Then 17 _CustomBorderColor = value 18 Me.Refresh() 19 End If 20 End Set 21 End Property 22 23 Private Const WM_PAINT As Integer = &HF 24 Private Const WM_NCPAINT As Integer = &H85 25 Private Const WM_NCACTIVATE As Integer = &H86 26 27 <DllImport("User32")> 28 Private Shared Function GetWindowDC(hWnd As IntPtr) As IntPtr 29 End Function 30 31 <DllImport("User32")> 32 Private Shared Function ReleaseDC(hwnd As IntPtr, hdc As IntPtr) As Integer 33 End Function 34 35 Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 36 MyBase.WndProc(m) 37 Select Case m.Msg 38 Case WM_NCACTIVATE, WM_NCPAINT, WM_PAINT 39 Select Case BorderStyle 40 Case BorderStyle.Fixed3D 41 Dim hdc As IntPtr = GetWindowDC(m.HWnd) 42 Using g As Graphics = Graphics.FromHdc(hdc) 43 DrawBorder(g) 44 End Using 45 ReleaseDC(m.HWnd, hdc) 46 Case BorderStyle.FixedSingle 47 Using g As Graphics = CreateGraphics() 48 DrawBorder(g) 49 End Using 50 End Select 51 End Select 52 End Sub 53 54 Private Sub DrawBorder(g As Graphics) 55 Dim bounds As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1) 56 If _CustomBorderColor <> Color.FromArgb(171, 173, 179) Then 57 Using p As New System.Drawing.Pen(_CustomBorderColor) 58 g.DrawRectangle(p, bounds) 59 End Using 60 Else 61 ControlPaint.DrawVisualStyleBorder(g, bounds) 62 End If 63 End Sub 64 65End Class

投稿2020/01/08 06:40

編集2020/01/08 06:49
KOZ6.0

総合スコア2628

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

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

0

ベストアンサー

SingleでのDrawRectangleが開始点を0,0にしても
TB枠内に表示されてしまいます

この意味が分からなかったのですが、BorderStyle=Fixed3Dの時
ということでしょうか。(参考画像ではSingleで重なっているように見えますが)

ここからは推測です。

文字縦位置を厳密に中心にする為にBorderStyle=Fixed3Dにしたが開始点を0,0
にしても今度は枠線が描画できなかったということですね。
この場合独自コントロールを描画する等の工夫が必要です。
下記が参考になるかと思います。

テキストボックスに入力する値を上下中央揃えにしたい

投稿2020/01/08 04:04

polupolu_0218

総合スコア65

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

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

0

継承TBと通常TBで文字の縦位置が異なっているのは恐らく

継承TBのBorderStyleはBorderStyle.FixedSingle
通常TBのBorderStyleはBorderStyle.Fixed3D

になっているからだと思います。通常TBをFixedSingleにして比べてみてください。

投稿2020/01/07 09:10

polupolu_0218

総合スコア65

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

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

Kruth

2020/01/08 02:30

ありがとうございます。 通常TBでもSingleにしたら上よりになりました、これで原因は判明したんですが、SingleでのDrawRectangleが開始点を0,0にしてもTB枠内に表示されてしまいます。 どうしたら枠線の上に描画できますか? 因みに-1,-,1にしたら線が消えました。
polupolu_0218

2020/01/08 05:08 編集

>SingleでのDrawRectangleが開始点を0,0にしても >TB枠内に表示されてしまいます この意味が分からなかったのですが、BorderStyle=Fixed3Dの時 ということでしょうか。(参考画像ではSingleで重なっているように見えますが) ここからは推測です。 文字縦位置を厳密に中心にする為にBorderStyle=Fixed3Dにしたが開始点を0,0 にしても今度は枠線が描画できなかったということですね。 この場合独自コントロールを描画する等の工夫が必要です。 下記が参考になるかと思います。 https://teratail.com/questions/61641
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問