【开源】做了一个WinForm窗体的投影组件,能够为窗口添加影子效果
最近手头上的项目终于忙得差不多了,想起好久没有更新了的NanUI,再看着每天QQ群未读消息闪烁的标志,突然才发现似乎愧对了群里各位喜爱NanUI的朋友们。于是乎,就想趁这几天有时间,好好的修复一下NanUI已知的BUG,再用有限的时间推进整个项目的进度。
在复习代码的时候,想起了群里有朋友提出说NanUI的窗口的几个问题:
- 在某些Win7环境下会出现窗口标题绘制错误;
- Win8下面窗口阴影没有问题
- 模拟绘制的影子拖动窗口改变大小时绘制缓慢资源占用大
原来NanUI呈现窗口的方式有两种,一种是使用DWM的ExtendIntoView这个方法让窗口的客户区扩展至整个窗口来实现满窗口显示HTML内容的需求;还有一种兼容的方式是使用重绘非客户区来实现扩展客户的方式。
第一中方式有几个问题,Win7下面因为有玻璃效果和粗边框,会导致呈现效果很怪异,而且有群友反应的Win7标题栏绘制错误也跟DWM有关系,特别是禁用了Win7玻璃效果的时候最为明显;其次,Win8下面DWM不会为窗口绘制投影,所以窗口就没有影子效果,很丑。
第二种方式窗口绘制虽然没有什么问题,但是窗口的影子需要自己来画,我之前采用的方案是在主窗口后面外挂了个LayeredWindow样式子窗口来手动绘制窗口影子,之前看GitHub上有另外一个国人做的窗体投影的工具winform.DropShadow, 实现了投影,而且投影还够动态生成,但是有几个问题:
- 阴影呈现效果与主窗体极不协调
- 如果把主窗体弄成可以改变大小的形式,那么绘制影子的时候卡顿非常明显
- 似乎内存泄漏,内存越用越大
同样的,我自己来画的窗口也是存在这些问题,因为原理都一样的。
最后研究了2天,终于完成了下面这个能够为窗口添加影子效果的组件——
FormShadow for .NET Winform
中文名:Winfom投影组件
GITHUB地址:https://github.com/NetDimension/Winform-FormShadow/
FormShadow 能够快速的为你的WinForm窗口绘制窗体投影,当然不是用添加 CS_DROPSHADOW 样式这种又陋又难看的方式。其工作原理和最近几个版本的Visual Studio Shell采用的投影方式相同,在主窗体的四周创建4个LayeredWindow来承载阴影图片,并与主窗体同步事件。
功能:
- 为WinForm窗体创建漂亮的投影效果,并且支持 活动/非活动 状态下面的投影颜色。
- 快速绘制阴影,不闪烁,不卡顿。
- 主窗体能随意改变大小不受任何限制。
使用方式:
下面的例子就是使用FormShadow最简单的例子,初始化一个Decorator来为主窗体添加影子效果,然后设置了拖动这些影子能改变主窗体(Borderless)的大小。
public partial class Form1 : Form
{ protected readonly FormShadowDecorator ShadowDecorator; public Form1()
{
InitializeComponent();
ShadowDecorator = new FormShadowDecorator(this);
//启用窗口大小调整
//Enable resizing form with shadows.
ShadowDecorator.EnableResize(true);
}
}
如果在使用这个组件的时候有任何疑问加我的私人QQ(不一定在线,现在大家都微信咯)或者QQ群来讨论,QQ群欢迎任何有关于.NET技术的话题。
2000人QQ群: 241088256
我的QQ: 19843266
赞助作者:
如果你喜欢我的工作,那么欢迎您加入到任何项目的开发中来;
当然你也可以非常直接了当的支付宝或微信扫码来请我喝咖啡:)
“听说之前请我喝咖啡的朋友,最后都走上人生巅峰了呢~”
—— 著名网络乞丐 Mr.JSON
【开源】做了一个WinForm窗体的投影组件,能够为窗口添加影子效果的更多相关文章
- 关闭一个winform窗体刷新另外一个
例如Form1是你的主窗体,然后Form2是你的要关闭那个窗体,在Form1中SHOW FORM2的窗体那里加上一句f2.FormClosed += new FormClosedEventHandle ...
- C# 数据库备份与还原 小妹做了一个winform系统,需要对sql2000数据库备份和还原(小妹妹你太狠了)
成功了,把代码帖出来给大家看看,跟我刚开始帖出来的差不多,是需要杀掉进程的,我之前调用的存储过程,可能有点问题,现在改成sql了/// <summary> /// 数据库 ...
- C# winform 窗体从右下角向上弹出窗口效果
参考自 http://blog.csdn.net/yilan8002/article/details/7197981 /// <summary> /// 窗体动画函数 注意:要引用Syst ...
- winform窗体置顶
winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...
- xBIM 实战04 在WinForm窗体中实现IFC模型的加载与浏览
系列目录 [已更新最新开发文章,点击查看详细] WPF底层使用 DirectX 进行图形渲染.DirectX 能理解可由显卡直接渲染的高层元素,如纹理和渐变,所以 DirectX 效率更高. ...
- C# winform窗体设计-通过条件查询数据
在winform 数据库设计中,有时候需要通过条件查询对应的数据,并且将数据显示在文本框(or 富文本框)中,下面,小编将讲述通过一个条件: 首先,我们需要对数据库建立连接,并且执行数据库命令,在此之 ...
- 客户端(Winform窗体)上传文件到服务器(web窗体)简单例子
客户端:先创建一个winform窗体的应用程序项目 项目结构
- winform窗体 小程序【线程】
线程是进程中执行运算的最小单位,也是执行处理机调度的基本单位.实际上线程是轻量级的进程.那么为什么要使用线程呢? (1)易于调度. (2)提高并发性.通过线程可方便有效地实现并发性.进程可创建多个线程 ...
- Winform窗体用对象数组做一个小项目
首先我我们看一下需求:我们要做的是显示员工信息,实现项目经理给员工评分的功能! 首先项目经理是评分的人所以没有用,因为我们自己写,评分的就是我们自己.所以我们要做的是先在vs也就是我们的环境里建一个项 ...
随机推荐
- 【网站管理3】_ftp连接超时和连不上的原因
1.无法上传网页,FTP故障-提示"无法连接服务器"错误. 问题出现原因:FTP客户端程序设置问题,客户上网线路问题,ftp服务器端问题.处理方法:建议客户使用CUTPFTP软件来 ...
- swap与dd命令使用详解
处理交换文件和分区 交换分区是系统RAM 的补充 基本设置包括: 创建交换分区或者文件 使用mkswap 写入特殊签名 在/etc/fstab 文件中添加适当的条目 使用swapon -a 挂载交换分 ...
- 1.centOS安装Mysql
上个星期研究了一个星期的Mysql,从今天起把学到的东西整理一下. ---------------------------------------------- mysql安装本人亲试过两种安装方式, ...
- 最近一些朋友问我,临近快毕业了专业不对口,想转行看到IT行业就业前景不错,但是编程语言众多不了解,不知道哪门语言能够快速入门掌握,短期能让我找到工作
我做互联网前端后台开发也有四年多了,一路走过来,累并快乐着.快乐比艰辛更多,源自我的兴趣驱动.初中的一个偶然的机会我接触到了计算机,从那个时候就喜欢上开始经常到网吧上网.那个时候我对计算机领域的认识是 ...
- C语言中,隐藏结构体的细节
我们都知道,在C语言中,结构体中的字段都是可以访问的.或者说,在C++ 中,类和结构体的主要区别就是类中成员变量默认为private,而结构体中默认为public.结构体的这一个特性,导致结构体中封装 ...
- Hibernate中遇到的一个Exception
做项目的时候遇到一个很头疼的报错:Illegal attempt to associate a collection with two opensessions 出错原因: 一个Object Ver ...
- 前端教你学UI——人物处理(一)
一.序言 本文作为本系列的第一篇写UI的文章,开头还是有必要申明一些东西的,本系列主要是为了作为博主在前端工作之余学习UI的一个记录,同时为了让更多的同行学习到一些编程之外的其他东西.所以本文会尽可能 ...
- python——爬虫&问题解决&思考(1)
最近刚接触python,找点小任务来练练手,希望自己在实践中不断的锻炼自己解决问题的能力.这个小爬虫来自慕课网的一门课程,我在这里记录的是自己学习的过程中遇到的问题和解决方法以及爬虫之外的思考. 这次 ...
- Javascript编码规范,好的代码从书写规范开始,增强代码的可读性,可维护性,这是相当重要的!
1. 前言 JavaScript在百度一直有着广泛的应用,特别是在浏览器端的行为管理.本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护. 虽然本文档是针对JavaScript设 ...
- javascript痛点之一变量作用域
1.用var声明的变量是有作用域的,比如我们在函数中用var声明一个变量 1 'use strict'; 2 function num(){ 3 //用var声明一个变量num1 4 var num1 ...