实现效果图1:

实现效果图2:

实现效果图3:

异形窗体的实现思路
(一)、采用UpdateLayeredWindow这个api函数基于Png图alpha通道绘制异形窗口
           优点:真正意义上的异形窗口
           缺点:用了WS_EX_LAYERED后当前窗体不处理paint事件,所以窗体上无法绘制控件,但这个控件确存在,而且可以响应事件

解决无法绘制控件方法:
              1、思路:
              采用双层窗口:底层背景窗口层与顶层控件层,用控件层Show()背景层,同时处理窗体的窗口移动事件,让另外一个窗体同步移动或者做其它事情。
        
              2、实现:
              底层背景层:采用UpdateLayeredWindow这个api函数基于带Alpha通道的Png图绘制 
              顶层控件层:
                  方法一:采用无边框窗口,把窗口背景颜色BackColor设置一个不常用颜色例如:ff00ff颜色,且把窗口TransparencyKey颜色属性设跟背景色BackColor一样(意义:去除带背景色的区域从而显示后面背景层)
                  方法二:采用无边框窗口,把窗口背景设为背景层对应位置的位图,给人一种透明的效果,但是编辑会有所限制。(SkinWhetherTank属性可以切换这两种透明模式)

优点:可以解决显示控件的问题,不影响控件的使用
             缺点:方法一会让部分控件有毛边,方法二会让窗体编辑受限制。(缺点有待解决,望高手指点)

属性:
              GradientTime:控件层渐变特效时长(越小越快)。
              MainPosition:窗口在绘图层位置。
              SkinBack:设置或获取绘图层窗口背景。
              SkinMobile:窗体是否可以移动。
              SkinOpacity:设置或获取绘图层窗口透明度(0-255)。
              SkinShowInTaskbar:绘图层是否出现在Windows任务栏中。
              SkinSize:设置或获取绘图层窗口大小。
              SkinTrankColor:绘图层需要透明的颜色。
              SkinWhetherTank:绘图层是否开启位图仿透明  注意(SkinOpacity < 255时,此属性为False可达到背景透明,控件不透明的效果。)。

 1 /// <summary>2 /// 创建支持位图区域的控件(目前有button和form)3 /// </summary>4 /// <param name="control">控件</param>5 /// <param name="bitmap">位图</param>6 public static void CreateControlRegion(Control control, Bitmap bitmap)7 {8     //判断是否存在控件和位图9     if (control == null || bitmap == null)
10         return;
11
12     control.Width = bitmap.Width;
13     control.Height = bitmap.Height;
14     //当控件是form时
15     if (control is System.Windows.Forms.Form)
16     {
17         //强制转换为FORM
18         Form form = (Form)control;
19         //当FORM的边界FormBorderStyle不为NONE时,应将FORM的大小设置成比位图大小稍大一点
20         form.Width = control.Width;
21         form.Height = control.Height;
22         //没有边界
23         form.FormBorderStyle = FormBorderStyle.None;
24         //将位图设置成窗体背景图片
25         form.BackgroundImage = bitmap;
26         //计算位图中不透明部分的边界
27         GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
28         //应用新的区域
29         form.Region = new Region(graphicsPath);
30     }
31     //当控件是button时
32     else if (control is System.Windows.Forms.Button)
33     {
34         //强制转换为 button
35         Button button = (Button)control;
36         //不显示button text
37         button.Text = "";
38
39         //改变 cursor的style
40         button.Cursor = Cursors.Hand;
41         //设置button的背景图片
42         button.BackgroundImage = bitmap;
43
44         //计算位图中不透明部分的边界
45         GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
46         //应用新的区域
47         button.Region = new Region(graphicsPath);
48     }
49 }
50
51 //计算位图中不透明部分的边界
52 private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
53 {
54     //创建 GraphicsPath
55     GraphicsPath graphicsPath = new GraphicsPath();
56     //第一个找到点的X
57     int colOpaquePixel = 0;
58     // 偏历所有行(Y方向)
59     for (int row = 0; row < bitmap.Height; row++)
60     {
61         //重设
62         colOpaquePixel = 0;
63         //偏历所有列(X方向)
64         for (int col = 0; col < bitmap.Width; col++)
65         {
66             //如果是不需要透明处理的点则标记,然后继续偏历
67             if (bitmap.GetPixel(col, row).A == 255)
68             {
69                 //记录当前
70                 colOpaquePixel = col;
71                 //建立新变量来记录当前点
72                 int colNext = col;
73                 ///从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度
74                 for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++)
75                     if (bitmap.GetPixel(colNext, row).A < 255)
76                         break;
77                 //将不透明点加到graphics path
78                 graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));
79                 col = colNext;
80             }
81         }
82     }
83     return graphicsPath;
84 }

转载之:CSkin论坛

