一些使用过的技术总结(二)

本文介绍了一种在MFC应用程序中接收Internet Explorer控件事件的方法。通过创建一个派生于CCmdTarget的事件处理类,并实现IDispatch接口,可以监听并处理IE控件触发的各种事件,如点击链接等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2. MFC 接收IE事件的方法

    接收来自com(Activex)事件的方法应该有几种。

   在网页中接收activex控件的方法示例如下:

   <script for="Manager" language="javascript" event= "DispMessage(nCmd,strMsg)" >

                DispMessage(nCmd,strMsg);

   </script>
   <object id = "Manager" classid = "clsid:F6D3258C-B5C7-4F13-8F08-30D4FF55F20D"  width= 0px; height=0px></object>

   MFC库接收ie控件事件方法是写个接收的类,下面的示例代码是接收网页上点击链接事件的。

   DocEvtHandler.h

   #pragma once

#import <mshtml.tlb>

// CDocEvtHandler 命令目标

class CDocEvtHandler : public CCmdTarget
{
 DECLARE_DYNAMIC(CDocEvtHandler)

public:
 CDocEvtHandler();
 virtual ~CDocEvtHandler();

 void OnClick(MSHTML::IHTMLEventObjPtr pEvtObj);

 

 DECLARE_MESSAGE_MAP()
 DECLARE_DISPATCH_MAP()
 DECLARE_INTERFACE_MAP()
};

 

 

   DocEvtHandler.cpp

   #include "stdafx.h"
  #include "DocEvtHandler.h"

IMPLEMENT_DYNAMIC(CDocEvtHandler, CCmdTarget)

CDocEvtHandler::CDocEvtHandler()
{
 EnableAutomation();  // 重要:激活 IDispatch
}

CDocEvtHandler::~CDocEvtHandler()
{

}

BEGIN_MESSAGE_MAP(CDocEvtHandler, CCmdTarget)
END_MESSAGE_MAP()

BEGIN_DISPATCH_MAP(CDocEvtHandler, CCmdTarget)
 DISP_FUNCTION_ID(CDocEvtHandler,"HTMLELEMENTEVENTS2_ONCLICK",
 DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnClick,
 VT_EMPTY, VTS_DISPATCH)
END_DISPATCH_MAP()

BEGIN_INTERFACE_MAP(CDocEvtHandler, CCmdTarget)
 INTERFACE_PART(CDocEvtHandler,
 DIID_HTMLButtonElementEvents2, Dispatch)
END_INTERFACE_MAP()

 

 

void CDocEvtHandler::OnClick(MSHTML::IHTMLEventObjPtr pEvtObj)
{
 MSHTML::IHTMLElementPtr pElement =
  pEvtObj->GetsrcElement();

  

   //处理点击网页元素的代码 

   .......................


}

事件处理类继承自CCmdTarget,在CCmdTarget类中有一个成员变量实现了IDispatch接口。

使用此类的方法

CMDITabView.cpp

..............

m_pEventHandler = new CDocEvtHandler;

..............


void CMDITabView::InstallEventHandler()
{
 if(m_dwDocCookie)   // 已安装,卸载先。最后一次安装的才有效
 UninstallEventHandler();

 m_pDispDoc = GetHtmlDocument();
 IConnectionPointContainerPtr pCPC = m_pDispDoc;
 IConnectionPointPtr pCP;
 // 找到安装点
 pCPC->FindConnectionPoint(DIID_HTMLDocumentEvents2, &pCP);
 IUnknown* pUnk = m_pEventHandler->GetInterface(&IID_IUnknown);
 //安装
 HRESULT hr = pCP->Advise(pUnk, &m_dwDocCookie);
 if(!SUCCEEDED(hr))  // 安装失败
  m_dwDocCookie = 0;
}
// 卸载响应函数。省略了一些失败判断以突出主要步骤
void CMDITabView::UninstallEventHandler()
{
 if(0 == m_dwDocCookie) return;

 IConnectionPointContainerPtr pCPC = m_pDispDoc;
 IConnectionPointPtr pCP;
 pCPC->FindConnectionPoint(DIID_HTMLDocumentEvents2, &pCP);
 HRESULT hr = pCP->Unadvise(m_dwDocCookie);
}
肯能比较简单的方法

http://www.cppblog.com/yxm/archive/2006/10/13/13633.html

Atl接收com事件的方法(摘自网络)

接收器类

 

class EventReceiver :  public IDispEventImpl<0,EventReceiver,&DIID__ConnectPointInterface,&LIBID_xxxLib, 1, 0>

{

public:

    STDMETHOD(EventNotify)(int i);

STDMETHODIMP EventReceiver::EventNotify(int i)

{

      //处理事件的代码 

      return S_OK;

}

 

BEGIN_SINK_MAP(EventReceiver)

    SINK_ENTRY_EX(0, DIID__IConnectionPointTestObjEvents, 1, EventNotify)

END_SINK_MAP()

}

类的使用方法

EventReceiver * pReceiver = new EventReceiver;

pReceiver->DispEventAdvise(pObj); //pObj为产生事件的com对象的实例

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值