(七十五)c#Winform自定義控制項-控制項水印組件

来源:https://www.cnblogs.com/bfyx/archive/2019/09/27/11597832.html
-Advertisement-
Play Games

前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr ...


前提

入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。

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

碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

如果覺得寫的還行,請點個 star 支持一下吧

歡迎前來交流探討: 企鵝群568015492 企鵝群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 點個星星吧


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Flask中的CBV以及正則表達式 一.CBV 二.正則表達式 ...
  • 一.request 二.response ...
  • .Net Core中間件官網:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.0 ASP.Net請求管道: 請求最終會由一個具體的HttpHandler處理(page/as ...
  • 好久沒有寫文章了,最近在用.net core3.0,一些開發中問題順便記錄; 1.首先nuget引入 Autofac Autofac.Extensions.DependencyInjection 2.修改Program.cs 添加.UseServiceProviderFactory(new Auto ...
  • --近期有一個需要運用多線程的項目,會有併發概率,所以寫了一份代碼,可能有寫地方還不完善,後續有需求在改 1 /// <summary> 2 /// 併發對象 3 /// </summary> 4 public class MeterAsyncQueue 5 { 6 public MeterAsyn... ...
  • 微信小程式支付 1、背景 因業務需要接入微信支付功能(客戶端是微信小程式),因公司伺服器版本較低,服務端採用.Net Framework 版本(並採用盛派微信SDK) 2、文檔地址 1)小程式支付:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api. ...
  • 這邏輯,強無敵! 只要你載入一次,就別想再載入第二次。 ...
  • <Grid HorizontalAlignment="Center" VerticalAlignment="Center"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> </Grid.RowDefinit... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...