案例源码下载:http://bbs.cskin.net/thread-54-1-1.html

完美实现无毛边异形窗体相关推荐

  1. WinForm 无毛边异形窗体

    WinForm 无毛边异形窗体 using System; using System.Collections.Generic; using System.ComponentModel; using S ...

  2. 使用duilib开发半透明异形窗体程序(附源码和demo)

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/43532791 半透明异形窗体的功能在之前维护的老版本的duilib里面已 ...

  3. duilib设置透明窗口_使用duilib开发半透明异形窗体程序(补充)

    距离上一篇半透明窗体的博客,已经过去一年,现在这几天又对Duilib进行了一些优化和修复.这次我把CRenderEngine的渲染函数都改成了基于Gdi+的.根据我的测试,因为Duilib所需的都是最 ...

  4. delphi(XE2)实现图片异形窗体,支持摆放控件

    网上有较多使用UpdateLayeredWindow函数实现美化的图片异形窗体的代码,一般使用此场景时,对软件界面要求较高.但是实现了图片窗体后,在窗体中摆放不了其他控件,导致这个功能很鸡肋.为解决此 ...

  5. 异形窗体WinFrom

    第一步:创建WinFrom窗体 第二部:属性:AutoScaleMode:Dpi 第三步:BackColor:White 第四步:FormBorderStyle:None 第五步:Transparen ...

  6. python界面设计实例qt_python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例...

    在默认情况下,我们使用PyQt5创建出来的窗口和部件都是默认的样式,虽然谈不上很丑,但是也毫无美感可言.其实,在PyQt5中,我们可以有较高的自由度来自定义窗口和各种小部件的样式,通过自定义这些样式, ...

  7. C#WinForm制作异形窗体/控件

    制作异形窗体或控件的思路一般都是想办法生成一个region,然后设置给指定的窗口或控件.生成region的方法有很多,最常用的就是从一幅图片生成,把该图片中的透明色部分"抠"掉,剩 ...

  8. linux qt绘框,Qt绘制异形窗体

    异形窗体即不规则窗体,一般采用png图片,一般绘制异形窗体分两步: 1.设置遮罩区 2.绘制图片 使用png图片的透明部分作为遮罩区,然后绘制图片,这样我们就看到一个只绘制了非透明部分的图形,废话少说 ...

  9. 无盘服务器回写盘intel,无盘回写盘碎片清理工具 完美解决无盘回写盘碎片

    本无盘回写碎片清理工具可完美解决无盘回写盘碎片,安装完毕本软件设置一下即可实现回写盘碎片的自动清理,不错吧??提示:适用于锐起,锐腾无盘回写清理! 回写盘自动清理会自动格式化指定的盘(支持多个盘,块大 ...

最新文章

  1. 帝国cms php7.0,帝国cms升级到7.0 出现Unknown错误的解决办法
  2. Word 2016加载Endnote x9的方法
  3. boost::combine相关的测试程序
  4. netty系列之:一个价值上亿的网站速度优化方案
  5. mysql内连接部门平均值_详解MySql基本查询、连接查询、子查询、正则表达查询_MySQL...
  6. fedora27安装谷歌浏览器Chrome
  7. Java swing实现简单的浏览器源码免费分享
  8. 计算机相关专业“Python程序设计”教学大纲(参考)
  9. 去中心化数据基础架构Stratos融资183万美元,Spark Digital Capital等参投
  10. erlang 动态编译和加载遇到的问题。
  11. shell函数显式的返回值
  12. linux打开mid格式音乐,mid文件扩展名,mid文件怎么打开?
  13. “程序员的理财计划”-待完善
  14. Kindle Fire 刷机至Android 4.2.2
  15. 你是哪种类型的代码斗士
  16. 端午安康,用python给你画盘粽子~啾啾
  17. Win7系统下安装微磁学软件OOMMF方法
  18. 注册表usbstor删除不了_彻底清除注册表U盘与USB使用记录技巧
  19. oracle的经典总结
  20. Apriori算法总结

热门文章

  1. 17_AOP入门准备_Salay案例(利用动态代理)
  2. 小程序wx.request通过post方式提交数据给服务器-小程序支付开发教程
  3. [代码人生][分享]SQl语句学习专题
  4. springboot消费kafka Listener method could not be invoked with the incoming message
  5. BLE 怎样添加 Characteristic
  6. Qlikview连接Mysql数据源
  7. 【国企笔试】263、山有色:水发声 A 山河在:草木深 B 客舍青:柳色新 C 鸟飞绝:人踪灭 D 花作尘:鸟不惊
  8. matlab2014simulink中的三相晶闸管整流桥怎么找_哈尔滨有源滤波组件HPD2000-100-4L坏了怎么办 - 哈尔滨照明工业...
  9. C语言-make概述
  10. OpenSTF_Android终端设备管理平台搭建