首页 > 其他分享 >WinForm窗口水印

WinForm窗口水印

时间:2024-06-14 09:58:51浏览次数:17  
标签:窗口 Form form int private gap 水印 WinForm

先上效果图

 

参考

  1. 代码分享:给窗体添加水印 - 陈恩点 - 博客园 (cnblogs.com)
  2. WinForm添加水印 - 白衣如花 - 博客园

思路

使用透明无框窗体覆盖需要添加水印的窗体,并设置owner为主窗体。然后在透明窗体绘制水印文本即可。

代码

  1 public class Watermark
  2 {
  3     private string text;
  4     private int gap;
  5     private Font font = new Font("微软雅黑", 16, FontStyle.Regular);
  6     private Color color = Color.FromArgb(255, 0, 0, 0);
  7 
  8     private Form form = new Form();
  9 
 10     public Watermark(Form ownerForm, string text = "Watermark", int gap = 75, double opacity = 0.1, Font font = null, Color? color = null)
 11     {
 12         this.text = text;
 13         this.gap = gap;
 14         if (font != null)
 15         {
 16             this.font = font;
 17         }
 18         if (color.HasValue)
 19         {
 20             this.color = color.Value;
 21         }
 22         form.Size = ownerForm.Size;
 23         ownerForm.SizeChanged += OwnerForm_SizeChanged;
 24         ownerForm.Move += OwnerForm_Move;
 25 
 26         form.Owner = ownerForm;
 27         form.FormBorderStyle = FormBorderStyle.None;
 28         form.Opacity = opacity;
 29         form.ShowInTaskbar = false;
 30         form.TransparencyKey = Color.White;
 31         form.BackColor = Color.White;
 32 
 33         form.Paint += Form_Paint;
 34         form.Show();
 35 
 36 
 37         GetWindowLong(form.Handle, GWL_EXSTYLE);
 38         SetWindowLong(form.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED);
 39     }
 40 
 41     private void OwnerForm_Move(object sender, EventArgs e)
 42     {
 43         form.Location = ((Form)sender).Location;
 44     }
 45 
 46     private void OwnerForm_SizeChanged(object sender, EventArgs e)
 47     {
 48         form.Size = ((Form)sender).Size;
 49     }
 50     private void Form_Paint(object sender, PaintEventArgs e)
 51     {
 52         const float cos30 = 0.866f;
 53         const float sin30 = 0.5f;
 54         var g = e.Graphics;
 55         g.SmoothingMode = SmoothingMode.AntiAlias;
 56         g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
 57         //平移画布到需要画印章的位置
 58         g.TranslateTransform(0, gap);
 59         //逆时针旋转30度
 60         g.RotateTransform(-30);
 61         // 绘制画布区域
 62         //g.FillRectangle(new SolidBrush(Color.FromArgb(50, 100, 100, 100)), 0, 0, frm.Width, frm.Height);
 63         for (int x = 5; x < e.ClipRectangle.Right + gap; x += gap * 2)
 64         {
 65             for (int y = 5; y < e.ClipRectangle.Bottom + gap; y += gap * 2)
 66             {
 67                 // 计算文字起点位置
 68                 float x1 = cos30 * x - sin30 * y;
 69                 float y1 = sin30 * x + cos30 * y;
 70                 //画上文字
 71                 g.DrawString(text, font, new SolidBrush(color), x1, y1);
 72             }
 73         }
 74     }
 75 
 76     #region 在窗口结构中为指定的窗口设置信息
 77     /// <summary>
 78     /// 在窗口结构中为指定的窗口设置信息
 79     /// </summary>
 80     /// <param name="hwnd">欲为其取得信息的窗口的句柄</param>
 81     /// <param name="nIndex">欲取回的信息</param>
 82     /// <param name="dwNewLong">由nIndex指定的窗口信息的新值</param>
 83     /// <returns></returns>
 84     [DllImport("user32", EntryPoint = "SetWindowLong")]
 85     private static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong);
 86     #endregion
 87 
 88     #region 从指定窗口的结构中取得信息
 89     /// <summary>
 90     /// 从指定窗口的结构中取得信息
 91     /// </summary>
 92     /// <param name="hwnd">欲为其获取信息的窗口的句柄</param>
 93     /// <param name="nIndex">欲取回的信息</param>
 94     /// <returns></returns>
 95     [DllImport("user32", EntryPoint = "GetWindowLong")]
 96     private static extern uint GetWindowLong(IntPtr hwnd, int nIndex);
 97     #endregion
 98 
 99     private const uint WS_EX_LAYERED = 0x80000;
