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端:通 ...
随机推荐
- PM2怎么开启ES6?
node版本v6.14.2,无论是用配置文件 { "apps": [{ "name": "server", "script&quo ...
- 【LeetCode题解】141_环形链表
目录 141_环形链表 描述 解法一:哈希表 思路 Java 实现 Python 实现 解法二:双指针(龟兔算法) 思路 Java 实现 Python 实现 141_环形链表 描述 给定一个链表,判断 ...
- [转]wx.getUserInfo(OBJECT) 微信小程序 获取用户信息
本文转自:http://mp.weixin.qq.com/debug/wxadoc/dev/api/open.html wx.getUserInfo(OBJECT) 获取用户信息,withCreden ...
- redis使用场景之位操作(大数据处理)
在学习redis的过程了,看到了redis还能用于大数据处理,具体场景如下: 腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,你能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下 ...
- SPA应用部署时首屏启动慢问题解决方案
SPA应用部署时首屏启动慢问题解决方案 使用vuejs开发的单页应用,打包部署上线后,发现首屏启动时间达到了惊人的10s左右,于是开始优化,目前使用到的总结如下: 巧用webpack插件 1.抽取cs ...
- 在SQLSERVER中如何检测一个字符串中是否包含另一个字符串
--当charindex返回值大于0时则包含 为0不包含 select CHARINDEX('456','123456') SQL语句使用CHARINDEX函数,来测试一个字符串中是否包含另一个字 ...
- 我用ASP.NET缓存之OutputCache
[我的理解]页面缓存常用在网站上.Web应用系统上也用,但由于Web系统常与数据库打交道.时效性要求蛮强的,所以是否能用缓存得具体情况具体分析(很喜欢这句话“具体情况具体分析”,很符合国人的中庸之道) ...
- Spring Boot统一异常处理方案示例
一.异常处理的原则 1.调用方法的时候返回布尔值来代替返回null,这样可以 NullPointerException.由于空指针是java异常里最恶心的异常. 2. catch块里别不写代码.空ca ...
- Servlet自动注入Spring容器中的Bean解决方法
很多情况在进行Web开发的时候需要自己手写Servlet来完成某些功能,而servlet有需要注入Spring容器中的某些bean,这是每次都要手动获取比较麻烦,这里有一个解决方案,只需要写一个ser ...
- Git 学习之git 分支(三)
Git 分支 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的 ...