2009-05-14 9 views
2

J'ai créé un contrôle personnalisé qui est mis en surbrillance lorsque la souris le survole. Le contrôle personnalisé a également une case à cocher. Lorsque la souris passe la case à cocher, la surbrillance du contrôle personnalisé ne se produit pas. J'ai essayé d'utiliser WS_EX_TRANSPARENT sur la case à cocher mais cela ne fonctionne pas pour moi.Case à cocher transparente dans le contrôle personnalisé à l'aide de C#

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

Comment est-ce que je peux faire ceci?

Remerciements

Répondre

2

Le transparent n'affecte que les dessins, pas les événements de la souris. La case à cocher obtient les événements de la souris, ce qui signifie que lorsque vous passez la souris sur la case à cocher, votre contrôle reçoit un événement MouseLeave. Pour vous assurer que la couleur d'arrière-plan change, même lorsqu'un contrôle enfant (à un niveau quelconque) reçoit un événement MouseEnter, vous devez effectuer le suivi d'un contrôle d'intérêt - ou tout enfant, grand-enfant ..etc-- a la souris sur il. Pour ce faire, parcourez tous les contrôles descendants et interceptez les événements appropriés pour eux. Pour ce faire, essayez quelque chose de similaire à la classe ci-dessous.

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; 
    } 
}