我有一个简单的MFC应用程序:一个带有按钮的对话框。对于他们两个,我调用了SetWindowContextHelpId()
并将其上下文ID设置为非零值。MFC:为什么需要OnCommandHelp,它是如何工作的?
此外,我可以实现帮助命令的两个处理程序:OnCommandHelp(WPARAM wParam, LPARAM lParam)
和OnHelpInfo(HELPINFO* pHelpInfo)
。
MSDN写入以下约OnCommandHelp
:
lParam中包含了当前可用的帮助上下文。 lParam的是零 如果没有帮助上下文已经确定
但在我的情况下,lParam的永远是零,虽然pHelpInfo
从OnHelpInfo(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;
好吧,我删除了OnHelpInfo处理程序,但OnCommandHelp处理程序中仍然lParam == 0。我更新了代码的问题。试图设置m_nIDHelp并使用SetWindowContextHelpId作为框架和按钮,但没有任何作用。 – undermind
奇怪。设置一个breakpint OnCommandHelp。看看这个callstack ...可能会有所帮助。 – xMRi