(七十五)c#Winform自定义控件-控件水印组件

前提

入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

GitHub:https://github.com/kwwwvagaa/NetWinformControl

码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

如果觉得写的还行,请点个 star 支持一下吧

欢迎前来交流探讨: 企鹅群568015492 (七十五)c#Winform自定义控件-控件水印组件

麻烦博客下方点个【推荐】,谢谢

NuGet

Install-Package HZH_Controls

目录

https://www.cnblogs.com/bfyx/p/11364884.html

用处及效果

此效果只是牛刀小试,需要注意的是,像textbox这样的控件并不起作用,请注意。

你可以向目标控件绘图,画任何你想画的东西

(七十五)c#Winform自定义控件-控件水印组件

准备工作

没什么可准备的

开始

添加一个类GraphicalOverlay ,继承Component

代码比较少,一次全上了,主要就是用控件的paint事件搞事情,逻辑比较简单

  1 using System;
  2 using System.ComponentModel;
  3 using System.Drawing;
  4 using System.Windows.Forms;
  5 
  6 namespace HZH_Controls.Controls
  7 {
  8     [DefaultEvent("Paint")]
  9     public partial class GraphicalOverlay : Component
 10     {
 11         public event EventHandler<PaintEventArgs> Paint;
 12         
 13         public GraphicalOverlay()
 14         {
 15             InitializeComponent();
 16         }
 17 
 18         public GraphicalOverlay(IContainer container)
 19         {
 20             container.Add(this);
 21 
 22             InitializeComponent();
 23         }
 24         private Control owner;      
 25         public Control Owner
 26         {
 27             get { return owner; }
 28             set
 29             {
 30                 // The owner form cannot be set to null.
 31                 if (value == null)
 32                     throw new ArgumentNullException();
 33 
 34                 // The owner form can only be set once.
 35                 if (owner != null)
 36                     throw new InvalidOperationException();
 37 
 38                 // Save the form for future reference.
 39                 owner = value;
 40 
 41                 // Handle the form‘s Resize event.
 42                 owner.Resize += new EventHandler(Form_Resize);
 43 
 44                 // Handle the Paint event for each of the controls in the form‘s hierarchy.
 45                 ConnectPaintEventHandlers(owner);
 46             }
 47         }
 48 
 49         private void Form_Resize(object sender, EventArgs e)
 50         {
 51             owner.Invalidate(true);
 52         }
 53 
 54         private void ConnectPaintEventHandlers(Control control)
 55         {
 56             // Connect the paint event handler for this control.
 57             // Remove the existing handler first (if one exists) and replace it.
 58             control.Paint -= new PaintEventHandler(Control_Paint);
 59             control.Paint += new PaintEventHandler(Control_Paint);
 60 
 61             control.ControlAdded -= new ControlEventHandler(Control_ControlAdded);
 62             control.ControlAdded += new ControlEventHandler(Control_ControlAdded);
 63 
 64             // Recurse the hierarchy.
 65             foreach (Control child in control.Controls)
 66                 ConnectPaintEventHandlers(child);
 67         }
 68 
 69         private void Control_ControlAdded(object sender, ControlEventArgs e)
 70         {
 71             // Connect the paint event handler for the new control.
 72             ConnectPaintEventHandlers(e.Control);
 73         }
 74 
 75         private void Control_Paint(object sender, PaintEventArgs e)
 76         {
 77             // As each control on the form is repainted, this handler is called.
 78 
 79             Control control = sender as Control;
 80             Point location;
 81 
 82             // Determine the location of the control‘s client area relative to the form‘s client area.
 83             if (control == owner)
 84                 // The form‘s client area is already form-relative.
 85                 location = control.Location;
 86             else
 87             {
 88                 // The control may be in a hierarchy, so convert to screen coordinates and then back to form coordinates.
 89                 location = owner.PointToClient(control.Parent.PointToScreen(control.Location));
 90 
 91                 // If the control has a border shift the location of the control‘s client area.
 92                 location += new Size((control.Width - control.ClientSize.Width) / 2, (control.Height - control.ClientSize.Height) / 2);
 93             }
 94 
 95             // Translate the location so that we can use form-relative coordinates to draw on the control.
 96             if (control != owner)
 97                 e.Graphics.TranslateTransform(-location.X, -location.Y);
 98 
 99             // Fire a paint event.
100             OnPaint(sender, e);
101         }
102 
103         private void OnPaint(object sender, PaintEventArgs e)
104         {
105             // Fire a paint event.
106             // The paint event will be handled in Form1.graphicalOverlay1_Paint().
107 
108             if (Paint != null)
109                 Paint(sender, e);
110         }
111     }
112 }
113 
114 namespace System.Windows.Forms
115 {
116     using System.Drawing;
117 
118     public static class Extensions
119     {
120         public static Rectangle Coordinates(this Control control)
121         {
122             // Extend System.Windows.Forms.Control to have a Coordinates property.
123             // The Coordinates property contains the control‘s form-relative location.
124             Rectangle coordinates;
125             Form form = (Form)control.TopLevelControl;
126 
127             if (control == form)
128                 coordinates = form.ClientRectangle;
129             else
130                 coordinates = form.RectangleToClient(control.Parent.RectangleToScreen(control.Bounds));
131 
132             return coordinates;
133         }
134     }
135 }

 

最后的话

如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧

(七十五)c#Winform自定义控件-控件水印组件

上一篇:WPF图片,DataGrid等实现圆角


下一篇:Windows 服务调试方法(基于.net framwork4.6)