C# Winform 窗体美化(六、双层窗体)

六、双层窗体

大概情况

双层床体是为了平滑的创建异形窗体的一个解决方案,找了很多资料,整理了一下。

双层窗体的逻辑是建立在 UpdateLayeredWindow 不能绘制控件的基础上,上层再添加一个专门放置控件的层;这样就可以在上层“控件层”放控件,下层的“皮肤层”绘制异形的窗口。

有两点需要主意:

  1. 两个窗体的大小和位置的统一,使用 Size 和 Location 来解决;
  2. 两个窗体的 Z 轴(层次顺序)要准确,使用 Form.Owner 即可解决。

代码

源码下载
如果没有积分,也可以关注我获取哟~
hi
控件层代码:

public partial class MainForm : Form
{private SkinForm Skin;public MainForm(){InitializeComponent();ShowInTaskbar = false;//禁止控件层显示到任务栏FormBorderStyle = FormBorderStyle.None;//设置无边框的窗口样式}private void MainForm_Load(object sender, EventArgs e){if (!DesignMode){Skin = new SkinForm(this);//创建皮肤层 BackgroundImage = null;//去除控件层背景TransparencyKey = BackColor;//使控件层背景透明Skin.Show();//显示皮肤层 }}#region 属性private bool _skinmobile = true;[Category("Skin")][Description("窗体是否可以移动")][DefaultValue(typeof(bool), "true")]public bool SkinMovable{get { return _skinmobile; }set{if (_skinmobile != value){_skinmobile = value;}}}#endregion
}

皮肤层代码:

partial class SkinForm : Form
{private MainForm Main;public SkinForm(MainForm main){InitializeComponent();SetStyles();//减少闪烁Main = main;//获取控件层对象FormBorderStyle = FormBorderStyle.None;//设置无边框的窗口样式ShowInTaskbar = true;//使控件层显示到任务栏BackgroundImage = Main.BackgroundImage;//将控件层背景图应用到皮肤层BackgroundImageLayout = ImageLayout.Stretch;//自动拉伸背景图以适应窗口Size = Main.Size;//统一大小Main.Owner = this;//设置控件层的拥有皮肤层FormMovableEvent();//激活皮肤层窗体移动SetBits();//绘制半透明不规则皮肤Location = new Point(Main.Location.X, Main.Location.Y);//统一控件层和皮肤层的位置}//减少闪烁代码...(见源码)//激活皮肤层窗体移动代码...(见源码)//绘制半透明不规则皮肤代码...(见源码)
}

效果图

正八经的效果图

参考资料

双层窗体 csdn bbs http://bbs.csdn.net/topics/390769541
双层窗体源码 http://download.csdn.net/download/lyx_520/4921128

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批处理框架 Spring Batch 这么强,你会用吗?

来源:blog.csdn.net/topdeveloperr/article/details/84337956spring batch简介Spring Batch架构介绍Spring Batch核心概念介绍chunk 处理流程批处理操作指南spring batch简介 spring batch是spring提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在…

Android Bundle类别

即使在今天发现自己Bundle类不明确,因此,花时间去研究了一下。 依据google官方文件(http://developer.android.com/reference/android/os/Bundle.html) Bundle类是一个key-value对,“A mapping from String values to …

C# Winform 窗体美化(七、Win7 Aero 毛玻璃效果)

七、Win7 Aero 毛玻璃效果 在 Win7 上有一种 Aero 效果,毛玻璃透明效果,搭配不同风格的颜色,效果很好。在学习 Winform 美化的时候顺便看到的这种效果,也整理进来了。 注意:Win7 上想看到这种效果需要开启并使用 Aer…

非导向传输媒体| 计算机网络

Transmission media can be categorized in two ways, 传输媒体可以通过两种方式进行分类: Guided Transmission Media 引导传输媒体 Unguided Transmission Media 非引导传输媒体 1)非引导传输媒体 (1) Unguided Transmission Media) It is also called wireless …

面霸篇:MQ 的 5 大关键问题详解

最近mq越来越火,很多公司在用,很多人在用,其重要性不言而喻。但是如果我让你回答下面的这些问题:我们为什么要用mq?引入mq会多哪些问题?如何解决这些问题?你心中是否有答案了呢?本文…

C# Winform 窗体美化(八、Icon)

八、Icon 之前 Winform 项目也有在 Icon 上遇到些问题(这里的 Icon 指的是 .ico 类型的文件),比如刚开始不知道怎么让自己的程序 Icon 和其他软件一样可以放大,还有放大之后在音量合成器中会出现比较奇葩的效果之类的问题&#x…

Java LocalDate类| 带示例的getEra()方法

LocalDate类的getEra()方法 (LocalDate Class getEra() method) getEra() method is available in java.time package. getEra()方法在java.time包中可用。 getEra() method is used to get the era applicable for this LocalDate object. getEra()方法用于获取适用于此LocalD…

MyBatis 的执行流程,学废了!

作者:双子孤狼来源:blog.csdn.net/zwx900102/article/details/108455514MyBatis可能很多人都一直在用,但是MyBatis的SQL执行流程可能并不是所有人都清楚了,那么既然进来了,通读本文你将收获如下:1、Mapper接…

C# Winform 窗体美化(九、嵌入窗体)

九、嵌入窗体 还是关于 Winform 窗体的一些操作问题,这次是研究了一个嵌入窗体,这次学习纯属偶然,项目中确实没遇到过这种需求。就是把别人的程序嵌入到自己的程序中,就像这样: 这里我嵌入了测试显示器的程序 [外链图…

Mac 流程图

https://www.lucidchart.com/pages/signup?utm_expid39895073-174.qKyHpBEbQS26y86OArD-rQ.1 https://www.processon.com/

setname_Python线程类| setName()方法与示例

setnamePython Thread.setName()方法 (Python Thread.setName() Method) Thread.setName() method is an inbuilt method of the Thread class of the threading module in Python. It uses a Thread object and sets the name of the thread. Thread.setName()方法是Python中线…

SpringBoot 优雅的参数效验!

引言 不知道大家平时的业务开发过程中 controller 层的参数校验都是怎么写的?是否也存在下面这样的直接判断?public String add(UserVO userVO) {if(userVO.getAge() null){return "年龄不能为空";}if(userVO.getAge() > 120){return &quo…

NTFS Change Journal(USN Journal)详解

写在前面 最近又用了一下usn日志来获取所有文件列表,在分多次加载文件列表的时候发现有文件丢失的情况,后来发现一篇文章比较详细的讲了usn。 用cmd来读取usn日志 如图: 以下是转载内容: 还是那个文件监控的应用,…

Java即时类| hashCode()方法与示例

即时类hashCode()方法 (Instant Class hashCode() method) hashCode() method is available in java.time package. hashCode()方法在java.time包中可用。 hashCode() method is used to get the hash code value for this Instant. hashCode()方法用于获取此Instant的哈希码值…

系统起动时加载的过程

sof_getdjval转载于:https://blog.51cto.com/bks2015/1660178

绝,Java 中创建对象的 5 种方法!

我们日常生活中会创建很多对象,但是这个对象和你理解的那么对象不一样,因为作者不是女娲,不能造人。作者只是程序员,他只能在 Java 中创建对象。那么我问你一个问题,你知道 Java 中如何创建对象吗?这个问题…

C# Winform 窗体美化(十、自定义窗体)

十、自定义窗体 写在前面 最近在做 winform 应用程序,需要自定义一种窗口的样式,所以就随便搞了一个简单的窗口。 效果图 有两种样式,界面如下: 无标题: 有标题: 关键词 1、黑色描边边框 对于…

几种在shell命令行中过滤adb logcat输出的方法

几种在shell命令行中过滤adb logcat输出的方法 分类标签: LogCat ADB 我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率。本文就具体介绍几种在sh…

duration java_Java Duration类| toHours()方法与示例

duration javaDuration Class toHours()方法 (Duration Class toHours() method) toHours() method is available in java.time package. toHours()方法在java.time包中可用。 toHours() method is used to convert this Duration into the number of hours. toHours()方法用于…

SpringBoot时间格式化的5种方法!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)在我们日常工作中,时间格式化是一件经常遇到的事儿,所以本文我们就来盘点一下 Spring Boot 中时间格…