直接上源码

   public class WaterTextBox : TextBox
{
//private const int EM_SETCUEBANNER = 0x1501;
//[DllImport("user32.dll", CharSet = CharSet.Auto)]
//private static extern Int32 SendMessage
// (IntPtr hWnd, int msg, int wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
string waterText = string.Empty;
[Category("外观")]
[Description("设置水印文本")]
[DefaultValue(typeof(String), "提示文字")]
public string WaterText
{
get { return waterText; }
set
{
waterText = value;
this.Invalidate();
}
}
public WaterTextBox()
{
// base.SetStyle(
//ControlStyles.UserPaint | // 控件将自行绘制,而不是通过操作系统来绘制
//ControlStyles.OptimizedDoubleBuffer | // 该控件首先在缓冲区中绘制,而不是直接绘制到屏幕上,这样可以减少闪烁
//ControlStyles.AllPaintingInWmPaint | // 控件将忽略 WM_ERASEBKGND 窗口消息以减少闪烁
//ControlStyles.ResizeRedraw | // 在调整控件大小时重绘控件
//ControlStyles.SupportsTransparentBackColor, // 控件接受 alpha 组件小于 255 的 BackColor 以模拟透明
//true); // 设置以上值为 true
// base.UpdateStyles();
base.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BorderStyle = BorderStyle.FixedSingle;
//this.BorderStyle = Forms.BorderStyle.None;
this.SuspendLayout();
this.Font = new System.Drawing.Font("微软雅黑", 9f);
this.ResumeLayout(false);
this.WaterText = "水印文字";
this.AutoSize = false;
this.Height = ;
HelpText = "选择";
HelpWidth = ; }
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
static extern IntPtr LoadLibrary(string lpFileName); /// <summary>
/// 支持透明背景
/// </summary>
protected override CreateParams CreateParams
{
get
{
if (BackColor != Color.Transparent) return base.CreateParams;
CreateParams prams = base.CreateParams;
if (LoadLibrary("msftedit.dll") != IntPtr.Zero)
{
prams.ExStyle |= 0x020;
prams.ClassName = "RICHEDIT50W";
}
return prams;
}
} public int HelpWidth { get; set; }
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
DrawBorder(ref m);
if (m.Msg == 0xF)
{
WmPaint(ref m);
} }
Point mPoint = Point.Empty;
protected override void OnMouseMove(MouseEventArgs e)
{
mPoint = e.Location;
base.OnMouseMove(e);
} // public override Cursor Cursor
//{
// get
// {
// var rect = ClientRectangle;
// rect.X = ClientRectangle.Width - HelpWidth;
// rect.Width = HelpWidth;
// if (rect.Contains(mPoint))
// return Cursors.Hand;
// return base.Cursor; // }
// set
// {
// base.Cursor = value;
// }
//}
public Color BorderColor
{
get { return borderColor; }
set { borderColor = value; }
}
private Color borderColor = Color.Orange; // default border color is black
private static int WM_NCPAINT = 0x0085; // WM_NCPAINT message
private static int WM_ERASEBKGND = 0x0014; // WM_ERASEBKGND message
private static int WM_PAINT = 0x000F; // WM_PAINT message
public event Action<Point> OnDrawText;
public bool IsSelect { get; set; }
public string HelpText { get; set; }
StringFormat sf = new StringFormat() { LineAlignment = StringAlignment.Center, Alignment = StringAlignment.Center };
[DllImport("user32.dll")]
static extern int SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bRedraw); [DllImport("gdi32.dll")]
static extern IntPtr CreateRoundRectRgn(int x1, int y1, int x2, int y2, int cx, int cy);
public void DrawBorder(ref Message message)
{
if (message.Msg == WM_NCPAINT || message.Msg == WM_ERASEBKGND ||
message.Msg == WM_PAINT)
{ using (Graphics graphics = Graphics.FromHwnd(this.Handle))
{
if (this.BorderStyle == BorderStyle.FixedSingle)
{
Rectangle rectangle = this.ClientRectangle;
ControlPaint.DrawBorder(graphics, rectangle,
borderColor, ButtonBorderStyle.Solid);
graphics.Dispose();
message.Result = (IntPtr);
} //SetWindowRgn(this.Handle, CreateRoundRectRgn(0, 0, this.Width + 1, Height + 1, 5, 5), true); } }
}
protected override void OnPaintBackground(PaintEventArgs e)
{ base.OnPaintBackground(e);
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
using (GraphicsPath path = new GraphicsPath())
{
path.AddArc(, , Height - , Height - , , );
path.AddArc(Width - Height, , Height - , Height - , , );
path.CloseFigure(); e.Graphics.FillPath(Brushes.Orange, path);
using (Pen pen = new Pen(Color.Green))
{
e.Graphics.DrawPath(pen, path);
}
}
} private void WmPaint(ref Message m)
{
using (Graphics graphics = Graphics.FromHwnd(base.Handle))
{
if (string.IsNullOrEmpty(Text))
{
TextFormatFlags format =
TextFormatFlags.EndEllipsis |
TextFormatFlags.VerticalCenter;
if (Multiline)
{
format =
TextFormatFlags.EndEllipsis |
TextFormatFlags.VerticalCenter | TextFormatFlags.Left;
}
if (RightToLeft == RightToLeft.Yes)
{
format |= TextFormatFlags.RightToLeft | TextFormatFlags.Right;
}
TextRenderer.DrawText(
graphics,
WaterText,
Font,
ClientRectangle,
Color.Gray,
format);
}
//if (IsSelect)
//{
// var rect = ClientRectangle;
// rect.X = ClientRectangle.Width - HelpWidth;
// rect.Width = HelpWidth;
// graphics.FillRectangle(Brushes.Goldenrod, rect);
// using (var brush = new SolidBrush(Color.White))
// graphics.DrawString(HelpText, Font, brush, rect, sf);
// if(OnDrawText!=null)
// {
// OnDrawText(rect.Location);
// }
//} } } }

把这个放到项目中,然后重新生成项目,最后直接在工具箱上拖拽WaterTextBox就可以用

C# 实现水印的更多相关文章

  1. 逆天通用水印支持Winform,WPF,Web,WP,Win10。支持位置选择(9个位置 ==》[X])

    常用技能:http://www.cnblogs.com/dunitian/p/4822808.html#skill 逆天博客:http://dnt.dkil.net 逆天通用水印扩展篇~新增剪贴板系列 ...

  2. 水印第三版 ~ 变态水印(这次用Magick.NET来实现,附需求分析和源码)

    技能 汇总:http://www.cnblogs.com/dunitian/p/4822808.html#skill 以前的水印,只是简单走起,用的是原生态的方法.现在各种变态水印,于是就不再用原生态 ...

  3. BPM配置故事之案例5-必填与水印文本

    物资申请表改好了,但是没过两天老李又找来了. 老李:这个表格每次都是各个部门发给我们,再由我们采购部来填,太影响效率了,以后要让他们自己填. 小明:那就让他们填呗,他们有权限啊. 老李:可是他们说不会 ...

  4. webform:图片水印、验证码制作

    一.图片水印 1:引命名空间System.Drawing; 前端代码 <div> <asp:FileUpload ID="FileUpload1" runat=& ...

  5. WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展

    一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本 ...

  6. webform(十)——图片水印和图片验证码

    两者都需要引入命名空间:using System.Drawing; 一.图片水印 前台Photoshuiyin.aspx代码: <div> <asp:FileUpload ID=&q ...

  7. 火车头dede采集接口,图片加水印,远程图片本地化,远程无后缀的无图片本地化

    <?php /* [LocoySpider] (C)2005-2010 Lewell Inc. 火车采集器 DedeCMS 5.7 UTF8 文章发布接口 Update content: 图片加 ...

  8. thinkphp 3.2.3整合ueditor 1.4,给上传的图片加水印

    今天分享一下thinkphp 3.2.3整合ueditor 1.4,给上传的图片加水印.博主是新手,在这里卡住了很久(>_<) thinkphp 3.2.3整合ueditor 1.4 下载 ...

  9. PHP图片加文字水印和图片水印方法(鉴于李老师博客因没加水印被盗,特搜集的办法。希望能有用!)

    $dst_path = 'dst.jpg'; //创建图片的实例 $dst = imagecreatefromstring(file_get_contents($dst_path)); //打上文字 ...

  10. webform文件上传、图片水印、验证码

    文件上传: 所用控件:FileUpload 使用时的思路: 1.判断用户是否选中了文件 FileUpload.FileName获取选中的文件名,判断长度,如果长度大于零就代表已经选择了文件 JS端:通 ...

随机推荐

  1. 如何虚拟机里安装Win10操作系统

    不多说,直接上干货! Windows Server 2003.2008.2012系统的安装 推荐网址:打开MSDN网站(http://msdn.itellyou.cn ) 关于给电脑换系统,很多人会花 ...

  2. Python -- Gui编程 -- Tkinter的使用 -- 对话框消息框

    1.消息框 tkMessageBox.py import tkinter from tkinter import messagebox def cmd(): global n global butto ...

  3. Django之模型系统

    Django模型简介 Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中 Django 支持 sqlite3, MySQL, oracle,PostgreSQL等数 ...

  4. windows下搭建Cordova安卓环境

    phoneGap 被收购后衍生出了 Cordova Android 的开发工具也由 Eclipse 向 Android Studio 靠拢 行业动态在更新,所以资料也要跟着变化... 在开始之前,作为 ...

  5. Ripple(瑞波币)validator-keys-tool 配置验证器

    目录 Ripple(瑞波币)validator-keys-tool配置验证器 验证器密钥工具指南 验证器密钥 验证器令牌(Validator Keys) public_key撤销 签名 Ripple( ...

  6. javascript实例——鼠标特效篇(包含2个实例)

    鼠标是现在电脑的基本配置之一,也是最常用的输入命令的工具之一.本文将将一些与鼠标有关系的特效. 1.跟随鼠标移动的彩色星星 如题,会根据鼠标的移动而移动,并在鼠标周围随机来回移动,让人感觉在放大缩小. ...

  7. Keepalived 无法自动转换主备角色,请关注 iptables 防火墙配置

    最近在研究服务器高可用集群 (HA)…… 搭建了主备两台Keepalived,配置什么的全是网上照抄的,被验证过无数遍的示例…… 然而Master和Backup无法自动切换.两边会同时绑定浮动IP(V ...

  8. yum安装 指定安装目录

    yum -c /etc/yum.conf --installroot=/usr/local --releasever=/ install love

  9. [转]数据库中Schema(模式)概念的理解

    在学习数据库时,会遇到一个让人迷糊的Schema的概念.实际上,schema就是数据库对象的集合,这个集合包含了各种对象如:表.视图.存储过程.索引等. 如果把database看作是一个仓库,仓库很多 ...

  10. CodeBlocks "no such file or directory" 错误解决方案(创建类找不到头文件)

    在CodeBlocks下,有时候需要自己定义类,当然就要添加相应的头文件,但添加进去的头文件明明包含在项目中了, 但编译时还是会报错:no such file or directory;这是为什么呢? ...