WTL教程(2)_WTL GUI Base Classes

Introduction to Part II

好的, 是时间开始谈论WTL了! 这部分会涵盖:基本的main frame window写法, 涵盖一些WTL改进的特性

例如:ui更新, 良好的消息映射

WTL Overview

CFrameWindowImpl, CMDIFrameWindowImpl
CButton, CListViewCtrl
CDC, CMenu
CSplitterWindow, CUpdateUI, CDialogResize, CCustomDraw
CString, CRect, BEGIN_MSG_MAP_EX

这章会较深入的讲解 框架窗口, UI特征, 实用工具类

多数是独立的类, 也有一些混合类, 例如CDialogResize.

1. 需要先声明 CSTRING, 因为在APP里, 但后面文件会用

2. 需要声明 CAppModule,因为处理进程,处理UI会用

WTL Message Map Enhancements

消息处理加强.

继承了CWindowsImpl和CDialogImpl的类, 直接用BEGIN_MSG_MAP

                    否则用BEGIN_MSG_MAP_EX

What You Get with the WTL AppWizard

Going through the wizard (VC 7)

Examining the generated code

generated code产生 3个类: CMainFrame, CAboutDlg, CWTLClockView. 名字可以看出他们的作用。

"view"类,这里严格的讲是一个普通窗口派生自CWindowImpl; 这里没有MFC的 doc/view框架。

这里也有一个—_tWinMain(), 它初始化COM普通控件_Module, 然后调用全局Run(); 

Run()创建主窗口 并且 开始消息循环。这里有一个新类CMessageLoopRun(),它包含消息循环,下一部分会讲解更多细节。

CMessageFilter是混合类,提供PreTranslateMessage()

CIdleHandler是混合类, 提供OnIdle()

CMainFrame::OnCreate(), 创建view窗口, 存储window句柄, 以至view将改变大小,当frame窗口被resize, 

OnCreate总是添加CMainFrame对象到启动CAppModule.idle和CAppModule.filters.  


UI Updating

一些共同工作的机制 来提供 进行时 UI更新: 一个CMessageLoop对象, 混合类CIdleHandlerCMainFram继承的CUpdateUI,和UPDATE_UI_MAPCMainFrame中.

CUpdateUI可以同时处理5个不同类型的元素: top-level menu items, menu items in popup menus, toolbar buttons, status bar panes, and child windows(such as dialog controls).

                      顶层菜单,  弹出菜单, 工具栏, 状态栏, 孩子窗口

对应5个常量在CUpdateUIBase中定义:

  • menu bar items: UPDUI_MENUBAR
  • popup menu items: UPDUI_MENUPOPUP
  • toolbar buttons: UPDUI_TOOLBAR
  • status bar panes: UPDUI_STATUSBAR
  • child windows: UPDUI_CHILDWINDOW

CUpdateUI 不能检查edit box

接收UI updating,需要做4件事:

  1. 派生 the frame window class from CUpdateUI and CIdleHandler
  2. CHAIN_MSG_HANDLE messages from CMainFrame to CUpdateUI
  3. Add the frame window to the module's list of idle handlers
  4. Fill in the frame window's UPDATE_UI_MAP

CUpdateUI::UIEnable 可以查看任何项目的 更新状态。

UI更新系统工作逻辑不同于MFC's ON_UPDATE_COMMAND_UI.

在MFC, 我们为每一个控件写他们自己的UI处理函数. MFC然后调用处理函数在“idle time”,或者当他打算显示菜单。

在WTL, 当一个项目的statue改变时, 我们才调用CUpadateUI方法。CUpdateUI保持跟踪UI元素和他们的statue, 在“idle time”更新或显示前。

主要不同: 触发时,MFC发给每个控件自己更新。 WTL根据 statue状态更新, 也就是不用触发改变statue就能更新。


UIEnable ( IDC_START, false )  使有效, 使无效

CMainFrame 现在需要为两个新按钮 进行处理。 处理函数会切换 菜单状态,并调用视图类方法来开启,关闭时钟。

如果是MFC,所有UI处理和ID命令处理都会完全交给View类处理。

但是在WTL,frame 和 view类 必须以某种方式交流。

menu属于frame窗口, 所以frame获得了menue-related消息, 负责acting或转交到view.

常用函数

this->UpdateLayout();    

T* pT = static_cast<T*>(this);
pT
->UpdateLayout();

posted on 2011-02-25 14:15  oleeceo  阅读(986)  评论(0)    收藏  举报

导航