使用C#在自定义控件中的透明复选框

时间:2009-05-14 00:27:59

标签: c# controls transparency mouseover

我创建了一个自定义控件,当鼠标悬停在它上面时会突出显示。自定义控件还有一个复选框。当鼠标移过复选框时,不会突出显示自定义控件。我尝试在复选框上使用 WS_EX_TRANSPARENT ,但它对我不起作用。

        int cbStyle = GetWindowLong(CompletedCheckBox.Handle, GWL_EXSTYLE);
        SetWindowLong(CompletedCheckBox.Handle, GWL_EXSTYLE, cbStyle | WS_EX_TRANSPARENT);

我该怎么做?

由于

1 个答案:

答案 0 :(得分:2)

透明仅影响绘图,而不影响鼠标事件。复选框正在获取鼠标事件,这反过来意味着当您将鼠标悬停在复选框上时,您的控件将收到MouseLeave事件。为了确保背景颜色发生变化,即使子控件(在任何级别)获得MouseEnter事件,您也需要跟踪感兴趣的控件 - 或任何子,孙子..等等 - 鼠标悬停它。为此,请递归所有后代控件并拦截它们的相应事件。要做到这一点,尝试类似下面的类。

public partial class MyControl : UserControl
{
    public MyControl()
    {
        InitializeComponent();
        AttachMouseEnterToChildControls(this);
    }

    void AttachMouseEnterToChildControls(Control con)
    {
        foreach (Control c in con.Controls)
        {
            c.MouseEnter += new EventHandler(control_MouseEnter);
            c.MouseLeave += new EventHandler(control_MouseLeave);
            AttachMouseEnterToChildControls(c);
        }
    }
    private void control_MouseEnter(object sender, EventArgs e)
    {
        this.BackColor = Color.AliceBlue;
    }

    private void control_MouseLeave(object sender, EventArgs e)
    {
        this.BackColor = SystemColors.Control;
    }
}