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不能禁止跳转内容请搜索靠谱客的其他文章。
发表评论 取消回复