大家好,如何使用atl中的 CWindow, CwindowImpl类呢1. 由于我接到任务,维护,时间很紧,所以不可能看太多的书。真的没有太多时间。 只是想搞懂几个用法,概念.atl 的简单activex,  com类,我多少会用一些吧。但是 从没使用过CWindow等类。我想知道,什么时候用,何时用?
2. 新建一个atl工程后, 就开始添加新的类了,此时面临很多选择。有简单atl对象(即非窗口com对象), atl对话框, atl控件。这3个我都一一试过, 均未出现cWindow类。
我到底该选择哪一个呢?3.   你们如果用atl开发一些窗体类,或者 控件类,你们使用的那些选项呢?我说的选项是指, 用类向导添加类的时候, 可以进行选择,不信的自己尝试。谢谢

解决方案 »

  1.   

    ATL的窗口框架过于基础,且默认向导中没有创建窗口类的项,用WTL吧,它基于ATL设计,扩充了ATL窗口类的功能,使用起来也很接近MFC的用法,但是比MFC灵活多了,而且有WTL向导,也有WTLHELPER插件帮你创建各种窗口类。
      

  2.   

    这是 vs2008,你的意思是,无论选择哪一个都没有窗体嘛?
    顺便说一句:atl也好,wtl也好,技术不是我决定,很多底层已经写好了,  需要搞懂,维护之。我不知道,为什么他们的代理出现了窗体呢,为什么我猜测这个dll是atl呢简单的 atl对象这种我是学过的,看到那些dll出现这些东西, 基本就可以断定是采用atl开发的了。另外 出现大量idispatch之类。所以是如此判断的。到底如何做,才能够 出现窗体呢?我发个截图吧,  
      

  3.   

    ATL控件、ATL对话框、ATL属性页都是可以出现窗体的。其中只有ATL对话框是纯粹的窗体,跟COM无关,其它都是跟COM相关的。众所周知,ATL是一套为COM而生的框架,所以含COM内容是正常不过的事情。下面说说窗体。
    ATL对窗口应用做了最基础的封装,直接使用不太方便,通常要借助于WTL。
    ATL对窗口的封装分成两个层次,一种是对API的封装类,即对窗口句柄的操作封装,最基础的是CWindow,它封装的是通用窗口处理,大部分窗口API都被CWindow封装好了,但ATL只提供了这个基础封装。WTL扩展了其它类型的控件窗口封装,比如CStatic/CButton/CListViewCtrl/CTabCtrl/...等等,用于操作不同类型的窗口,但它们都是从CWindow派生的。这些都是简单封装,仅方便窗口的操作。
    另一个层面的封装就是CWindowImpl/CDialogImpl,以及从它们延伸出来的其它封装类,这类封装才是真正的框架,如果你需要自定义窗口(比如响应消息、自定义窗口风格等等),你的窗口类必须从这些类派生,消息路由、THUNK技术的窗口过程等功能框架已经帮你准备好了,你直接像MFC那样用宏填表就能响应消息了。再说一点,作为框架的CWindowImpl/CDialogImpl等都是模板类,仔细看看它们的模板参数,你会发现有一个参数的默认值就是CWindow,也就是说,这些类全部是从CWindow派生的,你说的未出现CWindow是不对的。为什么把它作为模板参数呢,因为你可以很容易地更改这个默认基类,比如你要自定义一个STATIC控件,那么你可以让你的窗口从CStatic派生,而不是默认的CWindow,只需要这样定义:
    class CMyStatic : public CWindowImpl<CMyStatic, CStatic, xxx>
    {};
    红色的CStatic就是指定基类的,以前默认可是CWindow哦,显然不符合你的要求,所以直接替换基类。最后总结一句话,ATL/WTL的所有窗口类,包括你自己实现的窗口类,最终都是从CWindow派生的。