详解C#创建不规则窗体的几种方式_第1页
详解C#创建不规则窗体的几种方式_第2页
详解C#创建不规则窗体的几种方式_第3页
详解C#创建不规则窗体的几种方式_第4页
详解C#创建不规则窗体的几种方式_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、详解C#创建不规则窗体的几种方式2010年9月14日 月高风黑    浏览:512次 发表评论 阅读评论 现在,C#创建不规则窗体不是一件难事,下面总结一下:一、自定义窗体一般为规则的图形,如圆、椭圆等。做法:重写Form1_Paint事件(Form1是窗体的名字),最简单的一种情况如下:1. System.Drawing.Drawing2D.GraphicsPath shape = new System.Drawing.Drawing2D.GraphicsPath();  2.3. shape.AddEllips

2、e(0,0,this.Height, this.Width);  4.5. this.Region = new Region(shape); 6.即重绘窗体的规则。二、利用背景图片实现1.  设置窗体的背景图片,其中背景图片是24位(不包括24)以下的位图(BMP图片),并且要设置TansparencyKey的值,一般为你背景图片的背景色,即创建不规则图片时的底色,一般设为你图片中没有的颜色。这种做法的不好的地方就是背景图片一定要16位或者更低的,而且还要确保客户端的显示。如果监视器的颜色深度设置大于 24 位,则

3、不管 TransparencyKey 属性是如何设置的,窗体的非透明部分都会产生显示问题。若要避免出现这种问题,请确保“显示”控制面板中的监视器颜色深度的设置小于 24 位。当开发具有这种透明功能的应用程序时,请牢记应使您的用户意识到此问题。实现步骤如下:1 新建windows application2 选择窗体,找到BackgroundImage属性,点击打开新的窗口,选择下面的导入资源文件,选择你的不规则的BMP图片3 找到窗体的TansparencyKey,将它设置为你背景图片的背景色(如黄色)4 找到窗体的FormBorderStyle,将其设置

4、为none,即不显示标题栏5 运行<!endif>2.       跟背景图片一样的图形,不过是动态加载,遍历位图以实现不规则窗体。它的原理是这样的,在Form的load事件中写方法使得窗体的描绘区域发生改变。实现步骤如下:1 建立winform应用程序2 找到窗体的Load事件,双击进行编辑3 编写方法,主要的代码如下:1. class BitmapRegion   2.   3.     public 

5、;BitmapRegion()   4.         5.6.7.     / <summary>    8.     / Create and apply the region on the supplied control   9.     / 创建

6、支持位图区域的控件(目前有button和form)   10.     / </summary>    11.     / <param name=”control”>The Control object to apply the region to控件</param>    12.     

7、/ <param name=”bitmap”>The Bitmap object to create the region from位图</param>    13.     public static void CreateControlRegion(Control control, Bitmap bitmap)   14.   &

8、#160;    15.         / Return if control and bitmap are null   16.         /判断是否存在控件和位图   17.         if (control =

9、 null | bitmap = null)   18.             return;   19.20.         / Set our controls size to be the same as the

10、0;bitmap   21.         /设置控件大小为位图大小   22.         control.Width = bitmap.Width;   23.         control.Height = bitmap.Height;   24.  &#

11、160;      / Check if we are dealing with Form here    25.         /当控件是form时   26.         if (control is System.Windows

12、.Forms.Form)   27.            28.             / Cast to a Form object   29.             /强制转换为FORM &

13、#160; 30.             Form form = (Form)control;   31.             / Set our forms size to be a little larger 

14、that the  bitmap just    32.             / in case the forms border style is not set to none in the first place    33.  

15、           /当FORM的边界FormBorderStyle不为NONE时,应将FORM的大小设置成比位图大小稍大一点   34.             form.Width = control.Width;   35.         

16、    form.Height = control.Height;   36.             / No border    37.             /没有边界   38.     &

17、#160;       form.FormBorderStyle = FormBorderStyle.None;   39.             / Set bitmap as the background image    40.      &

18、#160;      /将位图设置成窗体背景图片   41.             form.BackgroundImage = bitmap;   42.             / Calculate the graphic

19、s path based on the bitmap supplied    43.             /计算位图中不透明部分的边界   44.             GraphicsPath graphicsPath = Calc

20、ulateControlGraphicsPath(bitmap);   45.             / Apply new region    46.             /应用新的区域   47.        

21、;     form.Region = new Region(graphicsPath);   48.            49.         / Check if we are dealing with Button here   

22、 50.         /当控件是button时   51.         else if (control is System.Windows.Forms.Button)   52.            53.       

23、;      / Cast to a button object    54.             /强制转换为 button   55.             Button button

24、60;= (Button)control;   56.             / Do not show button text    57.             /不显示button text   58.    

