本文转自:http://www.cnblogs.com/haiq/articles/1751777.html

Winform窗体通常都是矩形的,而本人在需要将一幅图片作为窗体背景,并且窗体边框呈现为图片外轮廓的不规则边缘时,却发现Framework并没有提供直接的实现。经过一通百度、Google和查阅 MSDN 后,发现实现的途径主要有以下几种:

  1. 覆盖 Form 本身的绘制,自己用代码重绘。
  2. 设置窗体的 TransparencyKey 为窗体设置背景图片边缘要成为不规则边框的部分的颜色。
  3. 根据图片或者其它的方式创建不规则的 GraphicPath 生成 Region,指定给窗体的 Region 属性。

这三种方法各有优劣:

  • 第1种最麻烦,因为要靠代码一点点抠,要达到良好效果不容易,也不易于以后的修改。
  • 第2种最简单,但有制约条件:a、图片的边缘部以外必须是TransparencyKey指定的颜色,并且图片的其它部分不能有这种颜色,否则会被不加区分的变为透明,而导致窗体出现镂空。b、系统必须运行在 24 位色下。因此,这种方法并不实用。
  • 第3种的复杂程度介于1、2之间,并且控制也比较灵活。故本人选择了这种实现方式。

对于第3种方法,网上大多数的文章都只是介绍了实现的原理和一些简单的 Demo 代码。直接照做可能会遇到以下的一些问题而影响显示效果:

  • 窗体的边缘和作为背景的图片外轮廓不重叠,出现错位。
  • 界面上的控件布局时不容易定位于背景图片的相对位置。

解决这两个问题很简单,是要注意一些操作的细节。先看实现代码:

不规则窗体的实现

1             //从指定的位图中获取透明度大于 10 的区域;
 2              Bitmap img = (Bitmap)pictbox.Image;
 3             GraphicsPath grapth = BitmapUtil.GetNoneTransparentRegion(img, 10);
 4             this.Region = new Region(grapth);
 5             
 6             //要显示的图片设置为窗体背景;
 7              this.BackgroundImage = pictbox.Image;
 8             this.BackgroundImageLayout = ImageLayout.Zoom;
 9
10             //在修改窗体尺寸之前设置窗体为无边框样式;
11              this.FormBorderStyle = FormBorderStyle.None;
12             this.Width = pictbox.Image.Width;
13             this.Height = pictbox.Image.Height;

BitmapUtil.GetNoneTransparentRegion 方法的实现如下:

读取位图的非透明区域

1         /// <summary>
 2         /// 返回指定图片中的非透明区域;
 3         /// </summary>
 4         /// <param name="img">位图</param>
 5         /// <param name="alpha">alpha 小于等于该值的为透明</param>
 6         /// <returns></returns>
 7          public static GraphicsPath GetNoneTransparentRegion(Bitmap img, byte alpha)
 8         {
 9             int height = img.Height;
10             int width = img.Width;
11
12             int xStart, xEnd;
13             GraphicsPath grpPath = new GraphicsPath();
14             for (int y = 0; y < height; y++)
15             {
16                 //逐行扫描;
17                  for (int x = 0; x < width; x++)
18                 {
19                     //略过连续透明的部分;
20                     while (x < width && img.GetPixel(x, y).A <= alpha)
21                     {
22                         x++;
23                     }
24                     //不透明部分;
25                     xStart = x;
26                     while (x < width && img.GetPixel(x, y).A > alpha)
27                     {
28                         x++;
29                     }
30                     xEnd = x;
31                     if (img.GetPixel(x - 1, y).A > alpha)
32                     {
33                         grpPath.AddRectangle(new Rectangle(xStart, y, xEnd - xStart, 1));
34                     }
35                 }
36             }
37             return grpPath;
38         }

以上的代码中,解决边框与背景出现错误的办法是“在修改窗体尺寸之前设置窗体为无边框样式”,因为,窗体的长宽是包含在窗体标题栏的尺寸的,而背景显示图片的工作区是除去窗体标题栏的。

解决在设计时“界面控件在背景图片上的布局问题”可以也很简单,通过一些操作技巧就可以达到,具体如下:

  • 设计窗体时,通过Visual Studio窗体设计器将背景图片设置为窗体背景,将 BackgroundImageLayout 属性设为 Zoom,这样就能在设计时观察到背景。
  • 采用 TableLayoutPanel 面板进行布局,布局上采用相对尺寸。控件布局在网格之中,网格的行列的宽度值都按百分比定位。这样就不需要关注窗体显示尺寸的绝对值,在实际显示的时候,哪怕窗体大小发生改变,界面上控件与背景图片的相对位置也能保持设计时的相对定位。

