Winform----自定義控件之半透明遮罩(蒙版遮蓋指定控件)

先貼運行效果圖,源碼點擊這裏下載html

1.新建自定義控件框架


2.實現功能編輯器

 

  1.  
    namespace UserControlLib
  2.  
    {
  3.  
    [ ToolboxBitmap(typeof(ZhLoading))]
  4.  
    public partial class ZhLoading : Control
  5.  
    {
  6.  
    private bool _isTransparent = true; //是否透明
  7.  
    [ Category("XX控件"), Description("是否使用透明,默認爲True")]
  8.  
    public bool IsTransparent
  9.  
    {
  10.  
    get { return _isTransparent; }
  11.  
    set { _isTransparent = value; }
  12.  
    }
  13.  
     
  14.  
    private int _alpha = 125; //設置透明度
  15.  
    [ Category("XX控件"), Description("設置透明度")]
  16.  
    public int Alpha
  17.  
    {
  18.  
    get { return _alpha; }
  19.  
    set { _alpha = value; }
  20.  
    }
  21.  
     
  22.  
    private Control _byControl;
  23.  
    [ Category("XX控件"), Description("要綁定的控件")]
  24.  
    public Control ByControl
  25.  
    {
  26.  
    get { return _byControl; }
  27.  
    set {
  28.  
    _byControl = value;
  29.  
    if (_byControl != null)
  30.  
    {
  31.  
    _byControl.Controls.Add( this);
  32.  
    }
  33.  
    }
  34.  
    }
  35.  
    public ZhLoading():this(125,true)
  36.  
    {
  37.  
    InitializeComponent();
  38.  
    }
  39.  
     
  40.  
    /// <summary>
  41.  
    /// 初始化加載控件
  42.  
    /// </summary>
  43.  
    /// <param name="Alpha"透明度</param>
  44.  
    /// <param name="IsShowLoadingImage">是否顯示加載圖片</param>
  45.  
    public ZhLoading(int Alpha, bool IsShowLoadingImage)
  46.  
    {
  47.  
    SetStyle(ControlStyles.Opaque, true); //設置背景透明
  48.  
    base.CreateControl();
  49.  
    _alpha = Alpha;
  50.  
    if (IsShowLoadingImage)
  51.  
    {
  52.  
    PictureBox pic = new PictureBox();
  53.  
    pic.BackColor = Color.White;
  54.  
    pic.Image = UserControlLib.Resource.loading;
  55.  
    pic.Size = new Size( 48, 48);
  56.  
    pic.SizeMode = PictureBoxSizeMode.AutoSize;
  57.  
    pic.Location = new Point( this.Location.X + ( this.Width - pic.Width) / 2,
  58.  
    this.Location.Y + ( this.Height - pic.Height) / 2); //居中
  59.  
    pic.Anchor = AnchorStyles.None;
  60.  
    this.Controls.Add(pic);
  61.  
    }
  62.  
    this.Visible = false;
  63.  
    }
  64.  
     
  65.  
    protected override CreateParams CreateParams
  66.  
    {
  67.  
    get
  68.  
    {
  69.  
    CreateParams cp = base.CreateParams;
  70.  
    cp.ExStyle |= 0x00000020; // 開啓 WS_EX_TRANSPARENT,使控件支持透明
  71.  
    return cp;
  72.  
    }
  73.  
    }
  74.  
     
  75.  
    protected override void OnPaint(PaintEventArgs pe)
  76.  
    {
  77.  
    Pen labelBorderPen;
  78.  
    SolidBrush labelBackColorBrush;
  79.  
    if (_isTransparent)
  80.  
    {
  81.  
    Color cl = Color.FromArgb(_alpha, this.BackColor);
  82.  
    labelBorderPen = new Pen(cl, 0);
  83.  
    labelBackColorBrush = new SolidBrush(cl);
  84.  
    }
  85.  
    else
  86.  
    {
  87.  
    labelBorderPen = new Pen( this.BackColor, 0);
  88.  
    labelBackColorBrush = new SolidBrush( this.BackColor);
  89.  
    }
  90.  
    base.OnPaint(pe);
  91.  
    pe.Graphics.DrawRectangle(labelBorderPen, 0, 0, this.Width, this.Height);
  92.  
    pe.Graphics.FillRectangle(labelBackColorBrush, 0, 0, this.Width, this.Height);
  93.  
    }
  94.  
     
  95.  
    /// <summary>
  96.  
    /// 顯示加載
  97.  
    /// </summary>
  98.  
    public void ShowLoad()
  99.  
    {
  100.  
    this.BringToFront();
  101.  
    this.Dock = DockStyle.Fill;
  102.  
    this.Visible = true;
  103.  
    }
  104.  
     
  105.  
    /// <summary>
  106.  
    /// 隱藏加載
  107.  
    /// </summary>
  108.  
    public void HideLoad()
  109.  
    {
  110.  
    this.Visible = false;
  111.  
    }
  112.  
    }
  113.  
    }

