1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > VB.NET学习笔记:自定义控件之扩展TEXTBOX控件——水印文字提示效果

VB.NET学习笔记:自定义控件之扩展TEXTBOX控件——水印文字提示效果

时间:2021-02-22 17:45:43

相关推荐

VB.NET学习笔记:自定义控件之扩展TEXTBOX控件——水印文字提示效果

测试环境:windows 7和Microsoft Visual Studio

看到一些优秀软件里的TEXTBOX文本框都有水印文字提示应该输入什么样的信息,获取光标后提示文字消失,光标离开后水印文字出现,效果杠杠的,心里琢磨着能不能在自己在软件中也弄一个这样的效果?

首先想到的是利用TEXTBOX的焦点获得(Enter)和失去(Leave)事件来实现,新建一个窗体应用程序并拉入一个文本框,然后在窗体代码框录入如下代码:

Imports ponentModelImports System.DrawingImports System.Windows.FormsPublic Class Form1Private _textboxHasText As Boolean = FalsePrivate Sub TextBox1_Enter(sender As Object, e As EventArgs) Handles TextBox1.EnterIf _textboxHasText = False Then TextBox1.Text = ""TextBox1.ForeColor = Color.BlackEnd SubPrivate Sub TextBox1_Leave(sender As Object, e As EventArgs) Handles TextBox1.LeaveIf TextBox1.Text = "" ThenTextBox1.Text = "水印文字"TextBox1.ForeColor = Color.LightGray_textboxHasText = FalseElse_textboxHasText = TrueEnd IfEnd SubEnd Class

这种实现方式扩展性差,所以想到之前有做过自定义控件来实现DataGridView控件的全选全不选效果及分页效果,今天继续尝试着扩展TEXTBOX,把代码封装方便调用。首先想到的是做一个复合控件,这是最容易实现的,代码跟上述基本一致,因为我还没做过直接扩展控件的经验,对于控件继承、重载、重写等概念还处于一知半解状态,所以就想着借此机会做个尝试,顺便巩固学习成果。

添加新项,类、组件或者自定义控件,如果提示 Inherits TextBox代码出错就换一个项,具体应该用那个项我也不懂,反正哪个不报错就用哪个。

Imports ponentModelImports System.DrawingImports System.Windows.FormsPublic Class TextBoxExInherits TextBoxPrivate _textboxHasText As Boolean = FalsePublic Sub New()'MyBase.New()InitializeComponent()End SubPrivate _watermarkText As String = "水印文字"<Category("设置"), Description("渐变开始颜色")>Public Property WatermarkText As StringGetReturn _watermarkTextEnd GetSet(ByVal value As String)_watermarkText = valueEnd SetEnd PropertyProtected Overrides Sub OnEnter(ByVal e As EventArgs)If _textboxHasText = False Then Me.Text = ""Me.ForeColor = Color.Black'Me.Invalidate()MyBase.OnEnter(e)End SubProtected Overrides Sub OnLeave(ByVal e As EventArgs)If Me.Text = "" ThenMe.Text = WatermarkTextMe.ForeColor = Color.LightGray_textboxHasText = FalseElse_textboxHasText = TrueEnd If'Me.Invalidate()MyBase.OnLeave(e)End SubEnd Class

在这里为新的控件增加了一个修改水印文字的属性watermarkText,重写了TEXTBOX的焦点获得(Enter)和失去(Leave)事件,生成一下就可以在工具箱里看到该新的控件了。如图:

从工具箱拉入一个TextBoxEx控件,在属性窗口里可以找到扩展的属性watermarkText,在这里设置要显示的水印文字。

注意看还发现有对该属性的说明性文字,这个是在定义属性前增加代码<Category(“设置”), Description(“渐变开始颜色”)>来实现的。当然如果你愿意,也可以再增加如水印文字的字体、颜色等其他属性。

测试发现并没有真正达到自己想要的效果,于是在csdn里翻阅,终于看到一个C#语言的,效果很好,于是把他翻译成了。

代码写到一个新项(类、组件或自定义控件,具体用哪个自己尝试一下),按照设置属性(水印文字WaterText、水印颜色WaterColor和水印字体WaterFont——建立消息机制(重写WndProc方法)——绘制水印(DrawWaterText方法)的思路来实现。

代码如下:

Imports SystemImports System.Collections.GenericImports ponentModelImports System.DrawingImports System.DataImports System.LinqImports System.TextImports System.Windows.FormsImports System.Text.RegularExpressionsImports System.Runtime.InteropServices<ToolboxBitmap(GetType(TextBox))>Partial Public Class TextExInherits TextBoxPrivate _WaterText As String = "水印文本"Private _WaterColor As Color = Color.DarkGrayPrivate _WaterFont As Font = New Font(("宋体"), 10.0F)<Description("水印文本")>Public Property WaterText As StringGetReturn Me._WaterTextEnd GetSet(ByVal value As String)Me._WaterText = valueEnd SetEnd Property<Description("水印颜色")>Public Property WaterColor As ColorGetReturn Me._WaterColorEnd GetSet(ByVal value As Color)Me._WaterColor = valueEnd SetEnd Property<Description("水印字体")>Public Property WaterFont As FontGetReturn Me._WaterFontEnd GetSet(ByVal value As Font)Me._WaterFont = valueEnd SetEnd PropertyProtected Overrides Sub WndProc(ByRef m As Message)MyBase.WndProc(m)If m.Msg = 15 ThenDrawWaterText(m)End IfEnd SubPublic Sub DrawWaterText(ByRef m As Message)Using g As Graphics = Graphics.FromHwnd(MyBase.Handle)If Me.Text.Length = 0 AndAlso Not String.IsNullOrEmpty(Me.WaterText) AndAlso Not Me.Focused ThenDim flags As TextFormatFlags = TextFormatFlags.EndEllipsis Or TextFormatFlags.VerticalCenterIf Me.RightToLeft = System.Windows.Forms.RightToLeft.Yes Thenflags = flags Or TextFormatFlags.RightToLeft Or TextFormatFlags.RightEnd IfTextRenderer.DrawText(g, Me._WaterText, Me._WaterFont, Me.ClientRectangle, Me._WaterColor, flags)End IfEnd UsingEnd SubEnd Class

重新生成一下即可在工具箱中找到TextEx控件,如图:

仔细看还发现该控件图标与上面的textboxex控件图标大不同,这个与内置的textbox控件图标一模一样,这是因为代码前端加了这样一句代码:<ToolboxBitmap(GetType(TextBox))>。

从工具箱把该控件拉入窗体,从属性窗口修改水印文字、颜色和字体属性,如图:

好了,现在可以测试比较几种实现方式的效果了,如图:

如果有兴致还可以扩展边框及增加输入验证等效果,怎么样?你也来试试!

本文参考了以下博文:

WinForm自定义控件–TextBox扩展

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。