|
先上效果图
参考
思路
使用透明无框窗体覆盖需要添加水印的窗体,并设置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 }
复制代码
来源:https://www.cnblogs.com/penghanghang/p/18247146
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|