【发布时间】:2009-03-18 14:17:16
【问题描述】:
解决方案:
感谢下面的Patrick,我已将 C# CodeProject 版本重构为适合我的 VB.NET 版本。希望对大家也有帮助:
Partial Public Class WatermarkedTextBox
Inherits TextBox
Private _waterMarkColor As Color = Color.LightGray
Public Property WaterMarkColor() As Color
Get
Return _waterMarkColor
End Get
Set(ByVal value As Color)
_waterMarkColor = value
End Set
End Property
Private _waterMarkText As String = "Watermark"
Public Property WaterMarkText() As String
Get
Return _waterMarkText
End Get
Set(ByVal value As String)
_waterMarkText = value
End Set
End Property
Sub New()
End Sub
Protected Overloads Overrides Sub OnCreateControl()
MyBase.OnCreateControl()
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
MyBase.WndProc(m)
Const WM_PAINT As Integer = &HF
If m.Msg = WM_PAINT Then
If Text.Length <> 0 Then
Return
End If
Using g As Graphics = Me.CreateGraphics
g.DrawString(WaterMarkText, Me.Font, New SolidBrush(WaterMarkColor), 0, 0)
End Using
End If
End Sub
Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
MyBase.OnTextChanged(e)
Invalidate()
End Sub
Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
MyBase.OnLostFocus(e)
Invalidate()
End Sub
Protected Overrides Sub OnFontChanged(ByVal e As System.EventArgs)
MyBase.OnFontChanged(e)
Invalidate()
End Sub
Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
'' added so the watermark is not cleared until text is entered
MyBase.OnGotFocus(e)
Invalidate()
End Sub
End Class
我正在构建一个信息亭应用程序,为了保持美观,我决定实现一个带水印的文本框作为输入字段。我在CodeProject 上找到了this project,将其转换为VB.NET 并将其放入我的应用程序中。从某种意义上说,它可以很好地添加水印并清除它们,但是当我输入文本时会发生这种情况:
空:
填充:
所以基本上它不会清除整个水印,只是为文本框的默认高度分配的空间。这是转换后的代码:
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
Imports System.Drawing
Partial Public Class WatermarkedTextBox
Inherits TextBox
Private oldFont As Font = Nothing
Private waterMarkTextEnabled As Boolean = False
#Region "Attributes"
Private _waterMarkColor As Color = Color.LightGray
Public Property WaterMarkColor() As Color
Get
Return _waterMarkColor
End Get
Set(ByVal value As Color)
_waterMarkColor = value
Invalidate()
End Set
End Property
Private _waterMarkText As String = "Water Mark"
Public Property WaterMarkText() As String
Get
Return _waterMarkText
End Get
Set(ByVal value As String)
_waterMarkText = value
Invalidate()
End Set
End Property
#End Region
Public Sub New()
JoinEvents(True)
End Sub
Protected Overloads Overrides Sub OnCreateControl()
MyBase.OnCreateControl()
WaterMark_Toggle(Nothing, Nothing)
End Sub
Protected Overloads Overrides Sub OnPaint(ByVal args As PaintEventArgs)
'Dim drawFont As New System.Drawing.Font(Font.FontFamily, Font.Size, Font.Style, Font.Unit)
Dim drawFont As New Font("Arial", 28, FontStyle.Bold) 'New System.Drawing.Font(oldFont.FontFamily, oldFont.Size, oldFont.Style, oldFont.Unit)
Dim drawBrush As New SolidBrush(WaterMarkColor)
args.Graphics.DrawString((If(waterMarkTextEnabled, WaterMarkText, Text)), drawFont, drawBrush, New PointF(0.0F, 0.0F))
MyBase.OnPaint(args)
End Sub
Private Sub JoinEvents(ByVal join As Boolean)
If join Then
AddHandler Me.TextChanged, AddressOf WaterMark_Toggle
AddHandler Me.LostFocus, AddressOf Me.WaterMark_Toggle
AddHandler Me.FontChanged, AddressOf Me.WaterMark_FontChanged
End If
End Sub
Private Sub WaterMark_Toggle(ByVal sender As Object, ByVal args As EventArgs)
If Me.Text.Length <= 0 Then
EnableWaterMark()
Else
DisableWaterMark()
End If
End Sub
Private Sub EnableWaterMark()
oldFont = New System.Drawing.Font(Font.FontFamily, Font.Size, Font.Style, Font.Unit)
Me.SetStyle(ControlStyles.UserPaint, True)
Me.waterMarkTextEnabled = True
Refresh()
End Sub
Private Sub DisableWaterMark()
Me.waterMarkTextEnabled = False
Me.SetStyle(ControlStyles.UserPaint, False)
If oldFont IsNot Nothing Then
Me.Font = New System.Drawing.Font(oldFont.FontFamily, oldFont.Size, oldFont.Style, oldFont.Unit)
End If
End Sub
Private Sub WaterMark_FontChanged(ByVal sender As Object, ByVal args As EventArgs)
If waterMarkTextEnabled Then
oldFont = New System.Drawing.Font(Font.FontFamily, Font.Size, Font.Style, Font.Unit)
Refresh()
End If
End Sub
End Class
我试图强制班级在 OnPaint 事件中使用我设置的字体大小,但没有运气。是否还有其他我遗漏的东西使这变得比应有的更困难?
谢谢!
【问题讨论】:
-
很高兴安德斯工作。它还可以帮助您重构水印绘图,如下所示: g.DrawString(WaterMarkText, Me.Font, New SolidBrush(WaterMarkColor), 0, 0)
-
很酷,感谢您添加,颜色比画笔有更多选择:D
标签: vb.net visual-studio-2008 custom-controls