第二章 The WTL Way

来源:互联网 发布:软件商城开发 编辑:程序博客网 时间:2024/04/29 14:30

 

          The WTL Way

WTLCFrameWindowImpl可以让你无比轻松地创建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:

例如, 基于WTLSDI程序中的主框架窗口类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_SIZEWM_DESTROY的默认处理。

为支持WTL, 你必须在stdafx.h中包含atlapp.hatlframe.h

 

#define WIN32_LEAN_AND_MEAN

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

#include <atlframe.h>

 

头文件atlapp.h 定义了CAppModule结构, 它继承自ATLCComModule并添加了对可变数量的消息映射的支持. 头文件atlframe中定义了CFrameWindowImpl, 创建WTLSDI窗口, 我们只需要创建一个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消息路由机制的时候会详细解释CMessageLoopCAppModule.

到此为止应用WTL, 我们的SDI应用程序看起来像Figure 5a 所示.

 

                Figure 5a: SDI Application using WTL

 

我们尽量使我们的代码简单的同时增加了一点新特性: 工具条. 然而, 添加的都是老式的工具条和菜单条. 用户希望看到的是精美的命令条控件, 就像MS OfficeIE中看到的一样.

In Command with Command Bars

 

To be continued...   

 

原创粉丝点击