返回首页

概述
上下文敏感的帮助,可以为您开发的任何方案的强大功能。但是FormView的治疗 不同,它作为一个单一的帮助主题的所有控制。这可能不是你想要的!实现上下文帮助
为了获得上下文敏感的帮助您的FormView控件,你需要以下内容添加到您的CFormView派生类:地图WM_HELPHITTEST,您的FormView和WM_COMMANDHELP消息
WM_HELPHITTEST上点击一个窗口区发送系统启用后,上下文敏感的帮助。 "当用户按下F1帮助键WM_COMMANDHELP消息发送。我们需要得到我们的FormView的响应这些消息正确和有正确的帮助主题ID显示在帮助文件中。这些消息和代码的函数原型如下:


// in your FormViews header file

afx_msg LRESULT OnHelpHitTest(WPARAM wParam, LPARAM lParam);

afx_msg LRESULT OnCommandHelp(WPARAM wParam, LPARAM lParam);

 

// in your FormViews MESSAGE_MAP

ON_MESSAGE(WM_HELPHITTEST, OnHelpHitTest)

ON_MESSAGE(WM_COMMANDHELP, OnCommandHelp)



// Your views class function



LRESULT CYourFormView::OnHelpHitTest(WPARAM wParam, LPARAM lParam)

{

    // message is sent to us as follows:

    // dwContext = ::SendMessage(hWnd, WM_HELPHITTEST,0,MAKELONG(point.x, point.y));

    // WPARAM = 0 ;

    // LPARAM = Point clicked

 

    CPoint p((DWORD)lParam) ;

 

    ClientToScreen(&p) ;

 

    CWnd *pWnd = WindowFromPoint(p) ;

    if (pWnd != NULL)

    {

        // convert to correct help ID, see makehelp.bat

        if (pWnd == this)

            return IDD + 0x20000 ;    

        else

            return pWnd->GetDlgCtrlID() + 0x60000 ; // see later about 0x60000

        }

    return 0 ;            // failed!

}



LRESULT    CContextHelpView::OnCommandHelp(WPARAM wParam, LPARAM lParam)

{

    // message is sent to us as a test to see whether we make WinHelp appear

    // return non-zero if we process the message

    // wParam = 0, not used

    // lParam = 0, not used

    CWnd *pWnd = GetFocus();

    if (pWnd != NULL)

        {

        DWORD helpID;

        // convert to correct help ID

        if (pWnd == this)

            helpID = IDD + 0x20000 ;

        else

            helpID = pWnd->GetDlgCtrlID() + 0x60000 ;

        // we have a control with the focus, pop-up help for it

        AfxGetApp()->WinHelp(helpID);

        return TRUE;

        }

    return FALSE;        // let default handling process it

}

设置你makehelp.bat的文件,以地图IDC_ *控件的ID是为了帮助主题HIDC_ *的
默认情况下不支持您的帮助文件控制帮助ID。为了让他们的工作,你需要引起MakeHelp.bat文件的ID正确的帮助ID范围的地图。我没有加入以下几行的MakeHelp.bat文件,这应该是目前在该项目的主要目录{C}
加入以下几行,将确保您的帮助文件。HM文件需要编号的正确映射控制。我选择了值0x60000,如果您使用一个不同的值,你需要修改的CYourFormView在帮助文件中的对话框控件的基范围:OnHelpHitTest()函数返回控件的ID的基值。帮助主题添加到您的帮助文件
一旦你有上下文敏感的帮助工作,你需要地图在您的帮助文件的主题,证明一切正常。最低,您需要添加每个主题是:
${\footnote Button 4 topic}

K{\footnote Button 4 topic}

#{\footnote HIDC_BUTTON4}

{\b Button 4 topic}\line

This comes up when you click on button 4 for context help\par

\line

\page

包括在本文开头的是一个工作示例更新25-10-2002现在乔尔Charbonnet,例如更新的要求,与F1键
享受!

回答

评论会员:会员3455398 时间:2011/11/29
在OnHelpHitTest()函数,这样做:


LRESULT CMyFormView::OnHelpHitTest(WPARAM wParam, LPARAM lParam)

