2014-03-06 75 views
1

我有一个简单的MFC应用程序:一个带有按钮的对话框。对于他们两个,我调用了SetWindowContextHelpId()并将其上下文ID设置为非零值。MFC:为什么需要OnCommandHelp,它是如何工作的?

此外,我可以实现帮助命令的两个处理程序:OnCommandHelp(WPARAM wParam, LPARAM lParam)OnHelpInfo(HELPINFO* pHelpInfo)

MSDN写入以下约OnCommandHelp

lParam中包含了当前可用的帮助上下文。 lParam的是零 如果没有帮助上下文已经确定

但在我的情况下,lParam的永远是零,虽然pHelpInfoOnHelpInfo(HELPINFO* pHelpInfo)处理器包含有关控制的关联标识符正确非零信息(这是通过调用SetWindowContextHelpId设置) 。

现在我有两个问题:

1)为什么lParam始终为零? MSDN对“确定帮助上下文”的评价意味着什么?什么是“当前可用的帮助上下文”?

2)为什么我们需要OnCommandHelp,如果我们可以使用OnHelpInfo

任何解释将不胜感激。

UPDATE:

#include <afxwin.h> 
#include <afxpriv.h> 

#define ID_BUTTON 125 

#define FRAME_HELP 4000 
#define BUTTON_HELP 5000 

class CMainWnd : public CFrameWnd 
{ 
public: 
    CMainWnd(); 
protected: 
    afx_msg LRESULT OnCommandHelp(WPARAM wParam, LPARAM lParam); 
    afx_msg int OnCreate(LPCREATESTRUCT lpcs); 
    DECLARE_MESSAGE_MAP() 
private: 
    CButton btn; 
}; 

BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd) 
    ON_WM_CREATE() 
    ON_MESSAGE(WM_COMMANDHELP, OnCommandHelp) 
END_MESSAGE_MAP() 

int CMainWnd::OnCreate(LPCREATESTRUCT lpcs) 
{ 
    int res = CFrameWnd::OnCreate(lpcs); 

    m_nIDHelp = FRAME_HELP; 
    SetWindowContextHelpId(FRAME_HELP); 

    CRect rc(0, 0, 100, 100); 

    btn.Create(_T("Button"), WS_CHILD | WS_VISIBLE, rc, this, ID_BUTTON); 

    btn.SetWindowContextHelpId(BUTTON_HELP); 

    return res; 
} 

LRESULT CMainWnd::OnCommandHelp(WPARAM wParam, LPARAM lParam) 
{ 
    wchar_t arr[20]; 
    _itow_s(lParam, arr, 10); 
    MessageBox(arr); 
    return TRUE; 
} 

CMainWnd::CMainWnd() 
{ 
    Create(NULL, _T("Just a frame")); 
} 

class CApp : public CWinApp 
{ 
public: 
    virtual BOOL InitInstance() override; 
    DECLARE_MESSAGE_MAP() 
}; 

BEGIN_MESSAGE_MAP(CApp, CWinApp) 
    ON_COMMAND(ID_HELP, OnHelp) 
    ON_COMMAND(ID_HELP_FINDER, OnHelpFinder) 
    ON_COMMAND(ID_HELP_INDEX, OnHelpIndex) 
    ON_COMMAND(ID_HELP_USING, OnHelpUsing) 
END_MESSAGE_MAP() 

BOOL CApp::InitInstance() 
{ 
    m_pMainWnd = new CMainWnd(); 
    m_pMainWnd->ShowWindow(m_nCmdShow); 
    m_pMainWnd->UpdateWindow(); 

    return TRUE; 
} 

CApp App; 

回答

0

了解的功能嵌套的最简单方法是在CDialog的:OnCommandHelp和的CWnd :: OnHelpInfo设置断点。

第一个WM_HELPINFO被发送到窗口。 CWnd :: OnHelpInfo中的默认实现可以处理它,并在以后的OnCommandHelp中被调用。这里使用m_nIDHelp并启动帮助屏幕。

如果你处理所有的东西在自己的OnHelpInfo处理程序存在于OnCommandHelp没有呼叫...

其实这种复杂的结构是由倍孑遗中我们没有过SetWindowContextHelpId。

当我有一个正常的对话框,然后按,我得到一个电话OnCoammandHelp和lParam从来没有0! 可能是因为我没有处理OnHelpInfo。如果使用OnHelpInfo,则上下文已经被确定...因为您已经完成了,通过处理OnHelpInfo。

+0

好吧,我删除了OnHelpInfo处理程序,但OnCommandHelp处理程序中仍然lParam == 0。我更新了代码的问题。试图设置m_nIDHelp并使用SetWindowContextHelpId作为框架和按钮,但没有任何作用。 – undermind

+0

奇怪。设置一个breakpint OnCommandHelp。看看这个callstack ...可能会有所帮助。 – xMRi

相关问题