您的位置:首页 > 其它

我的 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+做不规则透明窗体
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