转载于:https://www.cnblogs.com/freeliver54/archive/2013/04/16/3024216.html

[转]Winform不规则窗体的实现心得相关推荐

  1. 一起谈.NET技术,C#创建不规则窗体的几种方式

    现在,C#创建不规则窗体不是一件难事,下面总结一下:       一.自定义窗体,一般为规则的图形,如圆.椭圆等. 做法:重写Form1_Paint事件(Form1是窗体的名字),最简单的一种情况如下 ...

  2. winform基础窗体设置及基础控件

    WinForm - 也叫做C/S  客户端 另:B/S是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点: 不需要联网也可以打开使用部分功能,但是现在的情况是许多功能依然需要 ...

  3. [转][小结][三种方法]实现WPF不规则窗体

    实现WPF不规则窗体的三种常用的方法如下: 1.使用Blend等工具绘制一个不规则xaml,然后作为窗体的背景.这个可以参考xiaowei0705的这篇博文:WPF制作不规则的窗体 . 2.给wind ...

  4. Qt中不规则窗体和部件的实现

    Qt中不规则窗体和部件的实现 描述:a.png 窗口背景图 图片: 描述:mask.png 窗口掩码图 图片: 描述:toolbutton.png 按钮背景图 图片: 描述:toolbutton_ma ...

  5. Winform程序窗体间的跳转

    关于Winform程序窗体间的跳转问题: 对于编程新手来讲,winform程序窗体间的跳转,经常会出现一些异常,或是弹出重复的窗口,如下图 下面给出一种方法,可以很好的避免掉这样的问题: 首先,在主程 ...

  6. WinForm开发,窗体显示和窗体传值相关知识总结

    以前对WinForm窗体显示和窗体间传值了解不是很清楚 最近做了一些WinForm开发,把用到的相关知识整理如下 A.WinForm中窗体显示显示窗体可以有以下2种方法: Form.ShowDialo ...

  7. WinForm禁用窗体自带的关闭功能

    1.代码结构 2.实现代码 using System; using System.Windows.Forms;namespace WinFormForbidCloseDemo {/// <sum ...

  8. 事件过滤器及不规则窗体

    事件过滤器及不规则窗体 文章目录 事件过滤器及不规则窗体 一.事件过滤器 二.不规则窗体 一.事件过滤器 有时候, 对象需要查看. 甚至要拦截发送到另外对象的事件. 例如, 对话框可能 想要拦截按键事 ...

  9. C# 制作不规则窗体的两种解决方案

    我的广告单元,有空点一下哦,谢谢! 冒着被拍砖的危险,投放到首页.C#制作不规则窗体应该又是一个老生常谈的问题了,可能很多老鸟会带BS的眼神,那么请老鸟们视该文章如浮云吧. 制作不规则窗体,本例采用图 ...

最新文章

  1. java之yield(),sleep(),wait()区别详解
  2. java项目打成jar和war_maven打包web项目时同时打包为war和jar文件的方法
  3. 归并排序(Merge_Sort)
  4. 仅剩296个免费名额,AI工程师进阶必修课今日领取
  5. java selenium (二) 环境搭建方法一
  6. sql server insert 锁表_SQL Server的insert执行的秘密(下) 带外键的insert分析
  7. Xshell6已过期的解决方案
  8. MathType:在公式中插入空格
  9. 视频教程-【国内首套H3C V7交换机实战课程-1】Comware V7使用、维护与管理-H3C认证
  10. 面经(2022 美团暑期实习 -一面)
  11. 【开源工程】VirtualDub
  12. oracle 加权久期,久期 - MBA智库百科
  13. Pycharm中c、m、F、f、v、p分别代表什么含义
  14. 迈阿密大学的计算机系咋样,美国迈阿密大学计算机专业本科.pdf
  15. VBA基础,工作簿workbook相关的方法和属性
  16. 试题 C: 数列求值
  17. SDP: Session Description Protocol(会话描述协议) (RFC2327)
  18. python手机app开发_在手机上用python开发APP
  19. 如何用Java语言打印出九九乘法表
  20. 毕业设计 单片机太空游戏机设计与实现

热门文章

  1. 算法小结——qsort函数
  2. ★LeetCode(429)——N叉树的层序遍历(JavaScript)
  3. JavaScript数据结构——树(Tree)
  4. 计算机网络学习笔记(27. Email应用概述)
  5. 电脑内存16g和32g,有什么区别?
  6. 两相电机倒顺开关的接法是什么?
  7. 终端实体店消费者喜爱的营销方式
  8. 找不到合适的创业路该怎么办
  9. Seeing this, many people find it incredible
  10. 快速理解MapReduce