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

前提

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

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

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

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

欢迎前来交流探讨: 企鹅群568015492 

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

NuGet

Install-Package HZH_Controls

目录

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

用处及效果

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

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

准备工作

没什么可准备的

开始

添加一个类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 点个星星吧

原文地址:https://www.cnblogs.com/bfyx/p/11597832.html

时间: 2024-10-08 11:40:12

(七十五)c#Winform自定义控件-控件水印组件的相关文章

(七十)c#Winform自定义控件-饼状图

前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果觉得写的还行,请点个 star 支持一下吧 欢迎前来交流探讨: 企鹅群568015492  麻烦博客下方点个[推荐],谢谢 NuGet Install-Package HZH_Con

在DevExpress程序中使用Winform分页控件直接录入数据并保存

一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数据,这种对于字段比较少,而且内容相对比较简单的情况下,效率是比较高的一种输入方式.本篇随笔主要介绍在DevExpress程序中使用GridView直接录入数据并保存的实现,以及使用Winform分页控件来进行数据直接录入的实现操作. 1.在GridView上展示数据 在GridView上展示数据,只

C# Winform WindowsMediaPlayer控件

要做一个视频无缝切换的程序,所谓无缝就是在一个视频结束时立即开始另一个视频,中间不要有切换的黑屏 实现思路是放两个wmp播放控件,其中每个时刻只有一个在播放,另外一个处于暂停状态,并隐藏 当一个视频播放完后,切换显示另一个视频,同时这个视频隐藏起来并加载下一段视频,视频加载完成后(wmp会有事件通知)暂停 这样就去除了加载时的短暂空挡 有时可能会有键盘鼠标事件影响wmp的状态,所以使用定时器虽然监测wmp的播放状态 private void Form1_Load(object sender, E

winform分页控件

五一过的一多半已经过去了,感觉过的真快. 言归正传说说最近一直在用的winform分页控件. 一. 添加新项-用户控件 二.拖控件,这个很简单 三.写代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Win

第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

第三百七十五节,Django+Xadmin打造上线标准的在线教育平台-创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课程机构APP,写数据库操作文件models.py models.py文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from __future__ import unicode_literals from datetime import datetim

类似web风格的 Winform 分页控件

背景 最近做一个Winform的小程序,需要用到分页,由于之前一直在用 TonyPagerForWinForm.dll ,但该库没有源代码,网上找的也不全面,索性就准备自己改造一个.在园子里翻了一下,发现路过秋天在多年前写了个分页控件,Winform 通用分页控件实战篇(提供源码下载).站在大神的肩膀上就是快,一会就改好了. 效果图 功能比较齐全,不过样式上,楼主十分喜欢easyUI或ext的列表分页风格.于是换了几个按钮,添加了图标,看看现在的效果. 控件源码在正文最下方. 使用简介 就那么一

winform用户控件、动态创建添加控件、timer控件、控件联动

用户控件:(1) 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗体中添加, 将其实例化,然后添加到想要添加的容器的Control集合中. 动态创建添加控件: 配合上面的用户控件,实现类似QQ界面的打开自动加载好友昵称和签名 public Form1() { InitializeComponent(); //将当前登陆的账号的全部好友信息取出来 List<A

winform用户控件

用途用户控件包含Time控件和一个lable控件,一个ToolStrip控件,每隔一秒显示一次时间     1. 生成用户控件   新建一个项目类型为用户控件   注意定义类名,此类名为以后工具箱中显示的名字,暂且定义此处类名为LabelTime. 文件名称为UserControl1.cs(无关紧要,vs引用dll的时候,都是关注类名非文件名)     namespace myWindowsFormsControlLibrary1 { public partial class labelTime

WinForm Control 控件命名规范

1.标准控件 序号 控件类型简写 控件类型 1 btn Button 2 chk CheckBox 3 ckl CheckedListBox 4 cmb ComboBox 5 dtp DateTimePicker 6 lbl Label 7 llb LinkLabel 8 lst ListBox 9 lvw ListView 10 mtx MaskedTextBox 11 cdr MonthCalendar 12 icn NotifyIcon 13 nud NumeircUpDown 14 pi