2010-07-22 102 views
1

我们有一个VB6应用程序,它已经为HTML帮助文件中的WM_TCARD消息实现了一个处理程序。 它在应用程序内导航并打开相关屏幕等。有没有一种惯用的.net方法来实现“培训卡帮助”?

在WinForms应用程序中如何做到这一点?

我可以立即看到的唯一方法是处理窗口过程,并以与我们为VB6应用程序完全相同的方式处理WM_TCARD消息。

是否有更多.net的方式来做到这一点?

回答

1

你必须自己处理消息。但是,制作一个能够为你做到这一点的课程非常容易。例如: -

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

而且,在你想订阅(可能在你的表格的地方)的地方使用

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

而且具有形式的类定义定义hc。像这样

HelpCards hc; 

而且有地方处理功能:

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

显然,你需要自己做休息。但是这应该让你开始。

+0

谢谢。我认为会是这种情况,但希望我错过了HelpProvider的一些诡计或者意味着我不需要处理消息 – 2010-07-22 03:43:48

+0

哦,并且您可能希望在类处理时移除消息过滤器。你可能想使用EventHandler,而不是void()作为事件委托。 – 2010-07-22 04:21:36

相关问题