2017-03-17 2 views
1

Le contrôle par défaut de Winforms Button se dessine uniquement dans un "état cliqué" lorsque l'utilisateur clique sur le bouton. J'ai besoin du contrôle Button pour se dessiner dans l'état cliqué indépendamment du fait qu'il a été cliqué gauche ou cliqué avec le bouton droit. Comment pourrais-je accomplir cela? Plus précisément, je sais que je vais devoir dériver un contrôle de Button qui étend la fonctionnalité, mais je n'ai aucune expérience dans l'extension des fonctionnalités des contrôles winforms ou du dessin dans GDI +. Je suis donc un peu abasourdi sur ce que je vais devoir faire une fois là-bas.Winforms Button Retour visuel à l'aide du clic droit (Afficher à l'état poussé)

Merci pour l'aide.

+1

mais note que ce comportement est contraire à la cohérence des styles de Windows ... –

Répondre

0

La commande par bouton standard met le bouton en mode enfoncé et enfoncé en utilisant une méthode privée SetFlag. Vous pouvez le faire vous aussi. Je l'ai fait dans le code suivant:

using System.Windows.Forms; 
public class MyButton : Button 
{ 
    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     SetPushed(true); 
     base.OnMouseDown(e); 
     Invalidate(); 
    } 
    protected override void OnMouseUp(MouseEventArgs e) 
    { 
     SetPushed(false); 
     base.OnMouseUp(e); 
     Invalidate(); 
    } 
    private void SetPushed(bool value) 
    { 
     var setFlag = typeof(ButtonBase).GetMethod("SetFlag", 
      System.Reflection.BindingFlags.Instance | 
      System.Reflection.BindingFlags.NonPublic); 
     if(setFlag != null) 
     { 
      setFlag.Invoke(this, new object[] { 2, value }); 
      setFlag.Invoke(this, new object[] { 4, value }); 
     } 
    } 
} 
+0

Cela pourrait briser dans les versions futures du cadre. – Maarten

+0

@Maarten Peut-être mais moins probable. Beaucoup de choses qui sont basées sur la réflexion peuvent casser dans les versions futures. Mais la fonctionnalité a été la même au moins de .NET 2.0 à .NET 4.6.2. Je ne suis pas sûr à propos de .NET 1.0 et 1.1. –

+1

@Maarten Une autre option vous permet de peindre le contrôle vous-même en utilisant 'ButtonRenderer' ou' VisualStyleRenderer'. –