我的 WinClock 项目系列之二 (功能细节,在Windows API 里面查找需要的功能)
2008-06-01 23:47
246 查看
1. 不规则窗口的创建
方法一:
让图片的背景色与显示部分的颜色明显不同,将 FormBorderStyle 属性设置为 None。
将窗体的 BackgroundImage 属性设置为先前创建的位图文件。 设置窗体的 BackColor 图片
背景色,在窗体的构造函数里添加 this.TransparencyKey = this.BackColor; 一切OK。
缺点:1) 不能胜任24位色以上环境。实际上,即使16色的环境,效果也不理想,图片边缘的阴影
显示为窗体背景。不可能对图片进行任意放大。
2) 图片边缘锯齿明显。
方法二:
采用无Alpha通道的位图图片,通过扫描图片的每一点,取出与边缘颜色不同的所以像素,合并到
GraphicsPath中,然后使用这个 GraphicsPath 创建一个 Region并赋给窗体。代码如下:
1 // PInvokeService.cs
2 // WindowShapeMaker.cs
2 [Serializable()]
2 // PenetrateService.cs
2 public static class PenetrateService {
3 private static readonly uint WS_EX_LAYERED = 0x80000;
4 private static readonly uint WS_EX_TRANSPARENT = 0x20;
5 private static readonly int GWL_EXSTYLE = -20;
6 //private static readonly int LWA_ALPHA = 0x2;
7
8 [DllImport("user32", EntryPoint = "SetLayeredWindowAttributes")]
9 private static extern int SetLayeredWindowAttributes(
10 IntPtr hwnd,
11 int crKey,
12 int bAlpha,
13 int dwFlags
14 );
15
16 public static void MousePenetrate(Form mainForm, byte alpha) {
17 uint intExTemp = PInvokeService.GetWindowLong(mainForm.Handle, GWL_EXSTYLE);
18 PInvokeService.SetWindowLong(mainForm.Handle, GWL_EXSTYLE, intExTemp | WS_EX_TRANSPARENT | WS_EX_LAYERED);
19 //SetLayeredWindowAttributes(mainForm.Handle, 0, alpha, LWA_ALPHA);
20 }
21
22 public static void MouseNotPenetrate(Form mainForm, byte alpha) {
23 PInvokeService.SetWindowLong(mainForm.Handle, GWL_EXSTYLE, WS_EX_LAYERED);
24 //SetLayeredWindowAttributes(mainForm.Handle, 0, alpha, LWA_ALPHA);
25 }
26 }
注释掉的几行代码是有原因的,在设置了窗体的 WS_EX_LAYERED Style 以后,不能再要这两句,否则这个 Style 失去作用。
如果没有采用这种方式,则需要加上这两句代码。
5. 窗体透明度
你可能最快想到的是直接设置 Form的 Opacity 属性,但是在这里他失效了,不但不起作用,还会使WS_EX_LAYERED失效。
其实在 UpdateLayeredWindow 的调用中,就有透明度的选项的。那句
blend.SourceConstantAlpha = clockOpt.PreviewOpacity;
正是这个作用。由于要支持鼠标经过时的透明度和 正常的透明度,所以ClockOption 里面还有 PreviewOpacity 这个属性。
最后补充一点,今天对源代码做了一些修改,今天添加了多国语言支持, 添加了中文资源,修正了农历算法问题. 添加了对允许
拖动到屏幕以外的选项. Fix了一些小的Bug. 如果你感兴趣,可以重新下载。
好了,至此这次写的也差不多了,好累, 不知道有没有漏写什么东西,唉, 时间也不早了,休息吧^_^。
参考资料:
C# winform中不规则窗体制作的解决方案(已经解决24位色以上不能正常显示问题)
用PNG透明图片和GDI+做不规则透明窗体
方法一:
让图片的背景色与显示部分的颜色明显不同,将 FormBorderStyle 属性设置为 None。
将窗体的 BackgroundImage 属性设置为先前创建的位图文件。 设置窗体的 BackColor 图片
背景色,在窗体的构造函数里添加 this.TransparencyKey = this.BackColor; 一切OK。
缺点:1) 不能胜任24位色以上环境。实际上,即使16色的环境,效果也不理想,图片边缘的阴影
显示为窗体背景。不可能对图片进行任意放大。
2) 图片边缘锯齿明显。
方法二:
采用无Alpha通道的位图图片,通过扫描图片的每一点,取出与边缘颜色不同的所以像素,合并到
GraphicsPath中,然后使用这个 GraphicsPath 创建一个 Region并赋给窗体。代码如下:
1 // PInvokeService.cs
2 // WindowShapeMaker.cs
2 [Serializable()]
2 // PenetrateService.cs
2 public static class PenetrateService {
3 private static readonly uint WS_EX_LAYERED = 0x80000;
4 private static readonly uint WS_EX_TRANSPARENT = 0x20;
5 private static readonly int GWL_EXSTYLE = -20;
6 //private static readonly int LWA_ALPHA = 0x2;
7
8 [DllImport("user32", EntryPoint = "SetLayeredWindowAttributes")]
9 private static extern int SetLayeredWindowAttributes(
10 IntPtr hwnd,
11 int crKey,
12 int bAlpha,
13 int dwFlags
14 );
15
16 public static void MousePenetrate(Form mainForm, byte alpha) {
17 uint intExTemp = PInvokeService.GetWindowLong(mainForm.Handle, GWL_EXSTYLE);
18 PInvokeService.SetWindowLong(mainForm.Handle, GWL_EXSTYLE, intExTemp | WS_EX_TRANSPARENT | WS_EX_LAYERED);
19 //SetLayeredWindowAttributes(mainForm.Handle, 0, alpha, LWA_ALPHA);
20 }
21
22 public static void MouseNotPenetrate(Form mainForm, byte alpha) {
23 PInvokeService.SetWindowLong(mainForm.Handle, GWL_EXSTYLE, WS_EX_LAYERED);
24 //SetLayeredWindowAttributes(mainForm.Handle, 0, alpha, LWA_ALPHA);
25 }
26 }
注释掉的几行代码是有原因的,在设置了窗体的 WS_EX_LAYERED Style 以后,不能再要这两句,否则这个 Style 失去作用。
如果没有采用这种方式,则需要加上这两句代码。
5. 窗体透明度
你可能最快想到的是直接设置 Form的 Opacity 属性,但是在这里他失效了,不但不起作用,还会使WS_EX_LAYERED失效。
其实在 UpdateLayeredWindow 的调用中,就有透明度的选项的。那句
blend.SourceConstantAlpha = clockOpt.PreviewOpacity;
正是这个作用。由于要支持鼠标经过时的透明度和 正常的透明度,所以ClockOption 里面还有 PreviewOpacity 这个属性。
最后补充一点,今天对源代码做了一些修改,今天添加了多国语言支持, 添加了中文资源,修正了农历算法问题. 添加了对允许
拖动到屏幕以外的选项. Fix了一些小的Bug. 如果你感兴趣,可以重新下载。
好了,至此这次写的也差不多了,好累, 不知道有没有漏写什么东西,唉, 时间也不早了,休息吧^_^。
参考资料:
C# winform中不规则窗体制作的解决方案(已经解决24位色以上不能正常显示问题)
用PNG透明图片和GDI+做不规则透明窗体
相关文章推荐
- 我的 WinClock 项目系列之二
- CRichEditCtrl系列讲堂2 查找功能的实现
- 如何给项目里面每个功能点设权限?
- 经典管理类软件项目文件功能模块组织思路参考【做软件需要按套路出牌、需要有章法】
- 【脚本语言系列】关于 JavaScript 日志功能,你需要知道的事
- 信息系统项目管理系列之二:项目生命期和组织
- Distributed System: ZooKeeper系列之二 (功能)
- java在线聊天项目 实现基本聊天功能后补充的其他功能详细需求分析 及所需要掌握的Java知识基础 SWT的激活方法,swt开发包下载,及破解激活码
- 将vim 改造成功能强大的IDE系列之二
- thinkphp 3.2.3 在项目中需要做的一个发送邮件的功能
- Unity3D黑暗之光项目里面的功能运用--UI框的拖拽
- Lync Server 2013功能部署系列之二 实验拓扑及各角色先决条件
- J2EE项目系列(二)--博客管理系统(Maven+SpringMVC+Hibernate以及附加分页和一对多查询功能)
- VPM虚拟外围器件的应用系列说明 之二 需要下载或参考的资料下载地址
- 项目经理的商务指南系列之二:认识责任(敏捷开发,专家与杂家)
- 为什么项目型软件公司很累?程序员拼死拼活做项目为啥总是无法按时完成?原因主要是软件需要完善的细节太多
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)
- 【直播系列之二】快速接入PC端直播功能
- 项目管理碎碎念系列之二:采购管理
- ocs部署实验系列之二——配置音频/视频会议和web会议及客户端基本功能测试