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

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

 2006-07-22 22:03:17 来源:WEB开发网   
核心提示: 事件响应链的入口与前面的例子很相似:BEGIN_SINK_MAP(CMainDlg)SINK_ENTRY_INFO(37, DIID_DWebBrowserEvents2, DISPID_DOWNLOADBEGIN,OnDownloadBegin, &DownloadInfo)SINK_E

事件响应链的入口与前面的例子很相似:

BEGIN_SINK_MAP(CMainDlg)
  SINK_ENTRY_INFO(37, DIID_DWebBrowserEvents2, DISPID_DOWNLOADBEGIN,
          OnDownloadBegin, &DownloadInfo)
  SINK_ENTRY_INFO(37, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2,
          OnBeforeNavigate2, &BeforeNavigate2Info)
 END_SINK_MAP()

事件处理函数是这个样子:

void __stdcall CMainDlg::OnBeforeNavigate2 (
  IDispatch* pDisp, VARIANT* URL, VARIANT* Flags,
  VARIANT* TargetFrameName, VARIANT* PostData,
  VARIANT* Headers, VARIANT_BOOL* Cancel )
{
CString sURL = URL->bstrVal;
 // ... log the URL, or whatever you''d like ...
}

我打赌你现在是越来越喜欢ClassWizard了,因为当你向MFC的对话框插入一个ActiveX控件时ClassWizard自动为你完成了所有工作。

将CMainDlg转换成对象需要注意几件事情,首先必须修改全局函数Run(),现在CMainDlg是个COM对象,我们必须使用CComObject创建CMainDlg:

int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)
{
  CMessageLoop theLoop;
  _Module.AddMessageLoop(&theLoop);
CComObject<CMainDlg> dlgMain;
  dlgMain.AddRef();
  if ( dlgMain.Create(NULL) == NULL )
    {
    ATLTRACE(_T("Main dialog creation failed!\n"));
    return 0;
    }
  dlgMain.ShowWindow(nCmdShow);
  int nRet = theLoop.Run();
  _Module.RemoveMessageLoop();
  return nRet;
}

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

上一页  3 4 5 6 7 8 9 10  下一页

Tags:MFC 程序员 WTL

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