C# 实现水印
直接上源码
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# 实现水印的更多相关文章
- 逆天通用水印支持Winform,WPF,Web,WP,Win10。支持位置选择(9个位置 ==》[X])
常用技能:http://www.cnblogs.com/dunitian/p/4822808.html#skill 逆天博客:http://dnt.dkil.net 逆天通用水印扩展篇~新增剪贴板系列 ...
- 水印第三版 ~ 变态水印(这次用Magick.NET来实现,附需求分析和源码)
技能 汇总:http://www.cnblogs.com/dunitian/p/4822808.html#skill 以前的水印,只是简单走起,用的是原生态的方法.现在各种变态水印,于是就不再用原生态 ...
- BPM配置故事之案例5-必填与水印文本
物资申请表改好了,但是没过两天老李又找来了. 老李:这个表格每次都是各个部门发给我们,再由我们采购部来填,太影响效率了,以后要让他们自己填. 小明:那就让他们填呗,他们有权限啊. 老李:可是他们说不会 ...
- webform:图片水印、验证码制作
一.图片水印 1:引命名空间System.Drawing; 前端代码 <div> <asp:FileUpload ID="FileUpload1" runat=& ...
- WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展
一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本 ...
- webform(十)——图片水印和图片验证码
两者都需要引入命名空间:using System.Drawing; 一.图片水印 前台Photoshuiyin.aspx代码: <div> <asp:FileUpload ID=&q ...
- 火车头dede采集接口,图片加水印,远程图片本地化,远程无后缀的无图片本地化
<?php /* [LocoySpider] (C)2005-2010 Lewell Inc. 火车采集器 DedeCMS 5.7 UTF8 文章发布接口 Update content: 图片加 ...
- thinkphp 3.2.3整合ueditor 1.4,给上传的图片加水印
今天分享一下thinkphp 3.2.3整合ueditor 1.4,给上传的图片加水印.博主是新手,在这里卡住了很久(>_<) thinkphp 3.2.3整合ueditor 1.4 下载 ...
- PHP图片加文字水印和图片水印方法(鉴于李老师博客因没加水印被盗,特搜集的办法。希望能有用!)
$dst_path = 'dst.jpg'; //创建图片的实例 $dst = imagecreatefromstring(file_get_contents($dst_path)); //打上文字 ...
- webform文件上传、图片水印、验证码
文件上传: 所用控件:FileUpload 使用时的思路: 1.判断用户是否选中了文件 FileUpload.FileName获取选中的文件名,判断长度,如果长度大于零就代表已经选择了文件 JS端:通 ...
随机推荐
- django中有外键关系两张表的相互查找方法
两张通过外键联系的表,如何在一张表上根据另一张表上的属性查找满足条件的对象集? 1 平常查找表中数据的条件是python中已有的数据类型,通过名字可以直接查找.如果条件是表中外键列所对应表的某一列, ...
- tensorflow summary
定义summary writer = tf.summary.FileWriter(logdir=self.han_config.log_path, graph=session.graph) 1.sca ...
- gcc 混合连接动态库和静态库
当对动态库与静态库混合连接的时候,使用-static会导致所有的库都使用静态连接的方式.这时需要作用-Wl的方式 gcc test.cpp -L. -Wl,-Bstatic -ltestlib -W ...
- Golang gRPC 和 gRPC-gateway 结合使用
一.安装 go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway go get -u github.com/g ...
- Innosetup的状态页面和向导页面解释
1.安装: CurStepChanged所对应的全部状态:3种 1.1. CurStep=ssInstall --是在程序实际安装前(所有配置都准备好了) 1.2. CurSt ...
- Beta阶段——Scrum 冲刺博客第四天
一.当天站立式会议照片一张 二.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中 昨天已完成的工作 完成对question界面的制作,完善随机出题界面,能够流畅的切换下一题与 ...
- 回溯法求解n皇后和迷宫问题
回溯法是一种搜索算法,从某一起点出发按一定规则探索,当试探不符合条件时则返回上一步重新探索,直到搜索出所求的路径. 回溯法所求的解可以看做解向量(n皇后坐标组成的向量,迷宫路径点组成的向量等),所有解 ...
- vs2013中,自定义mvc 添加视图脚手架
参考文章: http://weblogs.asp.net/imranbaloch/archive/2013/09/15/customizing-the-asp-net-mvc-5-web-api-2- ...
- [javaSE] 集合框架(ArrayList,LinkedList,Vector)
ArrayList特点:底层使用数组数据结构,查询速度快(使用脚标查),插入删除慢(索引要改变) LinkedList特点:底层使用链表数据结构,查询慢(需要一个一个去问),插入删除快 Vector特 ...
- CentOS7下SVN server的安装与配置
CentOS7通过yum install命令进行安装SVN(参考:http://subversion.apache.org/packages.html#centos) $ yum install su ...