2012wtl,学习活扩
原文
WTL
学习注意–活扩
在Win32
下,活扩
控件已是个成熟的概念了
,即使对COM
不太了解,使用活扩
控件仍是件容易的事情
.既然是控件
,无非要关注两个方面
,第一是如何调用它的函数
,其次是如何接收它的事件
.
看看在WTL
中,如何使用活扩
控件(基本对话框
):
1
.创建项目时,让对话框
支持活扩
.从代码中,可发现一些差异:
//对话框从`CAxDialogImpl`继承,而不是从`CdialogImpl`继承:
class CMainDlg : public CAxDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>,
public CMessageFilter, public CidleHandler
//起动时初始`ActiveX`:
AtlAxWinInit()
2
.打开对话框资源,向对话框
时插入WebBrowser
控件.可发现rc
文件中多了一项
:
CONTROL "",IDC_EXPLORER,"{8856F961-340A-11D0A96B-00C04FD705A2}",
WS_TABSTOP,7,7,198,174
#import "C:/WINNT/System32/shdocvw.dll"
3
.调用控件
的函数,CAxDialogImpl
实现了一个QueryControl
函数,通过它可查询到控件的接口
,然后通过该接口指针
访问对象
.
CAxWindow wndIE = GetDlgItem(IDC_EXPLORER);
CComPtr<IWebBrowser2> pWB2;
HRESULT hr = wndIE.QueryControl ( &pWB2 );
if ( pWB2 )
{CComVariant v; //空`变量`pWB2->Navigate ( CComBSTR("http://blog.csdn.net/absurd/"),&v, &v, &v, &v );
}
4
.处理控件的事件
,在对话框资源
上,通过鼠标右键
为控件
加入处理事件函数
,会有类似如下的代码
:
//`导入`类型库,需要把后面那些参数删除才能编译过.
#import "C:/WINNT/System32/shdocvw.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids
//让对话框从`IdispEventImpl`继承过来
class CMainDlg : public CAxDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>,
public CMessageFilter, public CIdleHandler,
public IDispEventImpl<IDC_EXPLORER, CMainDlg>
//增加事件映射
BEGIN_SINK_MAP(CMainDlg)//确保事件处理器有`__stdcall`调用约定SINK_ENTRY(IDC_EXPLORER, 0x68, OnDownloadCompleteExplorer)
END_SINK_MAP()//增加处理事件函数
VOID __stdcall OnDownloadCompleteExplorer()
{//`待办`:为事件处理器添加代码.MessageBox("download ok");
}
5
.还要在OnInitDialog
做些初化工作
,事件才能生效
.
AtlAdviseSinkMap ( this, true );
6
.最后在CloseDialog
中做些反初化工作
:
AtlAdviseSinkMap ( this, false );