Winform控件的水印效果制作

在我们的项目中,为控件绘制水印效果是十分常见的事情,下面我就来说说水印效果的制作方式。其实在绝大多数情况下只有下拉框和输入框多会使用水印,比如我们看到的新浪邮箱,(如:图1)。
下面是输入框水印效果的代码实现:
using System.Drawing;
using System.Windows.Forms;
namespace TextBoxWithWaterkmarkExample
{
 /// <summary>
 /// 带水印效果的TextBox
 /// </summary>
    public class TextBoxWithWaterkmark : TextBox
    {
        /// <summary>
        /// 填充水印的内部的对象:包括文字颜色。
        /// </summary>
        private Brush WatermarkBrush { get { return new SolidBrush(Color.Gray); } }

/// <summary>
        /// 水印的文本格式。
        /// </summary>
        public Font WatermarkFont { get; set; }

/// <summary>
        /// 水印的内容。
        /// </summary>
        public string WatermarkContext { get; set; }

protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            if (this.WatermarkBrush == null || this.WatermarkFont == null || this.WatermarkContext == null)
            { return; }

//得到与一个窗口有关的文本的长度(不包含空字符)
            int WM_PAINT = 0xF;
            //失去焦点
            int WM_KILLFOCUS = 0x8;

if ((m.Msg == WM_KILLFOCUS && string.IsNullOrEmpty(base.Text))
                || (m.Msg == WM_PAINT && string.IsNullOrEmpty(base.Text) && !base.Focused))
            {
                Rectangle rect = base.ClientRectangle;
                using (Graphics g = base.CreateGraphics())
                {
                    g.DrawString(
                        this.WatermarkContent,
                        this.WatermarkFont,
                        this.WatermarkBrush,
                        rect);
                }
            }
        }
    }
}
我们可以看到,通过重写WndProc函数,对m.Msg进行判断,当失去焦点且输入框文本为空是通过GDI+进行文字绘制。或者当文本发生变化确不为空时进行文字绘制。

时间: 2024-11-08 00:43:15

Winform控件的水印效果制作的相关文章

C#中WinForm控件的跨线程更新Invoke

目的: 用WinForm(C#)搭建一个用户界面,一个进度条和一个按钮,按钮启动进度条,进度完成时停止更新 示例: 实现: 在按钮事件中设置循环,更新进度条         private void btnProgress_Click(object sender, EventArgs e)         {             for (int ii = 0; ii < 100; ii++)             {                 progressBar1.Value 

C#之 十九 使用WinForm控件

十九 使用Win Form控件 比如说电脑有显示器,鼠标,主机以及键盘的基本元素组成.在windows窗体中也有其基本控件,这些控件在每一个窗体中都要用到,也就是说无所不在.有些控件可能外观不同但是他们的使用方式都基本上一样. 重点 ?        掌握这些控件常用属性方法以及事件 ?        能用编码的形式实现控件的基本功能 ?        体会每个控件使用的场景 预习功课 ?        什么是控件类,控件类的基类(父类)是么?它是用来做什么的? ?        标签,按钮,文

C# WinForm控件、自定义控件整理(大全)

转:http://www.cnblogs.com/top5/archive/2010/04/29/1724039.html 对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, 不断补充充实, 完善这方面. 基础 - 常用控件 C# WinForm开发系列 - CheckBox/Button/Label/ProgressBar WinForm下CheckedListBox的数据绑定 Winform 下无闪烁走马灯效果实现 c#,winform,progressbar+la

.Net WinForm 控件键盘消息处理剖析

在WinForm控件上我们可以看到很多关于键盘消息处理的方法,比如OnKeyDown, OnKeyPress, ProcessCmdKey, ProcessDialogKey,IsInputKey等等,那么这些方法是如何被组织的,每一个方法的具体含义又是什么哪?Win32的键盘消息又是如何到达控件上的这些方法的,本文将着重阐述这些问题,对.Net WinForm控件的键盘消息处理过程进行剖析.  1.      WinForm消息循环 大家都知道WinForm也是依赖于底层的消息机制的,通常我们

【Android UI】案例04配置控件点击效果(selector)

本例采用XML(selector),配置控件点击效果的实现,即当控件被触发或点击获取到焦点时,出现样式上的改变,以便给以较好的用户体验与操作感.本例需要引入的核心知识点的selector.xml.请参考学习:http://blog.csdn.net/mahoking/article/details/23690857.本例用于演示点击效果的控件为TextView.Button. [转载使用,请注明出处:http://blog.csdn.net/mahoking] 首先需要配置selector.xm

通过WinForm控件创建的WPF控件无法输入的问题

今天把写的一个WPF程序发布到别的机器上执行,发现一个比较奇怪的问题:在那个机器上用英文输入法无法输入数字,非要切换到中文输入法才行:但在我的机器上却是好好的. 最开始以为是输入法的问题,弄了好一阵子后,终于找到了原因:虽然这个程序是个WPF程序,但为了复用之前的部分代码,使用着一个WinForm的菜单控件,后续的子窗口都是通过这个WinForm菜单创建的.而用WinForm控件创建的WPF控件可能出现无法正确响应键盘事件的情况. 找到了原因后,一个常规的解决方法是:将WinForm控件换成WP

Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

有人会说不建议Wpf中使用Winform控件,有人会说建议使用Winform控件在Wpf下的替代方案,然而在实际工作中由于项目的特殊需求,考虑到时间.成本等因素,往往难免会碰到在WPF中使用Winfrom控件的问题,我们知道Wpf可以通过使用WindowsFormsHost容器调用Winform控件,但是在一些场合需要将Wpf元素显示在Winform控件的上层,此时就会出现Wpf元素被Winform控件遮盖的问题. 一.场景再现 接到公司命令,在时间紧迫的情况下,需要将原来的Winform程序(

WinForm控件TreeView 只部分节点显示 CheckBox

WinForm控件TreeView 只部分节点显示  CheckBox 用过asp.net的应该知道,要在treeview中实现上述功能可以使用ShowCheckBox 属性指定那些节点显示checkbox哪些不显示,可是winform中的treeview只提供一个ShowCheckBoxes 属性,要么全部节点显示checkbox,要不全部不显示,而指定节点没有ShowCheckBox 属性,下面就在winform的treeview中实现BS对应CheckBox 属性的功能  方法1: a) 

WinForm控件复杂数据绑定常用数据源(对Combobox,DataGridView等控件DataSource赋值的多种方法)

开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定. 1) 简单数据绑定 简单的数据绑定是将用户控件的某一个属性绑定至某一个类型实例上的某一属性.采用如下形式进行绑定:引用控件.DataBindings.Add("控件属性", 实例对象, "属性名", true); 2) 复杂数据绑定 复杂的数据绑定是将一个以列表为基础的用户控件(例如:ComboBox.ListBox.ErrorProvider.DataGridView等控件)绑