导读:
WTL 学习笔记-- ActiveX
在Win32下,ActiveX控件已经是个耳熟的概念了,即使对COM不太了解,使用ActiveX控件仍然是件容易的事件。即然是控件,无非要关注两个方面,第一是如何调用它的函数,其次是如何接收它的事件。
我们看看在WTL中如何使用ActiveX控件(基本对话框):
1. 创建项目时,让对话框支持ActiveX。从代码中,可以发现一些差异:
//对话框从CaxDialogImpl继承,而不是从CdialogImpl继承:
classCMainDlg: publicCAxDialogImpl , publicCUpdateUI ,
publicCMessageFilter, publicCidleHandler
//起动时初始ActiveX:
AtlAxWinInit()
2. 打开对话框资源,向对话框时插入Web Browser控件。可以发现rc文件中多了一项:
CONTROL "",IDC_EXPLORER,"{8856F961-340A-11D0-A96B-00C04FD705A2}",
WS_TABSTOP,7,7,198,174
#import "C:/WINNT/System32/shdocvw.dll"
3. 调用控件的函数,CaxDialogImpl实现了一个函数QueryControl,通过它可以查询到控件的接口,然后通过这个接口指针访问对象。
CAxWindowwndIE= GetDlgItem(IDC_EXPLORER);
CComPtr pWB2
HRESULThr= wndIE.QueryControl( &pWB2);
if( pWB2)
{
CComVariantv // empty variant
pWB2->Navigate( CComBSTR("http://blog.csdn.net/absurd/"),
&v, &v, &v, &v);
}
4. 处理控件的事件,在对话框资源上,通过鼠标右键为控件加入事件处理函数,会下类似如下的代码:
//import类型库,需要把后面那些参数删除才能编译过。
#import "C:/WINNT/System32/shdocvw.dll"raw_interfaces_only, raw_native_types, no_namespace, named_guids
//让对话框从IdispEventImpl继承过来
classCMainDlg: publicCAxDialogImpl , publicCUpdateUI ,
publicCMessageFilter, publicCIdleHandler,
publicIDispEventImpl
//增加事件映射
BEGIN_SINK_MAP(CMainDlg)
//Make sure the Event Handlers have __stdcall calling convention
SINK_ENTRY(IDC_EXPLORER, 0x68, OnDownloadCompleteExplorer)
END_SINK_MAP()
//增加事件处理函数
VOID__stdcallOnDownloadCompleteExplorer()
{
// TODO : Add Code for event handler.
MessageBox("download ok");
}
5. 还要在OnInitDialog做些初始化工作,事件才能生效。
AtlAdviseSinkMap( this, true);
6. 最后在CloseDialog中做些~初始化工作:
AtlAdviseSinkMap( this, false);
简单吧。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=661000
本文转自
http://blog.csdn.net/absurd/archive/2006/04/12/661000.aspx
WTL 学习笔记-- ActiveX
在Win32下,ActiveX控件已经是个耳熟的概念了,即使对COM不太了解,使用ActiveX控件仍然是件容易的事件。即然是控件,无非要关注两个方面,第一是如何调用它的函数,其次是如何接收它的事件。
我们看看在WTL中如何使用ActiveX控件(基本对话框):
1. 创建项目时,让对话框支持ActiveX。从代码中,可以发现一些差异:
//对话框从CaxDialogImpl继承,而不是从CdialogImpl继承:
classCMainDlg: publicCAxDialogImpl , publicCUpdateUI ,
publicCMessageFilter, publicCidleHandler
//起动时初始ActiveX:
AtlAxWinInit()
2. 打开对话框资源,向对话框时插入Web Browser控件。可以发现rc文件中多了一项:
CONTROL "",IDC_EXPLORER,"{8856F961-340A-11D0-A96B-00C04FD705A2}",
WS_TABSTOP,7,7,198,174
#import "C:/WINNT/System32/shdocvw.dll"
3. 调用控件的函数,CaxDialogImpl实现了一个函数QueryControl,通过它可以查询到控件的接口,然后通过这个接口指针访问对象。
CAxWindowwndIE= GetDlgItem(IDC_EXPLORER);
CComPtr pWB2
HRESULThr= wndIE.QueryControl( &pWB2);
if( pWB2)
{
CComVariantv // empty variant
pWB2->Navigate( CComBSTR("http://blog.csdn.net/absurd/"),
&v, &v, &v, &v);
}
4. 处理控件的事件,在对话框资源上,通过鼠标右键为控件加入事件处理函数,会下类似如下的代码:
//import类型库,需要把后面那些参数删除才能编译过。
#import "C:/WINNT/System32/shdocvw.dll"raw_interfaces_only, raw_native_types, no_namespace, named_guids
//让对话框从IdispEventImpl继承过来
classCMainDlg: publicCAxDialogImpl , publicCUpdateUI ,
publicCMessageFilter, publicCIdleHandler,
publicIDispEventImpl
//增加事件映射
BEGIN_SINK_MAP(CMainDlg)
//Make sure the Event Handlers have __stdcall calling convention
SINK_ENTRY(IDC_EXPLORER, 0x68, OnDownloadCompleteExplorer)
END_SINK_MAP()
//增加事件处理函数
VOID__stdcallOnDownloadCompleteExplorer()
{
// TODO : Add Code for event handler.
MessageBox("download ok");
}
5. 还要在OnInitDialog做些初始化工作,事件才能生效。
AtlAdviseSinkMap( this, true);
6. 最后在CloseDialog中做些~初始化工作:
AtlAdviseSinkMap( this, false);
简单吧。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=661000
本文转自
http://blog.csdn.net/absurd/archive/2006/04/12/661000.aspx