学习wtl.1
来源:互联网 发布:网络基础知识入门ip 编辑:程序博客网 时间:2024/06/15 15:20
ATL-style 模板。
#include <iostream>using namespace std;template <class T>class B1{public: void SayHi() { T *pT = static_cast<T*>(this); pT->PrintClassName(); }protected: void PrintClassName() { cout << "This is B1" << endl; }};class D1 : public B1<D1>{ //No overridden functions at all};class D2 : public B1<D2>{public: void PrintClassName() { cout << "This is D2" << endl; }};int _tmain(int argc, _TCHAR *argv[]){ D1 d1; D2 d2; d1.SayHi(); //This is B1 d2.SayHi(); //This is D2 getchar(); return 0;}
ATL 窗口类
ATL在设计时接口定义和实现是严格区分开的,这在窗口类的设计中是最明显的,这一点类似于COM,COM的接口定义和实现是完全分开的(或者可能有多个实现)。
ATL有一个专门为窗口设计的接口,可以做全部的窗口操作,这就是CWindow。它实际上就是对HWND操作的包装类,
对几乎所有以HWND句柄为第一个参数的窗口API的进行了封装,例如:SetWindowText() 和 DestroyWindow()。CWindow类有一个公有成员m_hWnd,使你可以直接对窗口的句柄操作,CWindow还有一个操作符HWND,你可以讲CWindow对象传递给以HWND为参数的函数,但这与CWnd::GetSafeHwnd()没有任何等同之处。
CWindow 与 MFC 的CWnd类有很大的不同,创建一个CWindow对象占用很少的资源,因为只有一个数据成员,没有MFC窗口中的对象链,MFC内部维持这一个对象链,此对象链将HWND映射到CWnd对象。还有一点与MFC的CWnd类不同的是当一个CWindow对象超出了作用域,它关联的窗口并不被销毁掉,这意味着你并不需要随时记得分离你所创建的临时CWindow对象。
在ATL类中对窗口过程的实现是CWindowImpl。CWindowImpl 含有所有窗口实现代码,例如:窗口类的注册,窗口的子类化,消息映射以及基本的WindowProc()函数,可以看出这与MFC的设计有很大的不同,MFC将所有的代码都放在一个CWnd类中。
还有两个独立的类包含对话框的实现,它们分别是CDialogImpl 和 CAxDialogImpl,CDialogImpl 用于实现普通的对话框而CAxDialogImpl实现含有ActiveX控件的对话框。
定义一个窗口的实现
任何非对话框窗口都是从CWindowImpl 派生的,你的新类需要包含三件事情:
1、一个窗口类的定义
2、一个消息映射链
3、窗口使用的默认窗口类型,称为window traits
窗口类的定义通过DECLARE_WND_CLASS宏或DECLARE_WND_CLASS_EX宏来实现。这辆个宏定义了一个CWndClassInfo结构,这个结构封装了WNDCLASSEX结构。DECLARE_WND_CLASS宏让你指定窗口类的类名,其他参数使用默认设置,而DECLARE_WND_CLASS_EX宏还允许你指定窗口类的类型和窗口的背景颜色,你也可以用NULL作为类名,ATL会自动为你生成一个类名。
让我们开始定义一个新类,在后面的章节我会逐步的完成这个类的定义。
- WTL学习笔记(1)
- WTL学习(1)
- WTL学习(1)
- WTL学习笔记(1)
- WTL学习(1)
- 学习wtl.1
- WTL 学习
- wtl学习
- WTL 1
- 开始学习WTL——(1)关于STL/ATL/WTL之间的区别
- WTL学习之旅(二) WTL介绍
- WTL学习之WTL窗口的实现
- WTL 学习笔记 -- ResizeDialog
- WTL 学习笔记 -- CSplitterWindow
- WTL 学习笔记 -- ActiveX
- WTL 学习笔记 -- mru
- WTL 学习笔记 -- ActiveX
- WTL 学习笔记 -- ResizeDialog
- Unix学习笔记------Stat函数与chmod函数的配合使用
- WebMatrix快捷键
- GUI(2) 迷宫问题
- RecyclerView scrollToPosition 无效的问题
- Ubuntu与windows共享键盘鼠标 - Synergy
- 学习wtl.1
- 文章标题
- 弧形显示的texview
- 多个jquery冲突
- 如何立即取消Toast
- 【FAQ】Jenkins如何添加Dashboard视图?
- 用系统导航控制器改变navigationItem的标题颜色和导航栏颜色
- 【Android入门】——模拟器的创建及常见问题汇总
- MySQL配置文件my.cnf参数优化和中文详解(转)