{

	CPoint pt((DWORD)lParam) ;

	CWnd *pWnd = ChildWindowFromPoint(pt, CWP_SKIPINVISIBLE); // <<<-------------

	LRESULT nID = 0;

	if (pWnd != NULL)

	{

		if (pWnd == this)

		{

			nID = IDD;

		}

		else

		{

			nID = pWnd->GetDlgCtrlID();

		}

	}

	return nID ;            // failed!

}


使用ChildWindowFromPoint有两大优点:

1),它返回一个CWnd为每一个表单上的控制,即使他们禁用,隐藏或透明。
您也可以使用函数的第二个参数来筛选正是发现。
2)你并不需要使用点ScreenToClient()之前使用它。



------- SIG开始

"我听说过一些司机说,"我们走得太快...'.如果你不能在这里比赛,去地狱回家 - 不来这里抱怨走得太快,为什么不"T你挂在你的脚踝煤油抹布,所以蚂蚁不会爬上,吃你的糖果屁股... ..." - 山谷Earnhardt

"... ...在发言中淫秽惊人层做出这么多层次的艺术工作。"贾森 - Jystad,2001年10月26日
评论会员:TanmaySathe 时间:2011/11/29
你有一个HTMLHELP工作,你可以共享一个CFormView samplke 我追赶OnHelpHitTest在CFormView的,我不能为我的生活得到帮助,弹出。
我得到一个错误信息表明,我有一个别名/地图的问题。
据我所知(恐怕不是很大)的别名/地图可以为#定义的任何值。
我只是复制它。HM文件,并添加了#定义。
这一切workd terifically的对话框,但已经有点失望与CFormView的一个。

我什至试图追赶OnHelpHitTest和弹出自己的帮助信息。其中还挺八九不离十工程,但随后HelpResource编号通过帮助API,我仍然得到一个错误。
其实,有时与此相关的帮助窗口的是持久性有机污染物,但没有文字显示在窗口中。

感谢任何意见/协助
评论会员:会员2506085 时间:2011/11/29
我有没有做了一年多的C / MFC。恐怕我不会有很大帮助。
"你为什么不挂在你的脚踝煤油浸泡的抹布,让蚂蚁不会爬上,吃你的糖果屁股... ..." - 山谷Earnhardt,1997年{BR }-----{ BR }"...淫秽惊人层在发言中这么多层次的艺术工作"。贾森 - Jystad,2001年10月26日
评论会员:lith1 时间:2011/11/29
我不知道你为什么用这么多的功能得到光标下的窗口ID,即使一个简单的函数OnToolHitTest可以做同样的工作

OnHelpHitTest这个简单的解决方案可取代: -

LRESULT CYourFormView:OnHelpHitTest(WPARAM,LPARAM lParam的)
{
 0; INT NID = OnToolHitTest((DWORD)的lParam为NULL)
如果(NID = -1)
& #160; NID 0x60000;
ELSE
 0;国际直拨电话地址0x20000;
}
Tanmay
评论会员:爱丽丝 时间:2011/11/29
我尝试这样做,它的工作对我罚款

在一个视图。

当我尝试另一种观点认为,它返回所有
-1(失败)控制,我永远无法确定为什么。这两种观点是从CFormView的派生。

罗伯特Ramey
评论会员:alfa_aquila 时间:2011/11/29
我作为使用HTMLHELP,而不是在我的应用程序的WinHelp的利用这个代码?
评论会员:TanmaySathe 时间:2011/11/29
是应该的。

------- SIG开始

"我听说过一些司机说,"我们走得太快...'.如果你不能在这里比赛,去地狱回家 - 不来这里抱怨走得太快,为什么不"T你挂在你的脚踝煤油抹布,所以蚂蚁不会爬上,吃你的糖果屁股... ..." - 山谷Earnhardt

"... ...在发言中淫秽惊人层做出这么多层次的艺术工作。"贾森 - Jystad,2001年10月26日
评论会员:ManojP 时间:2011/11/29
该代码的伟大工程!!谢谢!
我有一个小问题...
当用户点击,在控制箭头,代码调用onHelpHitTest()
我只是想帮助在弹出的出现。
我已命令插入
AfxGetApp ()->( helpId,HELP_CONTEXTPOPUP)
onHelpHitTest()函数返回前...
但programm显示弹出,然后帮助内容...

