2

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

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

我怎样才能做到这一点?

谢谢

4

1 回答 1

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;
    }
}
于 2009-11-26T04:49:43.780 回答