一些使用过的技术总结(二)
来源:互联网 发布:js 数组包含数组 编辑:程序博客网 时间:2024/05/18 02:51
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对象的实例
- 一些使用过的技术总结(二)
- 一些使用过的技术总结
- IA32平台指令优化一些使用过的有用技术
- 开发工作中使用过的mysql的一些总结
- 我接触过的一些技术&课程
- 面试过部分童鞋,遇到的一些技术问题总结
- 【技术】【总结】git配合gerrit使用的一些总结
- 总结一些做过的习题
- Android Webview的一些使用总结和遇到过得坑
- 记录最近使用过的一些命令
- 记录一些使用过的方法
- 棋牌---这些年使用过的技术
- 毕业后读过的一些技术书籍
- 基于myFaces的JSF技术使用中的一些经验(二)[godroad原创]--dataTable的使用
- 基于myFaces的JSF技术使用中的一些经验(二)[godroad原创]--dataTable的使用
- 一些用过的linux下的命令总结
- 自己总结的一些用过的sql语句
- 做过的一些水题的总结
- pspCidTable
- 我的编程之路
- H3C AR路由器 debugging PIM DM命令
- Repeater_Table_单击_Repeater样式,Table样式,交替变色,单击变色
- eps是什么?
- 一些使用过的技术总结(二)
- n-armed bandit problem
- JavaScript在IE和Firefox上的差异及相互替代方法
- discuz x 目录结构
- Sql Server海量数据分页
- 如何保证全局变量的唯一性?
- UDP_CORK,TCP_CORK以及TCP_NODELAY
- IDR_MAINFRAME字符串资源中各子串的含义
- PXA310音频(5)