前言
利用atl 开发activex控件时,如果使用atl复合控件时,acitvex控件上的界面元素不会自动改变大小,如果自己在OnSize中处理每个子控件的布局是一件非常麻烦的事,我们可以借助wtl中的CDialogResize类来帮我们轻松的完成这项工作。本文以vs2010为例,讲解如何使用CDialogResize类
步骤
一、新建atl工程ResizableActiveX
二、在ResizableActiveX工程上右键,Add->Class,弹出窗口中选择ATL->ATL Control->Add
三、弹出窗口中Short Name输入ResizableTest, 其他默认生成。option中选择
在Stock Properties中增加AutoSize和TabStop点击Finshed完成ResizableTest ActiveX控件的创建
四、修改ResizableTest.html,加上width和border属性,可以观察当前不支持自动调整的效果
<OBJECT width=100% border=1 ID="ResizableTest" CLASSID="CLSID:1EEE1EA2-BCEA-4383-ADBC-EF7D99CE8751"></OBJECT>
五、修改代码
StdAfx.h中增加 :
#include <atlapp.h>
#include <atlframe.h>
CResizableTest中增加从CResizableTest类继承,OnInitDialog中增加 DlgResize_Init(false, false, WS_CHILD);
增加CHAIN_MSG_MAP(CDialogResize<CResizableTest>),BEGIN_DLGRESIZE_MAP中增加要调整的控件布局方式
class ATL_NO_VTABLE CResizableTest : public CComObjectRootEx<CComSingleThreadModel>, public CStockPropImpl<CResizableTest, IResizableTest>, public IOleControlImpl<CResizableTest>, public IOleObjectImpl<CResizableTest>, public IOleInPlaceActiveObjectImpl<CResizableTest>, public IViewObjectExImpl<CResizableTest>, public IOleInPlaceObjectWindowlessImpl<CResizableTest>, public ISupportErrorInfo, public IObjectWithSiteImpl<CResizableTest>, public IQuickActivateImpl<CResizableTest>, #ifndef _WIN32_WCE public IDataObjectImpl<CResizableTest>, #endif public IProvideClassInfo2Impl<&CLSID_ResizableTest, NULL, &LIBID_ResizableActiveXLib>, public IObjectSafetyImpl<CResizableTest, INTERFACESAFE_FOR_UNTRUSTED_CALLER>, public CComCoClass<CResizableTest, &CLSID_ResizableTest>, public CComCompositeControl<CResizableTest>, public CDialogResize<CResizableTest> BEGIN_MSG_MAP(CResizableTest) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) CHAIN_MSG_MAP(CComCompositeControl<CResizableTest>) COMMAND_HANDLER(IDC_BTN_SELECTFOLDER, BN_CLICKED, OnBnClickedBtnSelectfolder) CHAIN_MSG_MAP(CDialogResize<CResizableTest>) END_MSG_MAP() BEGIN_DLGRESIZE_MAP(CResizableTest) DLGRESIZE_CONTROL(IDC_BTN_SELECTFOLDER, DLSZ_MOVE_X) DLGRESIZE_CONTROL(IDC_EDIT_PATH, DLSZ_SIZE_X) DLGRESIZE_CONTROL(IDC_LIST_FILE, DLSZ_SIZE_X | DLSZ_SIZE_Y) END_DLGRESIZE_MAP() LRESULT OnInitDialog( _In_ UINT /*uMsg*/, _In_ WPARAM /*wParam*/, _In_ LPARAM /*lParam*/, _Out_ BOOL& bHandled) { DlgResize_Init(false, false, WS_CHILD); bHandled = FALSE; //这里一定要设置为FALSE,好让CComCompositeControl有机会处理
return 1; }
六、编译后打开ResizableTest.htm,调整窗口大小可看到ActiveX动态改变大小的效果
参考:http://www.codeproject.com/Articles/1214/Using-WTL-s-Built-in-Dialog-Resizing-Class