WEB开发网
开发学院软件开发VC MFC程序员WTL指南(7)包容ActiveX控件 阅读

MFC程序员WTL指南(7)包容ActiveX控件

 2008-01-19 20:26:50 来源:WEB开发网   
核心提示:另一个可替代的方法是不使用CComObject,而使用CComObjectStack类,MFC程序员WTL指南(7)包容ActiveX控件(6),并删除dlgMain.AddRef()这一行代码,CComObjectStack对IUnknown的三个方法的实现有些微不足道(它们只是简单的从函数返回),下面就是做这些检查

另一个可替代的方法是不使用CComObject,而使用CComObjectStack类,并删除dlgMain.AddRef()这一行代码,CComObjectStack对IUnknown的三个方法的实现有些微不足道(它们只是简单的从函数返回),因为它们不是必需的--这样的COM对象可以忽略对引用的计数,因为它们仅仅是创建在栈中的临时对象。

当然这并不是完美的解决方案,CComObjectStack用于短命的临时对象,不幸的是只要调用它的任何一个IUnknown方法都会引发断言错误。因为CMainDlg对象在开始监听事件时会调用AddRef,所以CComObjectStack不适用于这种情况。

解决这个问题要么坚持使用CComObject,要么从CComObjectStack派生一个CComObjectStack2类,允许对IUnknow方法调用。CComObject的那个不必要的引用计数并无大碍--人们不会注意到它的发生--但是如果你必须节省那个CPU时钟周期的话,你可以使用本章的例子工程代码中的CComObjectStack2类。

回顾例子工程

现在我们已经看到事件响应如何工作了,再来看看完整的IEHoster工程,它包容了一个浏览器控件并响应了6个事件,它还显示了一个事件列表,你会对浏览器如何使用它们提供带进度条的界面有个感性的认识,程序处理了以下几个事件:

  • BeforeNavigate2和NavigateComplete2:这些事件让程序可以控制URL的导航,如果你响应了BeforeNavigate2事件,你可以在事件的处理函数中取消导航。
  • DownloadBegin和DownloadComplete:程序使用这些事件控制“wait”消息,这表示浏览器正在工作。一个更优美的程序会像IE一样在此期间使用一段动画。
  • CommandStateChange:这个事件告诉程序向前和向后导航命令何时可用,应用程序将相应的按钮变为可用或不可用。
  • StatusTextChange:这个事件会在几种情况下触发,例如鼠标移到一个超链接上。这个事件发送一个字符串,应用程序响应这个事件,将这个字符串显示在浏览器窗口下的静态控件上。

程序有四个按钮控制浏览器工作:向后,向前,停止和刷新,它们分别调用IWebBrowser2相应的方法。

事件和伴随事件发送的数据都被记录在列表控件中,你可以看到事件的触发,你还可以关闭一些事件记录而仅仅观察其中的一辆个事件。为了演示事件处理的重要作用,我们在BeforeNavigate2事件处理函数中检查URL,如果发现“doubleclick.net”就取消导航。广告和弹出窗口过滤器等一些IE的插件使用的就是这个方法而不是HTTP代理,下面就是做这些检查的代码。

void __stdcall CMainDlg::OnBeforeNavigate2 (
   IDispatch* pDisp, VARIANT* URL, VARIANT* Flags,
   VARIANT* TargetFrameName, VARIANT* PostData,
   VARIANT* Headers, VARIANT_BOOL* Cancel )
{
USES_CONVERSION;
CString sURL;
   sURL = URL->bstrVal;
   // You can set *Cancel to VARIANT_TRUE to stop the
   // navigation from happening. For example, to stop
   // navigates to evil tracking companies like doubleclick.net:
   if ( sURL.Find ( _T("doubleclick.net") ) > 0 )
     *Cancel = VARIANT_TRUE;
}

下面就是我们的程序工作起来的样子:

IEHoster还使用了前几章介绍过得类:CBitmapButton(用于浏览器控制按钮),CListViewCtrl(用于事件记录),DDX (跟踪checkbox的状态)和CDialogResize.

上一页  1 2 3 4 5 6 7  下一页

Tags:MFC 程序员 WTL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接