3.調用自定義控件

 

將編譯後生成的dll添加到工具箱中,新建一winform窗口,拖放進去。ide

設置好要綁定的控件,這裏用在datagridview上。工具


調用自定義控件的ShowLoad();zhLoading1.HideLoad();這兩個方法便可實現顯示與隱藏的功能。佈局

 

 

出處:https://blog.csdn.net/quan278905570/article/details/42913081post

=============================================================================================字體

  在Web上面要實現一個遮罩層或者說是蒙版吧,有了DIV那不算什麼難事,只要給div定好位置和大小,把顏色的Alpha值設一下就有透明的效果。不過在Winform中實現起來就沒那麼簡單了事。嘗試過用一個Panel,那底色設成透明,真的透明瞭。窗體後面的東西都顯示出來了。就是沒把Panel蓋住的控件顯示出來。這樣看來不是辦法。谷了一下子歌。找到了一個,仍是要寫控件的,不算難,但用到了一點兒沒見過的東西。經一事長一智吧。this

  重寫到了一個Control的屬性CreateParams,它是CreateParams類型的。關於這個類,MSDN上簡單解釋道:封裝建立控件時所需的信息。而依我看是關於樣式的設置,並且裏面的樣式設置都是些0x00000040、0x00000020的按位組合。在網上找了一些,整理了了一下也塞到博文的最後面。spa

複製代碼
1         protected override CreateParams CreateParams
2         {
3             get
4             {
5                 CreateParams cp = base.CreateParams;
6                 cp.ExStyle |= 0x00000020;
7                 return cp;
8             }
9         }
複製代碼

這樣寫控件下去,多半是要去重繪的,這裏重寫OnPaint方法不過不復雜,給控件填背景色,仍是直接把全部代碼貼出來。

按 Ctrl+C 複製代碼
按 Ctrl+C 複製代碼

下面就羅列一些系網上搜刮回來的的窗口樣式,絕大部分沒那個表明的整形值,有些就算是有了也是重複的,摸不着

