ATL3.0中的窗口类
扫描二维码
随时随地手机看文章
ATL3.0中的窗口类 分享到:新浪微博腾讯微博更多0 收藏 发布日期: 2004-05-11 17:52 浏览次数: 12527次 标 签: COM,ATL 文章评分: 5.0 操 作: 打印Michael Park 称号:未设置 简介:未设置 文章概要: 本文详细介绍了使用ATL实现窗口类。
摘要:讨论Active Template Library (ATL) 3.0中的一些类,这些类围绕着Windows API建立了一个面向对象的编程框架,使用这个框架,可以简化Microsoft® Windows®编程并且只需要很少的系统开销。内容包括:考察对窗口做了简单封装的CWindow类;使用CWindowImpl进行消息处理和消息映射;使用ATL中的对话框类以及扩展现有窗口类的功能的方法。
内容:
简介
CWindow
CWindowImpl
一个简单而完整的示例
消息映射
为现有的窗口类添加功能
基类消息链
窗口的超类化
窗口子类化
被包含的窗口
消息反射
ATL中的对话框类
指定窗口类的信息
结论
简介:
虽然Active Template Library (ATL)主要是为了支持COM开发而设计的,但它确实包含了很多可用于窗口设计的类。这些窗口类和ATL中的其它类一样,都是基于模版的,并且只需要花费很少系统开销。这篇文章就向我们演示了使用ATL创建窗口和对话框并进行消息处理的基本方法。
这篇文章假设读者熟悉C++语言和Windows程序设计;但是并不一定要求读者具有COM方面的知识。
CWindow:
在ATL窗口类中,CWindow是最基本的。这个类对Windows API进行了面向对象的包装,它封装了一个窗口句柄,并提供一些成员函数来操作它,这些函数包装了相应的Windows API。
标准的Windows程序设计看起来象这样:
1.
HWND
hWnd
= ::CreateWindow(
"button"
,
"Click
me"
,
2.
WS_CHILD,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
3.
CW_USEDEFAULT,
NULL, NULL, hInstance, NULL );
4.
::ShowWindow(
hWnd, nCmdShow );
5.
::UpdateWindow(
hWnd );
使用ATL中的CWindow类后,等效代码如下:
1.
CWindow
win;
2.
win.Create(
"button"
,
NULL, CWindow::rcDefault,
"Click
me"
,
3.
WS_CHILD
);
4.
win.ShowWindow(
nCmdShow );
5.
win.UpdateWindow();
我们应该在我们的大脑中我们应该保持这样一个概念:ATL的窗口对象与Windows系统中的窗口是不同的。Windows系统中的窗口指的是操作系统中维持的一块数据,操作系统靠这块数据来操作屏幕上的一块区域。而一个ATL窗口对象,是CWindow类的一个实例,它是一个C++对象,它的内部没有保存任何有关屏幕区域或者窗口数据结构的内容,只保存了一个窗口的句柄,这个句柄保存在它的数据成员m_hWnd中,CWindow对象和它在屏幕上显示出来的窗口就是靠这个句柄联系起来的。
理解了ATL中的窗口对象和Windows系统中窗口的区别,就更加容易理解CWindow对象的构造与窗口的创建是两个分开的过程。我们再看看前面的代码,就会发现,首先是一个CWindow对象被构造:
1.
CWindow
win;
然后创建它的窗口:
1.
win.Create(
"button"
,
NULL, CWindow::rcDefault,
"Click
me"
,
2.
WS_CHILD
);
我们也可以构造一个CWindow对象,然后把它和一个已经存在的窗口关联起来,这样我们就可以通过CWindow类的成员函数来操作这个已经存在的窗口。这种方法非常有用,因为CWindow类提供的函数都是封装好了的,用起来很方便,比如CWindow类中的CenterWindow, GetDescendantWindow等函数用起来就比直接使用Windows API方便得多。
01.
HWND
hWnd
= CreateWindow( szWndClass,
"Main
window"
,
02.
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
03.
<code class="plain" style="margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; float:none!important; vertical-align:baseline!important; position:static!important; left:auto!important; top:auto!important; right:auto!important; bottom:auto!important; height:auto!important; width:auto!important; line-height:1.1em!important; font-family:Consolas,Monaco,'Bitstream Vera Sans Mono','Courier Ne