直接上源码

   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. 计算机硬件的五大单元 & CPU的种类 & 计算机的运行流程

    不多说,直接上干货! 计算机硬件的五大单元 关于计算机的组成部分,其实你可以观察你的桌面计算机分析一下,依外观来说这家伙主要分为三部分: 输入单元:包括键盘.鼠标.卡片阅读机.扫描仪.手写板.触摸屏幕 ...

  2. Ubuntu14.04安装之后的一些配置

    不多说,直接上干货! 主要分为 一.root用户的开启和vim编辑器的安装 二.ssh的安装 三.静态ip的设置 四.中英切换文环境切换 一.root用户的开启和vim编辑器的安装 Ubuntu在默认 ...

  3. UTF8最好不要带BOM

    摘自:http://www.cnblogs.com/findumars/p/3620078.html   几周前还在为BOM的问题苦恼着...正如@梁海所说,“不含 BOM 的 UTF-8 才是标准形 ...

  4. Python的Mysql操作

    网上好多的帖子感觉比较老了,而且千篇一律.我到mysql看了一下官网上python驱动的操作,发现与大部分网站说的都不一样. 首先安装的驱动是: pip install mysql-connector ...

  5. solr 7.6 安装部署与遇到的问题

    目录 安装 solr 配置solr 到tomcat(关键) 配置依赖包 创建tomcat solr 的 classes 文件 创建 solr 的core 的主目录(也就是存放core的位置) 修改配置 ...

  6. java-jdk7-forkjoin异常返回

    来自:http://ifeve.com/fork-join-5/ 在Java中有两种异常: 已检查异常(Checked exceptions):这些异常必须在一个方法的throws从句中指定或在内部捕 ...

  7. Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in E:\\PHP\\wamp\\www\\lsr\\lsr.php on line 42

    类似于这样的错误: 其实大多数的情况下,都是SQL语句书写错了,特别是这种情况: select * from order; 应该写成: select * from `order`;(那不是单引号,而是 ...

  8. Java 集合框架(一)—— 接口综述

    前言:凡是使用 Java 编程的,几乎肯定会用到集合框架,比如 ArrayList.LinkedList.HashSet.HashMap 等,集合框架的代码绝对是大师级的实现,所以为了更好地使用集合框 ...

  9. NoSQL之HBase

    http://www.cnblogs.com/LBSer/p/3330383.html 9月初淘宝飞芃做了一个关于HBase的分享,讲的激情飞扬,让听众收益匪浅,现做下简单总结. HBase是一个No ...

  10. DateUtils 通用类

    package com.egaoqi.util; import org.apache.commons.lang3.time.DateFormatUtils; import java.text.Pars ...