第二章 The WTL Way
来源:互联网 发布:软件商城开发 编辑:程序博客网 时间:2024/04/29 14:30
The WTL Way
WTL的CFrameWindowImpl类可以让你无比轻松地创建SDI窗口程序。Figure 4显示了WTL SDI窗口框架结构。
Figure 4: WTL’s SDI Windowing Hierarchy
CFrameWindowImpl类继承自CFrameWindowImplBase因此也就拥有了标准应用程序主框架窗口的一切功能.下面具体列出使用WTL创建的主框架窗口时支持的特性: 1) 工具条, 菜单栏, 状态栏, 复合控件(rebars) 2) 基本的视图控制, 当主框架窗口大小变化时, 视图自动同步调整大小 3) 复合控件区间(Rebar band)控制, 增加区间或调整区间大小 4) 图案菜单Chevron menu 5) 键盘加速键Keyboard accelerators 6) 工具按钮上的工具提示(Tooltips) 7) 状态栏显示帮助字符串 8) 显示框架图标
为了创建SDI应用程序, 你需要:
1) 从 CFrameWindowImpl派生自己的框架窗口类
2)添加WTL DECLARE_FRAME_WND_CLASS宏, 并指定工具条和菜单的资源ID
3)添加消息映射和相应的消息映射函数,并使用CHAIN_MSG_MAP()把消息映射路由到框架窗口基类
For example, you can write our simple SDI example CMainFrame class using WTL like so:
例如, 基于WTL的SDI程序中的主框架窗口类CMainFrame看起来像这个样子:
public:
DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)
BEGIN_MSG_MAP(CMainFrame)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
COMMAND_ID_HANDLER(ID_FILE_EXIT, OnFileExit)
COMMAND_ID_HANDLER(ID_HELP_ABOUT, OnAbout)
CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
END_MSG_MAP()
LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&) {
// Create the Toolbar and set
// CFrameWindowImplBase::m_hWndToolBar
CreateSimpleToolBar();
// And the statusbar
CreateSimpleStatusBar();
return 0;
}
LRESULT OnFileExit(WORD,WORD wID, HWND,BOOL&) {
SendMessage(WM_CLOSE); // Frame knows to PostQuitMessage
return 0L;
}
…
};
DECLARE_FRAME_WND_CLASS宏设定了框架窗口的通用资源ID(包括默认定制的菜单条, 工具条等等).你可以有选择地把同一个资源ID应用于框架窗口的标题字符串资源, 菜单资源, 加速键资源, 图标资源和工具条资源. WTL在创建框架窗口过程中检查这一通用ID对应的各个资源, 然后自动加载相应的资源. 唯一的例外是你必须调用CreateSimleToolBar() 成员函数手动加载工具条资源, 而状态条不需要资源.
消息映射中的CHAIN_MSG_MAP宏把消息映射路由至框架窗口基类CFrameWindowImpl, 其中提供乐对WM_SIZE和WM_DESTROY的默认处理。
为支持WTL, 你必须在stdafx.h中包含atlapp.h和atlframe.h:
#define WIN32_LEAN_AND_MEAN
#include <atlbase.h>
#include <atlapp.h>
extern CAppModule _Module;
#include <atlwin.h>
#include <atlframe.h>
头文件atlapp.h 定义了CAppModule结构, 它继承自ATL的CComModule并添加了对可变数量的消息映射的支持. 头文件atlframe中定义了CFrameWindowImpl类, 创建WTL的SDI窗口, 我们只需要创建一个CMainFrame的对象实例, 并在WinMain() 中调用它的成员函数CreateEx() 创建窗口.
CAppModule _Module;
int APIENTRY WinMain(…) {
::InitCommonControls();
_Module.Init(NULL, hInstance);
CMainFrame wndMain;
wndMain.CreateEx();
wndMain.ShowWindow(nCmdShow);
wndMain.UpdateWindow();
CMessageLoop theLoop;
_Module.AddMessageLoop(&theLoop);
int nRet = theLoop.Run();
_Module.RemoveMessageLoop();
_Module.Term();
return nRet;
}
成员函数CreateEx() 调用基类成员函数CWindowImpl::Create(), 加载与通用资源ID对应的资源. CMessageLoop类对象取代了消息循环. ATL允许每个线程有一个消息循环, Multi-SDI就是据此实现的. 在第二部分学习WTL消息路由机制的时候会详细解释CMessageLoop和CAppModule类.
到此为止应用WTL, 我们的SDI应用程序看起来像Figure 5a 所示.
Figure 5a: SDI Application using WTL
我们尽量使我们的代码简单的同时增加了一点新特性: 工具条. 然而, 添加的都是老式的工具条和菜单条. 用户希望看到的是精美的命令条控件, 就像MS Office和IE中看到的一样.
In Command with Command Bars
To be continued...
- 第二章 The WTL Way
- The Ruby Way 第二版 第一章学习笔记
- OI赛第二场t1Last mile of the way
- the (?) Way
- the way
- Actors in Scala(Scala中的Actor)(预打印版) 第二章 Messages All the Way Up (A)
- Actors in Scala(Scala中的Actor)(预打印版) 第二章 Messages All the Way Up (B)
- Actors in Scala(Scala中的Actor)(预打印版) 第二章 Messages All the Way Up (C)
- Actors in Scala(Scala中的Actor)(预打印版) 第二章 Messages All the Way Up (D)
- The WTL wiki
- clearcase on the way!
- The way we present
- Notes on the Way
- windbg the easy way
- The way of Winning.
- windbg the easy way
- The Ruby Way
- the way to expert
- 系分考试
- 因以下文的损坏或丢失windows/system32/config/system 解决方法
- 我的程序
- GridView 后台排列 Column 、 用户自定义GridView 显示、GridView的PreRender ,Init,Load 方法
- Using Internet Explorer from .NET
- 第二章 The WTL Way
- 实现iFrame自适应高度
- Microsoft Windows CE 编程的十点忠告
- open和release
- 浅尝DotNetNuke
- WinCE开发常识
- CMOS设置跳过键盘检测
- C# 文件操作(上传 下载 删除 文件列表...)(转)
- 开发windows ce 程序一定要掌上电脑吗...