Windows Mobile,个人心中臻至完美的系统。

不忍自己对WM的钻研成果消逝,故留作纪念。


系列开篇,便是一个曾令自己困扰很久的问题:如何实现半透明窗体。

如果了解Win32编程,其实很简单。

主要用到了三个方法:

SetLayeredWindowAttributes

GetWindowLong

SetWindowLong

核心代码:

1 private void SetWindowTransparent(byte bAlpha)
2 {
3     SetWindowLong(this.Handle, (int)WindowStyle.GWL_EXSTYLE,
4         GetWindowLong(this.Handle, (int)WindowStyle.GWL_EXSTYLE) | (uint)ExWindowStyle.WS_EX_LAYERED);
5
6     SetLayeredWindowAttributes(this.Handle, 0, bAlpha, LWA_ALPHA);
7 }

效果:

(一)C# Windows Mobile 半透明窗体-LMLPHP

完整代码:

(一)C# Windows Mobile 半透明窗体-LMLPHP(一)C# Windows Mobile 半透明窗体-LMLPHP
 1 using System;
 2
 3 using System.Collections.Generic;
 4 using System.ComponentModel;
 5 using System.Data;
 6 using System.Drawing;
 7 using System.Text;
 8 using System.Windows.Forms;
 9 using System.Runtime.InteropServices;
10
11 namespace Demo01
12 {
13     public partial class Form1 : Form
14     {
15         public Form1()
16         {
17             InitializeComponent();
18         }
19
20         [DllImport("coredll.dll")]
21         public extern static IntPtr GetDesktopWindow();
22
23         [DllImport("coredll.dll")]
24         public extern static bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);
25         public static uint LWA_COLORKEY = 0x00000001;
26         public static uint LWA_ALPHA = 0x00000002;
27
28         [DllImport("coredll.dll")]
29         public extern static uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong);
30         [DllImport("coredll.dll")]
31         public extern static uint GetWindowLong(IntPtr hwnd, int nIndex);
32
33         public enum WindowStyle : int
34         {
35             GWL_EXSTYLE = -20
36         }
37
38         public enum ExWindowStyle : uint
39         {
40             WS_EX_LAYERED = 0x00080000
41         }
42
43         private void SetWindowTransparent(byte bAlpha)
44         {
45             try
46             {
47                 SetWindowLong(this.Handle, (int)WindowStyle.GWL_EXSTYLE,
48                     GetWindowLong(this.Handle, (int)WindowStyle.GWL_EXSTYLE) | (uint)ExWindowStyle.WS_EX_LAYERED);
49
50                 SetLayeredWindowAttributes(this.Handle, 0, bAlpha, LWA_ALPHA);
51
52             }
53             catch
54             {
55             }
56         }
57
58         private void button1_Click(object sender, EventArgs e)
59         {
60             this.Close();
61         }
62
63         private void trackBar1_ValueChanged(object sender, EventArgs e)
64         {
65             label1.Text = "透明度(0~255): " + trackBar1.Value.ToString();
66             SetWindowTransparent(Convert.ToByte(trackBar1.Value));
67         }
68
69         private void Form1_Load(object sender, EventArgs e)
70         {
71             Rectangle rf = Screen.PrimaryScreen.WorkingArea;
72
73             this.Location = new Point((rf.Width - this.Width) / 2, (rf.Height - this.Height) / 2);
74
75             //SetWindowTransparent(136);
76         }
77     }
78 }
全部代码

工程文件:

https://files.cnblogs.com/files/lesliexin/01.%E5%8D%8A%E9%80%8F%E6%98%8E%E7%AA%97%E4%BD%93.7z


04-23 01:23