2010-07-22 6 views
1

Nous avons une application VB6 qui a implémenté un gestionnaire pour les messages WM_TCARD à partir d'un fichier d'aide HTML. Il navigue dans l'application et ouvre les écrans appropriés, etc.Existe-t-il un .net idiomatique pour implémenter "l'aide de la carte de formation"?

Comment cela se fait-il dans une application WinForms? La seule façon de voir immédiatement est de gérer la procédure de la fenêtre et de traiter le message WM_TCARD exactement de la même manière que pour l'application VB6.

Existe-t-il un autre moyen de faire cela?

Répondre

1

Vous devrez vous-même gérer les messages. Cependant, il est assez facile de faire une classe qui le fait pour vous. .: par exemple

public class HelpCards : IMessageFilter { 
    const int WM_TCARD = 0x52; 
    const int ID_NOTIFICATION = 4242; 

    public enum TCardAction: int { 
     IDOK = 1, 
     IDCANCEL = 2, 
     IDABORT = 3, 
     IDRETRY = 4, 
     IDIGNORE = 5, 
     IDYES = 6, 
     IDNO = 7, 
     IDCLOSE = 8, 
     IDHELP = 9, 

     HELP_TCARD = 0x8000, 
     HELP_TCARD_DATA = 0x0010, 
     HELP_TCARD_OTHER_CALLER = 0x0011, 
     HELP_TCARD_OTHER_NEXT = 0x0011, 
    } 

    public HelpCards() { 
     Application.AddMessageFilter(this); 
    } 

    public delegate void OKReceived(); 
    public event OKReceived OnOKReceived; 

    public bool PreFilterMessage(ref Message m) { 
     if (m.Msg == WM_TCARD && (int)m.WParam == ID_NOTIFICATION) { 
      switch ((TCardAction)m.LParam) { 
       case TCardAction.IDOK: 
        if (OnOKReceived != null) { 
         OnOKReceived(); 
        } 
        break; 
        // etc. 
      } 

      return true; // true means message was handled 
     } 

     return false; 
    } 
} 

Puis, à l'endroit où vous souhaitez vous abonner (probablement dans votre forme quelque part) utiliser

hc = new HelpCards(); 
hc.OnOKReceived += new OKReceived(hc_OnOKReceived); 

et ont hc défini dans la définition de classe de la forme. Comme si

HelpCards hc; 

Et quelque part ont la fonction de manipulation:

void hc_OnOKReceived() { 
    throw new NotImplementedException(); 
} 

Il est évident que vous aurez besoin de faire le reste vous-même. Mais cela devrait vous aider à démarrer.

+0

Merci pour cela. Je pensais que ce serait le cas, mais j'espérais avoir raté quelque truc avec le HelpProvider ou quelque chose qui signifierait que je n'avais pas besoin de gérer le message –

+0

Oh, et vous voulez probablement supprimer le filtre de message lorsque la classe est éliminée . Et vous voulez probablement utiliser EventHandler, pas void() pour le délégué d'événement. –