任何sugestions帮助meeeee .... {S0}
爱丽丝
评论会员:马西莫Bovara 时间:2011/11/29
嗨,
我可以为你解决。
您尝试修改下面的代码:

(h文件)
AFX_MSG LRESULT OnHelpHitTest(WPARAM WPARAM,LPARAM的lParam)

(在。cpp文件)
ON_MESSAGE(WM_HELPHITTEST,OnHelpHitTest)
/ /函数的实现
LRESULT CYourFormView:OnHelpHitTest(WPARAM WPARAM,LPARAM的lParam)
{
连接点P((DWORD)的lParam)

ClientToScreen(P);   ; 的CWnd * pWnd = WindowFromPoint(P)

 0;如果(pWnd = NULL){
/ /转换为正确的帮助ID,看到makehelp.bat
(pWnd ==这)
国际直拨电话地址0x20000;
ELSE
& #160; 返回pWnd -> GetDlgCtrlID(0x60000); / /后面看到0x60000
}

返回0; / /失败!}

:

(h文件)
AFX_MSG无效OnMyHelpHitTest(WPARAM WPARAM,LPARAM的lParam)

(在。cpp文件)
ON_MESSAGE(WM_HELPHITTEST,OnMyHelpHitTest)

/ /函数的实现
无效CEcdisBig:OnMyHelpHitTest(WPARAM WPARAM,LPARAM的lParam)
{
连接点P((DWORD)的lParam)

ClientToScreen(P); 的CWnd * pWnd = WindowFromPoint(P)

如果(pWnd = NULL){
 60;DWORD helpID;
(pWnd ==这)
& #160;helpID =国际直拨电话地址0x20000; / /转换为正确的帮助ID
ELSE
helpID = pWnd -> GetDlgCtrlID()0x60000;
AfxGetApp() - >的WinHelp(helpID,HELP_CONTEXTPOPUP)
}
}

现在,重新编译和运行您的应用程序。
好运气{S1}
评论会员:。赫伯特Illfelder 时间:2011/11/29
我有另一个解决方案,为您

您尝试下面的代码:

无效CContextHelpView:OnMyHelpHitTest(WPARAM WPARAM,LPARAM的lParam)
{ / /发送消息如下:/ / dwContext =::SendMessage消息(HWND,WM_HELPHITTEST,MAKELONG(point.x,point.y),0);
/ / WPARAM = 0; / / LPARAM =点点击
DWORD helpID;

的CWinApp * theApp = AfxGetApp(); CString的helpFilePath = theApp - > m_pszHelpFilePath;

helpFilePath ="> NewWin"; / / NewWin是在ContextHelp.hpj定义,一节中的"窗口"

连接点P((DWORD)的lParam)
ClientToScreen(P); & #160;
的CWnd * pWnd = WindowFromPoint(P)
(pWnd = NULL)
{
(pWnd ==这)
&# 160; helpID =国际直拨电话地址0x20000; / /转换为正确的帮助ID
& #160; ELSE
helpID = pWnd -> GetDlgCtrlID()0x60000;
::WinHelp的(pWnd -> m_hWnd,helpFilePath,HELP_CONTEXT,helpID)
}
}

有关详细信息,下载PDF文件:


好运气。
评论会员:萨姆霍布斯 时间:2011/11/29
!喂,
我尝试了代码和它的伟大工程!谢谢! :DDD
我仍然有一个问题,但... ...当我使用弹出的帮助,首先是弹出,然后在上下文帮助:/怎么能避免此

预先感谢您了!
夏。
评论会员:赫伯特Illfelder 时间:2011/11/29

您好,
你可以尝试用这种方法!

无效CYourClass:OnMyHelp(WPARAM WPARAM,LPARAM的lParam)
{
CString的假人("虚拟");//它是为了避免在Windows调用的WinHelp
}
/ /添加WinHelp的功能,如果您需要
无效CYourClass:的​​WinHelp(DWORD dwData,UINT nCmd)
{
CString的helpFileName ="HELPFILE.hlp";
CString的helpFilePath ="C:\ \ HelpFileDir \ \";
.............{ BR}.............{ BR}.............

helpFilePath = helpFileName; :的WinHelp(m_hWnd,helpFilePath,HELP_FINDER,0L);/ / CDialog的:的WinHelp(dwData,nCmd);
}

