我有一个关于WinForms透明度的问题,但首先要做的事情。 我刚刚在WinForms中创建了一个带有透明“body”的超级简单应用程序。我只更改了默认表单的颜色。设计师代码:
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
this.ClientSize = new System.Drawing.Size(538, 312);
this.Name = "Form1";
this.Text = "Form1";
this.TransparencyKey = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
this.ResumeLayout(false);
}
#endregion
}
所以在运行时它基本上只是一个框架+标题。在Form1.cs中,我添加的唯一内容是覆盖了我所做的WndProc函数:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void WndProc(ref Message m)
{
const UInt32 WM_NCHITTEST = 0x0084;
const UInt32 WM_MOUSEMOVE = 0x0200;
if (m.Msg == WM_NCHITTEST || m.Msg == WM_MOUSEMOVE)
{
Point screenPoint = new Point(m.LParam.ToInt32());
Point clientPoint = this.PointToClient(screenPoint);
string position = "Position: X=" + clientPoint.X.ToString() + "; Y=" + clientPoint.Y.ToString();
Console.WriteLine(position);
this.Text = position;
}
base.WndProc(ref m);
}
}
在我看来,它应该以这种方式工作:它只是在窗口标题中的窗口上显示鼠标指针位置。但是,什么是超级重要的 - 也应该显示在透明区域上的位置。我的应用程序窗口中的“表单”是透明的,但它仍然是我的应用程序的一部分,对吧?这就是我的问题,因为不是每台机器上的工作都是一样的。
有两种情况(相同的应用!!): 我可以点击我申请下的东西(通过这个透明区域) 窗户只是透明的。我不能点击像图标或透明区域下的任何东西。
在第一种情况下,在我的WndProc覆盖函数中根本不发送WM_NCHITTEST消息(在透明区域上)。透明区域(因此Form)在我的应用程序中实际上是一个洞。在第二种情况下,Form是透明的,但是在Window的标题中,我可以看到我的指针位置,所以简单地发送WM_NCHITTEST消息。
任何人都可以解释我哪里可能有问题?这是相同的应用程序。 我的意思是,如果你想创建一个带有“洞”或“玻璃”或“窗口”的应用程序?你必须以某种方式控制它..