您好我试图获得一个透明的形状,如玻璃,可以使点击和每个鼠标事件传递到窗户或玻璃后面的项目。
所以这是我用WindowForms编写的代码:
namespace ClickThroughMe
{
public partial class ClickThroughForm : Form
{
private int currentWindowStyle;
public ClickThroughForm()
{
InitializeComponent();
}
private void ClickThroughForm_Load(object sender, EventArgs e)
{
// Grab the Extended Style information for this window and store it.
currentWindowStyle = WindowLibrary.User32Wrappers.GetWindowLong(this.Handle, User32Wrappers.GWL.ExStyle);
// Set our window to "transparent", or invisible to the mouse.
SetFormToTransparent();
// Make our window the top-most form.
this.TopMost = true;
}
private void SetFormToTransparent()
{
// This creates a new extended style for our window, making it transparent to the mouse.
User32Wrappers.SetWindowLong(this.Handle, User32Wrappers.GWL.ExStyle,
(User32Wrappers.WS_EX) currentWindowStyle |
User32Wrappers.WS_EX.Layered |
User32Wrappers.WS_EX.Transparent);
}
}
}
此代码的问题在于整个窗口通过不透明度变得透明但控制此类按钮或滑块不会保持可点击性。
所以我需要帮助 让它变得更好。
1)保留控件完全不透明度(不需要但很重要)
2)保留控件可点击性和操作性(必须)
我接受任何解决方案,甚至将项目更改为WPF ,如果这有助于获得结果。
谢谢你的时间。
答案 0 :(得分:1)
尝试设置ClickThroughForm的Form.TransparencyKey Property以匹配表单BackColor。
我在ClickThroughForm设置为TopMost而另一个Form上测试了这个,我可以触发Button事件,TrackBar控件似乎正常运行。
注意:使用此方法ClickThroughForm无法捕获任何鼠标事件,因为它具有透明性,如果这是一个要求,那么您可以忽略此答案。
ClickThroughForm类
public class ClickThroughForm : Form
{
private System.ComponentModel.IContainer components = null;
public ClickThroughForm()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// ClickThroughForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(300, 300);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "ClickThroughForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "ClickThroughForm";
//Set the TransparencyKey to match the default BackColor of the Form
this.TransparencyKey = System.Drawing.SystemColors.Control;
this.ResumeLayout(false);
}
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
}
希望这会对你有所帮助。
我发现您是新用户,如果您在网站上提出的此问题或任何其他问题提供了您正在寻找的答案,请记住接受答案。
有关详细信息,请参阅以下内容:How does accepting an answer work?