複製代碼
  1 1、窗口樣式
  2 
  3 WS_POPUP        彈出式窗口(不能與WS_CHILDWINDOW樣式同時使用)
  4 WS_CHILDWINDOW  子窗口(不能與WS_POPUP合用)
  5 WS_MINIMIZE     建立窗口擁有最小化按鈕
  6 WS_MINIMIZEBOX  建立窗口擁有最小化按鈕,須同時指定WS_SYSTEM樣式
  7 WS_VISIBLE      可見狀態
  8 WS_DISABLED     不可用狀態
  9 WS_CLIPSIBLINGS 使窗口排除子窗口之間的相對區域
 10 WS_CLIPCHILDREN 當在父窗口內繪圖時,排除子窗口區域
 11 WS_MAXIMIZE     具備最大化按鈕
 12 WS_MAXIMIZEBOX  建立窗口擁有最大化按鈕,須同時指定WS_SYSTEM樣式
 13 WS_CAPTION      有標題框和邊框(和WS_TILED樣式相同)
 14 WS_BORDER       有單邊框
 15 WS_DLGFRAME     帶對話框邊框樣式,不帶標題框
 16 WS_VSCROLL      有垂直滾動條
 17 WS_HSCROLL      有水平滾動條
 18 WS_SYSMENU      標題框上帶有窗口菜單(須指定WS_CAPTION樣式)
 19 WS_THICKFRAME   有可調邊框(與WS_SIZEBOX樣式相同)
 20 WS_TILED        與WS_OVERLAPPED風格相同
 21 WS_TILEDWINDOW  與WWS_OVERLAPPEDWINDOW風格相同
 22 WS_GROUP        組樣式,每一個組的第一個控件具備WS_TABSTOP樣式
 23 WS_TABSTOP      可接受TAB鍵
 24 WS_OVERLAPPED   建立一個重疊式窗口,擁有標題欄和邊框
 25 WS_OVERLAPPEDWINDOW 即:WS_OVERLAPPED風格,WS_CAPTION風格,WS_SYSMENU風格
 26                   WS_THICKFRAME風格,WS_MINIMIZEBOX風格和WS_MAXIMIZEBOX
 27                     風格的組合
 28 
 29  
 30 
 31  
 32 
 33 /* 窗口擴展樣式參考列表:
 34                                      
 35 WS_EX_APPWINDOW -                                    當窗口可見時將一個頂層窗口放置在任務欄上                
 36 WS_EX_NOINHERITLAYOUT - 子控件不繼承窗體或控件的佈局
 37 WS_EX_LAYOUTRTL - 窗體或控件將具備從右向左的佈局(於是會被鏡像)
 38 WS_EX_COMPOSITED - 用雙緩衝從下到上繪製窗口的全部子孫(WinXP以上)
 39 WS_EX_NOACTIVATE - 處於頂層但不激活
 40 
 41 
 42 2、按鈕風格 
 43     
 44 BS_AUTOCHECKBOX   同複選按鈕相似,點擊一下選中,再次點擊取消。
 45 BS_AUTORADIOBUTTON同單選按鈕相似,點擊後選中標誌將從同組的其餘單選按鈕處移到當前選項。
 46 BS_CHECKBOX       複選按鈕
 47 BS_DEFPUSHBUTTON   默認普通按鈕,具備較黑的邊框。
 48 BS_GROUPBOX       分組框
 49 BS_LEFTTEXT       同單選按鈕或複選按鈕配合使用,標題將顯示在左側。
 50 BS_OWNERDRAW       可建立一個擁有者自繪按鈕。
 51 BS_PUSHBUTTON       普通下壓按鈕
 52 BS_RADIOBUTTON       圓形單選按鈕
 53 BS_3STATE       三態複選按鈕,三種狀態即:選中,未選中,未定
 54 BS_AUTOCHECKBOX   檢查框,按鈕的狀態會自動改變
 55 BS_AUTORADIOBUTTON圓形選擇按鈕,按鈕的狀態會自動改變
 56 BS_AUTO3STATE     容許按鈕有三種狀態即:選中,未選中,未定
 57 BS_CHECKBOX       檢查框
 58 BS_LEFTTEXT       左對齊文字
 59 
 60 3、旋轉按鈕控件
 61 
 62 UDS_HORZ 指定一個水平旋轉按鈕.若不指定該風格則建立一個垂直的旋轉按鈕.
 63 UDS_WRAP 當旋轉按鈕增大到超過最大值時,自動重置爲最小值,當減少至低於最小值時,自動重置爲最大值.
 64 UDS_ARROWKEYS 當用戶按下向下或向上箭頭鍵時,旋轉按鈕值遞增或遞減.
 65 UDS_SETBUDDYINT 旋轉按鈕將自動更新夥伴控件中顯示的數值,若是夥伴控件能接受輸入,則可在夥伴控件中輸入新的旋轉按鈕值.
 66 UDS_NOTHOUSANDS 夥伴控件中顯示的數值每隔三位沒有千位分隔符.
 67 UDS_AUTOBUDDY  自動使旋轉按鈕擁有一個夥伴控件.
 68 UDS_ALIGNRIGHT 旋轉按鈕在夥伴控件的右側.
 69 UDS_ALIGNLEFT  旋轉按鈕在夥伴控件的左側.
 70 
 71 4、軌道條控件
 72 
 73 TBS_HORZ 指定一個水平軌道條.該風格是默認的.
 74 TBS_VERT 指定一個垂直軌道條.
 75 TBS_AUTOTICKS 在範圍設定後,自動爲軌道條加上刻度.
 76 TBS_NOTICKS 軌道條無刻度.
 77 TBS_BOTTOM  在水平軌道條的底部顯示刻度,可與TBS_TOP一塊兒使用.
 78 TBS_TOP 在水平軌道條的頂部顯示刻度,可與TBS_BOTTOM一塊兒使用.
 79 TBS_RIGHT 在垂直軌道條的右側顯示刻度,可與TBS_LEFT一塊兒使用.
 80 TBS_LEFT 在垂直軌道條的左側顯示刻度,可與TBS_RIGHT一塊兒使用.
 81 TBS_BOTH 在軌道條的上下部或左右兩側都顯示刻度.
 82 TBS_ENABLESELRANGE 在軌道條中顯示一個選擇範圍.
 83 
 84 5、文本編輯框風格
 85 
 86 ES_AUTOHSCROLL     當在行尾添加一個字符後自動向右滾動10個字符。
 87 ES_AUTOVSCROLL     當輸入回車後自動上滾一行。
 88 ES_CENTER     字符居中顯示。
 89 ES_LEFT     字符左對齊。
 90 ES_LOWERCASE     統一轉化爲小寫字母。
 91 ES_MULTILINE     容許多行顯示。
 92 ES_NOHIDESEL     當編輯失去焦點時隱藏對字符的選定,從新得到焦點後以反色顯示選中內容。
 93 ES_OEMCONVERT     將ANSI字符轉化爲OEM字符。
 94 ES_PASSWORD     以星號顯示字符,多用於回顯密碼。
 95 ES_RIGHT     字符右對齊
 96 ES_UPPERCASE     統一轉化爲大寫字母。
 97 ES_READONLY     設置字符爲只讀。
 98 ES_WANTRETURN     接受回車鍵輸入。
 99 
100 6、列表框風格 
101     
102 LBS_STANDARD     建立一個具備邊界和垂直滾動條、當選擇發生變化或條目被雙擊時可以通知父窗口的標準列表框。全部條目按字母排序。
103 LBS_SORT     按字母排序。
104 LBS_NOSEL     條目可視但不可選。
105 LBS_NOTIFY     當用戶選擇或雙擊一個串時,發出消息通知父窗口。
106 LBS_DISABLENOSCROLL     在條目很少時依然顯示並不起做用的滾動條。
107 LBS_MULTIPLESEL     容許條目多選。
108 LBS_EXTENDEDSEL     可用SHIFT和鼠標或指定鍵組合來選擇多個條目。
109 LBS_MULTICOLUMN     容許多列顯示。
110 LBS_OWNERDRAWVARIABLE     建立一個擁有者畫列表框,條目高度能夠不一樣。
111 LBS_OWNERDRAWFIXED     建立一個具備相同條目高度的擁有者畫列表框。
112 LBS_USETABSTOPS     容許使用TAB製表符。
113 LBS_NOREDRAW     當條目被增刪後不自動更新列表顯示。
114 LBS_HASSTRINGS     記憶了添加到列表中的字串。
115 LBS_WANTKEYBOARDINPUT     當有鍵按下時向父窗口發送WM_VKEYTOITEM或WM_CHARTOITEM消息。
116 LBS_NOINTEGRALHEIGHT     按程序設定尺寸建立列表框。
117 
118 7、組合框風格
119 
120 CBS_AUTOHSCROLL 當在行尾輸入字符時自動將編輯框中的文字向右滾動。
121 CBS_DROPDOWN     同CBS_SIMPLE風格相似,只是只有在用戶點擊下拉圖標時纔會顯示出下拉列表。
122 CBS_DROPDOWNLIST 同CBS_DROPDOWN相似,只是顯示當前選項的編輯框爲一靜態框所代替。
123 CBS_HASSTRINGS     建立一個包含了由字串組成的項目的擁有者畫組合框。
124 CBS_OEMCONVERT     將組合框中的ANSI字串轉化爲OEM字符。
125 CBS_OWNERDRAWFIXED 由下拉列表框的擁有者負責對內容的繪製;列表框中各項目高度相同。
126 CBS_OWNERDRAWVARIABLE 由下拉列表框的擁有者負責對內容的繪製;列表框中各項目高度能夠不一樣。
127 CBS_SIMPLE     下拉列表始終顯示。
128 CBS_SORT     自動對下拉列表中的項目進行排序。
129 CBS_DISABLENOSCROLL 當下拉列表顯示內容過少時顯示垂直滾動條。
130 CBS_NOINTEGRALHEIGHT在建立控件時以指定的大小來精確設定組合框尺寸。
131 
132 8、樹形視圖控件
133 
134 TVS_HASLINES 在父項與子項間連線以清楚地顯示結構.
135 TVS_LINESATROOT 只在根部畫線.
136 TVS_HASBUTTONS 顯示帶有"+"或"-"的小方框來表示某項可否被展開或已展開.
137 TVS_EDITLABELS 用戶能夠編輯表項的標題.
138 TVS_SHOWSELALWAYS 即便控件失去輸入焦點,仍顯示出項的選擇狀態.
139 TVS_DISABLEDRAGDROP 不支持拖動操做.
140 
141 9、列表視圖控件
142 
143 
144 LVS_ALIGNLEFT 當顯示格式是大圖標或小圖標時,標題放在圖標的左邊.缺省狀況下標題放在圖標的下面.
145 LVS_ALIGNTOP 當顯示格式是大圖標或小圖標時,標題放在圖標的上邊.
146 LVS_AUTOARRANGE 當顯示格式是大圖標或小圖標時,自動排列控件中的表項.
147 LVS_EDITLABELS 用戶能夠修改標題.
148 LVS_ICON 指定大圖標顯示格式.
149 LVS_LIST 指定列表顯示格式.
150 LVS_NOCOLUMNHEADER 在報告格式中不顯示列的表頭.
151 LVS_NOLABELWRAP 當顯示格式是大圖標時,使標題單行顯示.缺省時是多行顯示.
152 LVS_NOSCROLL 列表視圖無滾動條.
153 LVS_NOSORTHEADER 報告列表視圖的表頭不能做爲排序按鈕使用.
154 LVS_OWNERDRAWFIXED 由控件的擁有者負責繪製表項.
155 LVS_REPORT 指定報告 顯示格式.
156 LVS_SHAREIMAGELISTS 使列表視圖共享圖像序列.
157 LVS_SHOWSELALWAYS 即便控件失去輸入焦點,仍顯示出項的選擇狀態.
158 LVS_SINGLESEL 指定一個單選擇列表視圖.缺省時能夠多項選擇.
159 LVS_SMALLICON 指定小圖標顯示格式.
160 LVS_SORTASCENDING 按升序排列表項.
161 LVS_SORTDESCENDING 按降序排列表項.
162 
163 10、靜態文本框風格
164 
165 SS_CENTER        字符居中顯示。
166 SS_LEFT          字符左對齊。
167 SS_LEFTNOWORADWRAP 字符左對齊,可處理TAB製表符,不支持自動換行,超過末尾字符被裁剪。
168 SS_BLACKRECT    用窗口邊框色填充的矩形。
169 SS_BLSCKFRAME   矩形邊框,與窗口邊框同色。
170 SS_GRAYRECT     用屏幕背景色填充的矩行。
171 SS_GRAYFRAME    矩形邊框,使用屏幕背景色。
172 SS_WHITERECT    用窗口背景色填充的矩行。
173 SS_RIGHT        字符右對齊
174 SS_WHITEFRAME   矩形邊框,使用窗口背景色。
175 
176  
177 
178  
179 
180 /* 控件樣式參考列表:
181 DS_ABSALIGN - 對話框的座標爲屏幕座標(缺省爲客戶區座標)
182 DS_SYSMODAL - 系統模式(僅支持16位程序),不能與DS_CONTROL同用
183 DS_LOCALEDIT - 在對話框內部爲編輯框分配內存(僅支持16位程序)
184 DS_SETFONT - 可定製對話框字體
185 DS_MODALFRAME - 框架樣式(不能與WS_CAPTION同用)
186 DS_NOIDLEMSG - 無空閒消息
187 DS_SETFOREGROUND - 使對話框在最前面顯示
188 DS_3DLOOK - 四周有3維邊框
189 DS_FIXEDSYS - 使用系統固定字體
190 DS_NOFAILCREATE - 忽略建立過程當中的錯誤
191 DS_CONTROL - 控件模式,可做爲其餘對話框的子窗口
192 DS_CENTER - 在屏幕居中
193 DS_CENTERMOUSE - 在鼠標位置居中
194 DS_CONTEXTHELP - 有上下文幫助按鈕
195 
196 
197 
198 /*已知代號的樣式列表
199  GWL_EXSTYLE, "-20"
200  GWL_STYLE, "-16"
201  GWL_WNDPROC, "-4"
202  WS_EX_ACCEPTFILES, "16" 可接受文件拖放
203  WS_EX_APPWINDOW, "262144" 當窗口可見時將一個頂層窗口放置在任務欄上
204  WS_EX_CLIENTEDGE, "512" 帶陰影的邊緣
205  WS_EX_CONTEXTHELP, "1024"  有上下文幫助樣式,標題欄包含一個問號標誌
206  WS_EX_CONTROLPARENT, "65536" 容許用戶使用TAB鍵在窗口的子窗口間搜索
207  WS_EX_DLGMODALFRAME, "1"  帶雙層邊框
208  WS_EX_LEFT, "0" 左對齊
209  WS_EX_LEFTSCROLLBAR, "16384" 垂直滾動條在窗口左邊界
210  WS_EX_LTRREADING, "0"
211  WS_EX_MDICHILD, "64" MDI子窗口樣式
212  WS_EX_NOPARENTNOTIFY, "4" 建立/銷燬時不通知父窗口
213  WS_EX_OVERLAPPEDWINDOW, "768" 帶凸起邊緣的邊框,邊緣有陰影
214  WS_EX_PALETTEWINDOW, "392" 帶立體邊框,有工具條窗口樣式,窗口在頂層
215  WS_EX_RIGHT, "4096" 右對齊
216  WS_EX_RIGHTSCROLLBAR, "0" 垂直滾動條在窗口右邊界
217  WS_EX_RTLREADING, "8192" 窗口文本從右到左顯示
218  WS_EX_STATICEDGE, "131072" 當窗口爲不可用狀態時建立一個三維邊緣
219  WS_EX_TOOLWINDOW, "128" 工具條窗口樣式
220  WS_EX_TOPMOST, "8" 窗口置頂(停留在全部非最高層窗口的上面)
221  WS_EX_TRANSPARENT, "32" 透明樣式,在同屬窗口已重畫時該窗口才可重畫
222  WS_EX_WINDOWEDGE, "256" 帶凸起邊緣的邊框
223  ICON_BIG, "1"
224  ICON_SMALL, "0"
225  WM_SETICON, "128"
226  WS_EX_LAYERED "524288"  分層或透明窗口,該樣式可以使用混合特效
複製代碼

 

出處:https://www.cnblogs.com/HopeGi/p/3452375.html

=============================================================================================

根據上面的代碼參考,本身實現一個本身在項目中使用的遮罩層--蒙版

namespace WindowsFormsApp1.Common
{
    using System.ComponentModel;
    using System.Drawing;
    using System.Windows.Forms;


    [ToolboxBitmap(typeof(MaskLayer))]
    public class MaskLayer : Control
    {

        /// <summary>
        /// 必需的設計器變量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清理全部正在使用的資源。
        /// </summary>
        /// <param name="disposing">若是應釋放託管資源,爲 true;不然爲 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region 組件設計器生成的代碼

        /// <summary>
        /// 設計器支持所需的方法 - 不要修改
        /// 使用代碼編輯器修改此方法的內容。
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }

        #endregion

        private bool _isTransparent = true;
        [Category("XX控件"), Description("是否使用透明,默認爲True"), DefaultValue(true)]
        public bool IsTransparent { get { return _isTransparent; } set { _isTransparent = value; } }

        private int _alpha = 125;//設置默認透明度
        [Category("XX控件"), Description("設置透明度")]
        public int Alpha
        {
            get { return _alpha; }
            set
            {
                if (value < 0) _alpha = 0;
                else if (value > 255) _alpha = 255;
                else _alpha = value;
                this.Invalidate();
            }
        }


        private bool _isShowLoadingImage = false;//設置默認值
        [Category("XX控件"), Description("是否顯示Loading的圖片"), DefaultValue(false)]
        public bool IsShowLoadingImage { get { return _isShowLoadingImage; } set { _isShowLoadingImage = value; } }


        private Control _bindControl;
        [Category("XX控件"), Description("要綁定的控件"), Browsable(false)]
        public Control BindControl
        {
            get { return _bindControl; }
            set
            {
                _bindControl = value;
                if (_bindControl != null)
                {
                    //this.Location = _bindControl.Location;
                    _bindControl.Controls.Add(this);
                }
                //this.BringToFront();
                //this.Invalidate(true);
            }
        }
        

        public MaskLayer() : this(125)
        {
            InitializeComponent();
        }

        /// <summary>
        /// 初始化加載控件
        /// </summary>
        /// <param name="Alpha"透明度</param>
        /// <param name="IsShowLoadingImage">是否顯示加載圖片</param>
        public MaskLayer(int Alpha)
        {
            SetStyle(ControlStyles.Opaque, true);//設置背景透明
            base.CreateControl();
            _alpha = Alpha;
            if (IsShowLoadingImage)
            {
                PictureBox pic = new PictureBox();
                pic.BackColor = Color.White;
                pic.Size = new Size(48, 48);
                pic.SizeMode = PictureBoxSizeMode.AutoSize;
                pic.Location = new Point(this.Location.X + (this.Width - pic.Width) / 2, this.Location.Y + (this.Height - pic.Height) / 2);//居中
                pic.Anchor = AnchorStyles.None;
                //pic.Image = Resource.loading;
                //this.Controls.Add(pic);
            }
            this.Visible = false;
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00000020; // 開啓 WS_EX_TRANSPARENT,使控件支持透明
                return cp;
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            //定義畫筆顏色
            Color _color = IsTransparent ? Color.FromArgb(_alpha, this.BackColor) : this.BackColor;

            //畫背景
            using (SolidBrush brush = new SolidBrush(_color))
            {
                e.Graphics.FillRectangle(brush, 0, 0, this.Size.Width, this.Size.Height);
            }
            //畫邊框
            if (!this.DesignMode)
            {
                System.Diagnostics.Debug.WriteLine("No DesignMode");
                using (Pen pen = new Pen(_color))
                {
                    e.Graphics.DrawRectangle(pen, 0, 0, this.Size.Width, this.Size.Height);
                    //e.Graphics.DrawRectangle(Pens.Red, 0, 0, this.Size.Width - 1, this.Size.Height - 1);
                }
            }
            else
            {
                System.Diagnostics.Debug.WriteLine("DesignMode");
                e.Graphics.DrawRectangle(Pens.Blue, 1, 1, this.Size.Width - 2, this.Size.Height - 2);
            }
        }

        /// <summary>
        /// 顯示加載
        /// </summary>
        public void ShowMaskLayer()
        {
            this.BringToFront();
            this.Dock = BindControl != null ? DockStyle.Fill : DockStyle.None;
            this.Visible = true;
        }

        /// <summary>
        /// 隱藏加載
        /// </summary>
        public void HideMaskLayer()
        {
            this.Visible = false;
        }
                              
    }

}
View Code

說明:

DefaultValue,只是告訴設計界面這個屬性的默認值是什麼,並不能在工具箱中拖一個控件時,使用到默認值,(至少在這裏使用的bool值是這樣的狀況)

BindControl,這個屬性建議在使用的時候,直接在cs代碼中設置,在設計界面的屬性裏面直接設置到指定的控件,因爲不一樣類型的控件,會跳到一個不肯定的位置上。

相關文章
相關標籤/搜索