概述
VS2008中CHtmlView的OnBeforeNavigate2函数有个莫名其妙的问题,竟然不然实现禁止导航.
函数定义如下:
void CHtmlView::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags,
LPCTSTR lpszTargetFrameName, CByteArray& baPostData,
LPCTSTR lpszHeaders, BOOL* bCancel);
通常在处理自定义协议比如"app:"协议时,使用*bCancel=TRUE来禁止浏览器跳转,但是在VS2008中这样做是无效的.查看函数实现,代码如下:
void CHtmlView::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags,
LPCTSTR lpszTargetFrameName, CByteArray& baPostData,
LPCTSTR lpszHeaders, BOOL* bCancel)
{
// default to continuing
*bCancel = FALSE;
// user will override to handle this notification
UNUSED_ALWAYS(lpszURL);
UNUSED_ALWAYS(nFlags);
UNUSED_ALWAYS(lpszTargetFrameName);
UNUSED_ALWAYS(baPostData);
UNUSED_ALWAYS(lpszHeaders);
}
竟然有
// default to continuing
*bCancel = FALSE;
就是说默认跳转,你之前的*bCancel=TRUE就失效了.既然这样真搞不清楚又整了个bCancel参数干啥,真不知道微软那帮程序员咋想的.
解决这个问题的简单方法就是自己实现OnBeforeNavigate2,不调用CHtmlView的,如下:
void CxxxxView::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel)
{
// TODO: Add your specialized code here and/or call the base class
if (_tcsnicmp(lpszURL,"app:",4)==0)
{
*pbCancel=TRUE;
}
UNUSED_ALWAYS(lpszURL);
UNUSED_ALWAYS(nFlags);
UNUSED_ALWAYS(lpszTargetFrameName);
UNUSED_ALWAYS(baPostedData);
UNUSED_ALWAYS(lpszHeaders);
//CHtmlView::OnBeforeNavigate2(lpszURL, nFlags, lpszTargetFrameName, baPostedData, lpszHeaders, pbCancel);
}
这样根据*bpCancel的值就可实现是否禁止跳转.
最后
以上就是失眠胡萝卜为你收集整理的解决VS2008中CHtmlView函数OnBeforeNavigate2不能禁止跳转的BUG的全部内容,希望文章能够帮你解决解决VS2008中CHtmlView函数OnBeforeNavigate2不能禁止跳转的BUG所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复