25、         button.Text = “”;   59.60.             / Change cursor to hand when over button    61.       

26、60;     /改变 cursor的style   62.             button.Cursor = Cursors.Hand;   63.             / Set background image&#

27、160;of button    64.             /设置button的背景图片   65.             button.BackgroundImage = bitmap;   66.67.       &

28、#160;     / Calculate the graphics path based on the bitmap supplied    68.             /计算位图中不透明部分的边界   69.        

29、0;    GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);   70.             / Apply new region    71.           

30、;  /应用新的区域   72.             button.Region = new Region(graphicsPath);   73.            74.        75.     / &

31、lt;summary>    76.     / Calculate the graphics path that representing the figure in the bitmap    77.     / excluding the transparent color which is

32、60;the top left pixel.    78.     / /计算位图中不透明部分的边界   79.     / </summary>    80. / <param name=”bitmap”>The Bitmap object to calculate our graphics path&

33、#160;from</param>    81.     / <returns>Calculated graphics path</returns>    82.     private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)   83.    

34、    84.         / Create GraphicsPath for our bitmap calculation    85.         /创建 GraphicsPath   86.         GraphicsP

35、ath graphicsPath = new GraphicsPath();   87.         / Use the top left pixel as our transparent color    88.         /使用左上角的一点的颜色作为我们透明色 &#

36、160; 89.         Color colorTransparent = bitmap.GetPixel(0, 0);   90.         / This is to store the column value where an opaque pixel

37、0;is first found.    91.    / This value will determine where we start scanning for trailing opaque pixels.   92.         /第一个找到点的X   93.    

38、;     int colOpaquePixel = 0;   94.         / Go through all rows (Y axis)    95.         / 偏历所有行(Y方向)   96.   

39、0;     for (int row = 0; row < bitmap.Height; row+)   97.            98.             / Reset value   

40、99.             /重设   100.             colOpaquePixel = 0;   101.             / Go through

41、 all columns (X axis)    102.             /偏历所有列(X方向)   103.             for (int col = 0; col < bitmap.Wid

42、th; col+)   104.                105.         / If this is an opaque pixel, mark it and search for anymore trailing 

43、behind    106.                 /如果是不需要透明处理的点则标记,然后继续偏历   107.                 if (bitmap.GetPixel(col, row) !=

44、 colorTransparent)   108.                    109.                     / Opaque pixel found

45、, mark current position   110.                     /记录当前   111.                   

46、60; colOpaquePixel = col;   112.               / Create another variable to set the current pixel position    113.       

47、0;             /建立新变量来记录当前点   114.                     int colNext = col;   115.      

48、;          / Starting from current found opaque pixel, search for anymore opaque pixels    116.             / trailing&#

49、160;behind, until a transparent   pixel is found or minimum width is reached    117.                     /从找到的不透明点开始,继续寻找不透明点

50、,一直到找到或则达到图片宽度    118.                 for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext+)   119.          &#

51、160;              if (bitmap.GetPixel(colNext, row) = colorTransparent)   120.                      

52、       break;   121.             / Form a rectangle for line of opaque   pixels found and add it to our graphics

53、60;path    122.                     /将不透明点加到graphics path   123.             graphicsPath.AddRectangle(new Rectangl

54、e(colOpaquePixel, row, colNext - colOpaquePixel, 1);   124.                     / No need to scan the line of opaque pixels&#

55、160;just found    125.                     col = colNext;   126.                    1

56、27.                128.            129.         / Return calculated graphics path    130.      

57、   return graphicsPath;   131.        132.   4 运行<!-endif->三、调用类库实现主要就是根据一些坐标,然后根据这些坐标绘制窗体代码如下:1. public Form3()  2.3.           4.5.        

58、60;    InitializeComponent();  6.7.             /创建不规则窗体  8.9.             POINTAPI poin;  10.11.        

59、     poin = new POINTAPI5;  12.13.             poin0.x = 90;  14.15.             poin0.y = 90;  16.17. &#

60、160;           poin1.x = this.Width;  18.19.             poin1.y = 0;  20.21.             poin2

61、.x = Width;  22.23.             poin2.y = this.Height / 2;  24.25.             poin3.x = Width / 2;  26.27.  &

62、#160;          poin3.y = Height / 2;  28.29.             poin4.x = 0;  30.31.             

63、poin4.y = Width;  32.33.             Boolean flag = true;  34.35.             IntPtr hRgn = CreatePolygonRgn(ref poin0, 

64、8, 1);  36.37.             SetWindowRgn(this.Handle, hRgn, ref flag);  38.39.             this.BackColor = Color.BurlyWood;  40.41.           42.43.         StructLayout(LayoutKind.Sequential)  44.45.         private struct POINTAPI  46.47.        

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论