100     private const int WS_EX_TRANSPARENT = 0x20;
101     private const int GWL_EXSTYLE = (-20);
102 }

 

使用

1 public Form1()
2 {
3     InitializeComponent();
4     new Watermark(this);
5 }

 

标签:窗口,Form,form,int,private,gap,水印,WinForm
From: https://www.cnblogs.com/penghanghang/p/18247146

相关文章

  • SDL3 入门(2):第一个窗口
    在上一篇文章中我们已经利用SDL的日志接口实现了简单的字符串输出,实际上是解决了开发环境搭建问题,接下来我们将在已有代码的基础上继续开发,实现第一个窗口的创建和背景色绘制。初始化首先设置日志输出级别:SDL_SetLogPriorities(SDL_LOG_PRIORITY_VERBOSE);因为还是开发阶段......
  • Android 11 自由窗口模式启动app
    //未定义publicstaticfinalintWINDOWING_MODE_UNDEFINED=0;//普通全屏窗口publicstaticfinalintWINDOWING_MODE_FULLSCREEN=1;//画中画publicstaticfinalintWINDOWING_MODE_PINNED=2;//分屏主窗口publicstaticfinali......
  • 界面控件DevExpress WinForms垂直&属性网格组件 - 拥有更灵活的UI选择(一)
    DevExpressWinForms垂直&属性网格组件旨在提供UI灵活性,它允许用户显示数据集中的单个行或在其90度倒置网格容器中显示多行数据集。另外,用户可以把它用作一个属性网格,就像在VisualStudioIDE中那样。P.S:DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有......
  • 【Python】使用OpenCV特征匹配检测图像中的【特定水印】
    如果没有方向往哪里走都是前方做自己的光不需要多亮曾受过的伤会长出翅膀大雨冲刷过的天空会更加明亮流过泪的眼睛也一样做自己的光悄悄的发亮逆风的方向更容易飞翔世界怎样在于你凝视它的目光那未曾谋面过的远方或许就在身旁              ......
  • 【FFmpeg】SDL 音视频开发 ② ( SDL 视频显示函数 | 设置渲染器目标纹理 | 设置渲染器
    文章目录一、SDL视频显示函数1、SDL的渲染器和纹理之间的关系2、SDL_SetRenderTarget函数-设置渲染器目标纹理3、SDL_SetRenderDrawColor函数-设置渲染器颜色4、SDL_RenderClear函数-清除渲染器5、SDL_RenderDrawRect函数-渲染器绘制矩形6、SDL_Render......
  • C# winform中RDLC报表绘制
    C#winform中RDLC报表绘制使用集成开发环境为VS2010,框架版本为.NETFramework4以下我们以一个简单的学生报表作为例子。publicclassStudent{publicstringname{get;set;}publicstringid{get;set;}publicstringclasses{get;set;}publicstringhome{get;set;}publi......
  • 图片和视频都可以去水印啦,ai去水印的简单两种方法
    有时候我们希望移除视频中的水印,但又不擅长使用专业软件,结果反而花费了很多时间和精力。这种情况下该怎么办呢?今天给大家推荐两个方法:一.在线去水印Photopea是一款在线图像编辑器,界面和功能与Photoshop相似,无需下载软件即可使用。其强大的AI去水印功能使得去除图片水印变得非常......
  • excel中加水印以及二维码
    1.如何给excel添加二维码其实二维码就是一张图片,把生成的二维码作为图片返回给excel对应的栏位就可以达到目的,代码如下:点击查看代码publicBitmapGetBitmap(stringcode,ExcelPackagepackage){varsheet=package.Workbook.Worksheets[0];//创建QR码生成器......
  • 界面控件DevExpress WinForms垂直&属性网格组件 - 拥有更灵活的UI选择(一)
    DevExpressWinForms垂直&属性网格组件旨在提供UI灵活性,它允许用户显示数据集中的单个行或在其90度倒置网格容器中显示多行数据集。另外,用户可以把它用作一个属性网格,就像在VisualStudioIDE中那样。P.S:DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响......
  • electron + vue3 自定义窗口:移动,缩放,置顶
    electronmain.jsconst{BrowserWindow,ipcMain}=require('electron');constpath=require("path")constCustomWindow=require('./CustomWindow')constwin=newBrowserWindow({frame:false,transparent:true,......