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函数无法正常阻止导航的问题及解决方案。通过重写该函数并忽略基类行为,可以有效控制自定义协议如app:的跳转。
182

被折叠的 条评论
为什么被折叠?