祝你好运,{S1}
马西莫B.
评论会员:萨姆霍布斯 时间:2011/11/29
您好,
你可以试试这个。我用它和工程罚款。

第1步]新增布尔bPopup CYourApp类,把它初始化为FALSE。
第2步覆盖的WinHelp CYourApp在这段代码替换
无效CYourApp:的WinHelp(DWORD dwData,UINT nCmd)
{的CWinApp::的WinHelp(dwData,bPopup HELP_CONTEXTPOPUP:?nCmd);bPopup = FALSE; / /无弹出窗口,直到我说
}
步骤3]替换CYourView:这个OnHelpHitTest:INT CYourView:OnHelpHitTest(WPARAM,LPARAM lParam的)
{
/ /查找鼠标光标下的子窗口ID
INT NID = OnToolHitTest((DWORD)的lParam为NULL)
如果(NID = -1)
{
/ /显示在弹出窗口的帮助
((CCatApp *)AfxGetApp ())-> bPopup = TRUE;
返回HID_BASE_COMMAND NID;
}
ELSE 返回0;}


Tanmay
评论会员:游客 时间:2011/11/29
乔尔Charbonnet:|能否请你告诉我的方式删除的快捷键F1,使我的应用程序的帮助下无法启动时,用户按下F1键。,被ManojPhirke
罗杰艾伦
评论会员:游客 时间:2011/11/29
你必须从你的代码中删除命令:ON_COMMAND(ID_HELP,CMDIFrameWnd::OnHelp)如果你想其他信息在网址上下载文件:imgsrc=http://www.orcode.com/upimg/2011_11_29_02_59_35_1.gif好运气。
罗杰艾伦
评论会员:游客 时间:2011/11/29
首先,罗杰的方法和作品的文章是非常有用的{S1}我只有2个偏见和一个小我试图解决的问题。首先,如果可能的话,我不喜欢,我不(MAKEHELP.BAT)和第二的修改文件,这个过程会产生大量的HID标签,我不使用。还有一个小问题,重复的HID数字重复的控件ID的生产。原来,有一个替代方案,Microsoft提供解决这些1)不要修改(或unmodify)MAKEHELP.BAT2)检查"上下文敏感"复选框控件的属性。这将产生一个在resource.hm文件的HID条目。即使控制包含重复的ID号,这个数字将是独一无二的的。一个问题仍然存在,你需要确保反对的ID号,你不重复的ID"文本。3)使用,除应为0x80000000(LT国际直拨电话所取代,在这两个0x60000OnHelpHitTestOnCommandHelpimplemention;LT;16)(IDD是在头定义对话框ID等于一个枚举)4)在地图部分。HPJ文件,添加#这是所有乡亲{S1}
PJ Arends
评论会员:游客 时间:2011/11/29
本文是一个对话框的部分答案,但不是一个完整的答案为对话框。请注意,我仍然使用VC5,如果MFC自那时以来在相关的方式改善,那么我会不知道它。有一个CDialog:OnHelpHitTest但WM_HELPHITTEST消息不发送。WM_COMMANDHELP消息发送时(上下文敏感帮助)模式被激活,但GetFocus不会得到控制,点击这是不可能检测帮助模式,使用的CWinApp::m_bHelpModeWM_COMMANDHELP消息发送时,因为它是假的。CDialog的没有m_bHelpMode成员。因此,要允许对话和成员决心帮助模式,会员服务的目的(其他类)的m_bHelpMode成员,可用于创建可称为m_bHelpMode。它可以被设置为TRUE前SC_CONTEXTHELP系统命令的处理和虚假之后,然后在对话框OnCommandHelp帮助模式是积极的,那么以下可以用来代替GetFocus:点连接点(GetMessagePos());{BR}的CWnd*pWnd=WindowFromPoint(点);只是要小心,调试时,因为断点之前的WindowFromPoint会让你觉得它不工作,当你单步。
罗杰艾伦
评论会员:游客 时间:2011/11/29
彼得莫斯处理对话框添加上下文敏感的帮助了一篇文章。这篇文章是:实现MFC应用上下文敏感的帮助彼得莫斯http://www.codeproject.com/winhelp/mfchelp.asp不知道,如果它的工作原理与VC5,但它用VC6。