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 }
效果:
完整代码:
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