




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络安全产品研发人员保密协议及技术保密义务
- 出租车企业股权转让与城市交通管理服务合同
- 《国有土地产权方与承租管理公司合作协议》
- 成都高端住宅项目代理销售服务合同
- 时尚商业街区场地租赁及品牌入驻管理合同
- 餐饮连锁品牌股权联营合同
- 爆破拆除工程安全生产责任保险合同
- ICU急救药物的应用
- 智能制造参股经营合同文本
- 仓库管理员职位聘用及保密协议
- 22S803 圆形钢筋混凝土蓄水池
- 东南大学高等数学实验报告-2
- 人力资源管理:基于创新创业视角学习通超星课后章节答案期末考试题库2023年
- 离心泵检修课件
- 西师版小学数学-毕业总复习资料
- 汉明码编译码实验新编
- 职业暴露针刺伤应急预案演练脚本-
- 中小跨径桥梁结构健康监测技术讲稿2017.4.9杭州
- GB/T 16849-2023光放大器总规范
- 求职登记表(标准模版)
- 正确认识中华传统文化说课课件 第二课时
评论
0/150
提交评论