2010-07-18 5 views
0

J'essaye d'obtenir un contrôle de raccourci fonctionnant en C# basé sur la classe Control et la classe msctls_hotkey32 win32. Ce que j'ai fonctionne, bien que ce ne soit pas parfait:Habillage de msctls_hotkey32 dans .NET Windows Forms

class Hotkey : TextBox 
    { 
     protected override CreateParams CreateParams 
     { 
      get 
      { 
       CreateParams parms = base.CreateParams; 
       parms.ClassName = "msctls_hotkey32"; 
       return parms; 
      } 
     } 
     // (some other p/invoke stuff for HKM_SETHOTKEY, etc.) 
    } 

Les avantages sont que c'est simple et cela fonctionne. L'inconvénient est qu'il hérite d'un tas de fonctionnalités de TextBox qui ne s'applique pas à ce contrôle. Ma question est donc: existe-t-il une meilleure façon de le faire sans réinventer la roue?

Merci.

Répondre

1

Vous pouvez toujours hériter directement de System.Windows.Forms.Control. Et puis bien sûr, ajoutez les méthodes et propriétés spécifiques que vous souhaitez prendre en charge. Vous aurez besoin de définir les styles de contrôle de manière appropriée pour que cela fonctionne, voici un exemple rapide.

using System; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    class HotKey : Control 
    { 
    public HotKey() 
    { 
     SetStyle(ControlStyles.UserPaint, false); 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
     CreateParams cp = base.CreateParams; 
     cp.ClassName = "msctls_hotkey32"; 

     return cp; 
     } 
    } 
    } 
} 
+0

Auparavant, lorsque j'ai essayé de tirer le contrôle, il ne fonctionnait pas - il semblait que le contrôle était « en lecture seule », était gris et que le curseur de texte clignotait en ce qu'il n'a pas accepté de l'entrée . L'ajout de cet appel SetStyle a corrigé cela, cependant. Que fait-il exactement? – Reinderien

+0

Fondamentalement, il indique au contrôle que la peinture ne sera pas faite par le code de contrôle, par défaut la classe de contrôle suppose que la peinture du contrôle sera faite par le contrôle lui-même, mais dans ce cas la peinture doit être faite par le contrôle natif définissant l'indicateur UserPaint sur false indique au contrôle de ne pas déclencher l'événement Paint. –

+0

Génial, bon ça marche parfaitement, merci. – Reinderien

Questions connexes