2013-04-24 98 views
0

我正在維護舊的MFC應用程序。當用戶從應用程序頂部的主菜單中選擇幫助→幫助時,我需要調用我自定義的OnHelp()。從我的研究中,我瞭解到MFC通常會自動截取這個命令並自己提供幫助文件。但是您可以覆蓋此命令並自行攔截此消息。我有這個在我的消息映射:MFC自定義HtmlHelp

BEGIN_MESSAGE_MAP(MyApp, MyBaseApp) 
    //{{AFX_MSG_MAP(MyApp) 
    ON_COMMAND(ID_APP_ABOUT, OnAppAbout) 
    ON_COMMAND(ID_HELP, OnHelp) 
    //}}AFX_MSG_MAP 
    // Standard file based document commands 
END_MESSAGE_MAP() 

「關於」 OnAppAbout()被調用,但不是我的OnHelp()(MFC仍然截獲它,並通過自身帶來了幫助)。我的實現是非常簡單的:

void MyApp::OnHelp() 
{ 
    // This never gets called 
    MessageBox(NULL, "HtmlHelp: MyApp", "Hey", MB_OK); 

    CString csHelpFile; 
    csHelpFile.Format("%s/MyHelp.chm", MyDoc::GetHelpPath()); 
    ::HtmlHelp(
     NULL, 
     csHelpFile, 
     HELP_WM_HELP, 
     NULL); 
} 

我知道這是沒有得到所謂的,因爲我的MessageBox永遠不會出現(我不能使用Visual Studio調試此,唯一的消息框)。我還嘗試將它嵌入到CMDIFrameWnd中,並帶有消息映射和類似的實現,但都沒有成功(與「幫助」菜單項目中的不同項目在此處實現並且工作正常)。任何想法我需要做什麼來鉤入我自己的自定義幫助功能?

+0

你肯定ID_HELP在其他地方沒有處理?你的應用通常是獲得命令消息的最後一個。 http://msdn.microsoft.com/en-us/library/shfzay75(v=vs.90).aspx – 2013-04-25 01:40:15

+0

添加另一個菜單項,例如ID_HELP2,然後嘗試並捕獲它。如果那有效,那麼別的東西會攔截ID_HELP。 – snowdude 2013-04-25 10:04:07

回答

1

您需要將ON_WM_HELPINFO()添加到您的CMainFrame的消息映射中。在主框架的頭文件中定義afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo);,並在cpp文件實現:

BOOL CMainFrame::OnHelpInfo(HELPINFO* pHelpInfo) 
{ 
#ifdef _DEBUG 
    MessageBox(NULL, "HtmlHelp: MyApp", "Hey", MB_OK); 
#endif 

    CString csHelpFile; 
    csHelpFile.Format("%s/MyHelp.chm", MyDoc::GetHelpPath()); 
    ::HtmlHelp(
    NULL, 
    csHelpFile, 
    HELP_WM_HELP, 
    NULL); 
    return CFrameWnd::OnHelpInfo(pHelpInfo); 
} 
+0

謝謝,那爲F1工作完美。不幸的是,選擇幫助|幫助仍由MFC處理。仍然必須找出如何規避... – Frecklefoot 2013-04-26 18:27:58