zoukankan      html  css  js  c++  java
  • 利用wtl的CDialogResize自动调整atl ActiveX控件布局

    前言

    利用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

      源码:ResizableActiveX.zip

  • 相关阅读:
    2018-2019-2 20165325 网络对抗技术 Exp4 恶意代码分析
    2018-2019-2 网络对抗技术 20165325 Exp3 免杀原理与实践
    2018-2019-2 网络对抗技术 20165325 Exp2 后门原理与实践
    2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解
    20165315 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1
    2018-2019-1 20165226_20165310_20165315 实验五 通讯协议设计
    2018-2019-120165226_20165310_20165315 实验四 外设驱动程序设计
    2018-2019-1 20165315 实验三 实时系统
    2018-2019-1 20165226 20165310 20165315 实验二 固件程序设计
    20165315 第八周考试课下补做
  • 原文地址:https://www.cnblogs.com/txk1452/p/3395875.html
Copyright © 2011-2022 走看看