zoukankan      html  css  js  c++  java
  • WinForm 简单蒙版实现控件遮盖

      在Web上面要实现一个遮罩层或者说是蒙版吧,有了DIV那不算什么难事,只要给div定好位置和大小,把颜色的Alpha值设一下就有透明的效果。不过在Winform中实现起来就没那么简单了事。尝试过用一个Panel,那底色设成透明,真的透明了。窗体后面的东西都显示出来了。就是没把Panel盖住的控件显示出来。这样看来不是办法。谷了一会儿歌。找到了一个,还是要写控件的,不算难,但用到了一点儿没见过的东西。经一事长一智吧。

      重写到了一个Control的属性CreateParams,它是CreateParams类型的。关于这个类,MSDN上简单解释道:封装创建控件时所需的信息。而依我看是关于样式的设置,而且里面的样式设置都是些0x00000040、0x00000020的按位组合。在网上找了一些,整理了了一下也塞到博文的最后面。

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

    这样写控件下去,多半是要去重绘的,这里重写OnPaint方法不过不复杂,给控件填背景色,还是直接把所有代码贴出来。

     1     public class MaskLayer:Control
     2     {
     3         private int alpha;
     4 
     5         public MaskLayer()
     6         {
     7             alpha = 125;
     8             SetStyle(System.Windows.Forms.ControlStyles.Opaque, true);
     9             base.CreateControl();
    10         }
    11 
    12         protected override void OnPaint(PaintEventArgs e)
    13         {
    14 
    15             base.OnPaint(e);
    16             Color color = Color.FromArgb(alpha, this.BackColor);
    17             using (SolidBrush brush = new SolidBrush(color))
    18             {
    19                 e.Graphics.FillRectangle(brush, 0, 0, this.Size.Width, this.Size.Height);
    20             }
    21             if (!this.DesignMode)
    22             {
    23                 using (Pen pen = new Pen(color))
    24                 {
    25                     e.Graphics.DrawRectangle(pen, 0, 0, this.Width, this.Height);
    26                 }
    27             }
    28             else
    29                 e.Graphics.DrawRectangle(Pens.Black, 1, 1, this.Width - 2, this.Height - 2);
    30         }
    31 
    32         protected override CreateParams CreateParams
    33         {
    34             get
    35             {
    36                 CreateParams cp = base.CreateParams;
    37                 cp.ExStyle |= 0x00000020;
    38                 return cp;
    39             }
    40         }
    41 
    42         public int Alpha
    43         {
    44             get
    45             {
    46                 return alpha;
    47             }
    48             set
    49             {
    50                 if (value < 0) alpha = 0;
    51                 else if (value > 255) alpha = 255;
    52                 else alpha = value;
    53                 this.Invalidate();
    54             }
    55         }
    56 
    57     }

    下面就罗列一些系网上搜刮回来的的窗口样式,绝大部分没那个代表的整形值,有些就算是有了也是重复的,摸不着

      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 二、按钮风格 
     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 三、旋转按钮控件
     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 四、轨道条控件
     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 五、文本编辑框风格
     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 六、列表框风格 
    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 七、组合框风格
    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 八、树形视图控件
    133 
    134 TVS_HASLINES 在父项与子项间连线以清楚地显示结构.
    135 TVS_LINESATROOT 只在根部画线.
    136 TVS_HASBUTTONS 显示带有"+"或"-"的小方框来表示某项能否被展开或已展开.
    137 TVS_EDITLABELS 用户可以编辑表项的标题.
    138 TVS_SHOWSELALWAYS 即使控件失去输入焦点,仍显示出项的选择状态.
    139 TVS_DISABLEDRAGDROP 不支持拖动操作.
    140 
    141 九、列表视图控件
    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 十、静态文本框风格
    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"  分层或透明窗口,该样式可使用混合特效
    Windows常见窗口样式和控件风格
  • 相关阅读:
    UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
    POJ 1679 The Unique MST (次小生成树)题解
    POJ 2373 Dividing the Path (单调队列优化DP)题解
    BZOJ 2709 迷宫花园
    BZOJ 1270 雷涛的小猫
    BZOJ 2834 回家的路
    BZOJ 2506 calc
    BZOJ 3124 直径
    BZOJ 4416 阶乘字符串
    BZOJ 3930 选数
  • 原文地址:https://www.cnblogs.com/HopeGi/p/3452375.html
Copyright © 2011-2022 走看看