您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
MFC程序员的WTL指南之WTL 界面基类
[文章信息]
作者:lithe
时间:2005-01-24
出处:csdnblog
责任编辑:方舟
[文章导读]
这一部分我讲的内容包括生成一个基本的主窗口和WTL提供的一些的改进
advertisement
热点推荐
· 迷你迅雷给IE下载加足马力
· 《大话李白》主题曲 Flash
· Windows操作系统小技巧荟萃(上)
· 新浪UC2005使用技巧四则
· Google 2秒钟搜索100G硬盘
[正文]

上一页  1 2 3 4 5  下一页

  从WTL的应用程序生成向导能得到什么

  WTL的发布版本附带一个很棒的应用程序生成向导,让我们以一个SDI 应用为例看看它有什么特性。

  使用向导的整个过程

  在VC的IDE环境下单击File|New菜单,从列表中选择ATL/WTL AppWizard,我们要重写时钟程序,所以用WTLClock作为项目的名字:


  在下一页你可以选择项目的类型,SDI,MDI或者是基于对话框的应用,当然还有其它选项,如下图所示设置这些选项,然后点击“下一步”:


  在最后一页你可以选择是否使用toolbar,rebar和status bar,为了简单起见,取消这些选项并单击“结束”。


  查看生成的代码

  向导完成后,在生成的代码中有三个类:CMainFrame, CAboutDlg, 和CWTLClockView,从名字上就可以猜出这些类的作用。虽然也有一个是视图类,但它仅仅是从CWindowImpl派生出来的一个简单的窗口类,没有象MFC那样的文档/视图结构。

  还有一个_tWinMain()函数,它先初始化COM环境,公用控件和_Module,然后调用全局函数Run()。Run()函数创建主窗口并开始消息循环,Run()调用CMessageLoop::Run(),消息泵实际上是位于CMessageLoop::Run()内,我将在下一个章节介绍CMessageLoop的更多细节。

  CAboutDlg是CDialogImpl的派生类,它对应于ID IDD_ABOUTBOX资源,我在第一部分已经介绍过对话框,所以你应该能看懂CAboutDlg的代码。

  CWTLClockView是我们的程序的视图类,它的作用和MFC的视图类一样,没有标题栏,覆盖整个主窗口的客户区。CWTLClockView类有一个PreTranslateMessage()函数,也和MFC中的同名函数作用相同,还有一个WM_PAINT的消息响应函数。这两个函数都没有什么特别之处,只是我们会填写OnPaint()函数来显示时间。

  最后是我们的CMainFrame类,它有许多有趣的新东西,这是这个类的定义缩略版本:

class CMainFrame : public CFrameWindowImpl<CMainFrame>,
public CUpdateUI<CMainFrame>,
public CMessageFilter,
public CIdleHandler
{
 public:
  DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)

  CWTLClockView m_view;

  virtual BOOL PreTranslateMessage(MSG* pMsg);
  virtual BOOL OnIdle();

  BEGIN_UPDATE_UI_MAP(CMainFrame)
  END_UPDATE_UI_MAP()

  BEGIN_MSG_MAP(CMainFrame)
  // ...
  CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
  CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
  END_MSG_MAP()
};

  CMessageFilter是一个嵌入类,它提供PreTranslateMessage()函数,CIdleHandler也是一个嵌入类,它提供了OnIdle()函数。 CMessageLoop, CIdleHandler 和 CUpdateUI三个类互相协同完成界面元素的状态更新(UI update),就像MFC中的ON_UPDATE_COMMAND_UI宏一样。

  CMainFrame::OnCreate()中创建了视图窗口并保存这个窗口的句柄,当主窗口改变大小时视图窗口的大小也会随之改变。OnCreate()函数还将CMainFrame对象添加到由CAppModule维持的消息过滤器队列和空闲处理队列,我将在稍后介绍这些。

LRESULT CMainFrame::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/,
LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
 m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL, |WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);

 // register object for message filtering and idle updates
 CMessageLoop* pLoop = _Module.GetMessageLoop();
 pLoop->AddMessageFilter(this);
 pLoop->AddIdleHandler(this);

 return 0;
}

  m_hWndClient是CFrameWindowImpl对象的一个成员变量,当主窗口大小改变时此窗口的大小也将改变。

  在生成的CMainFrame中还添加了对File|New, File|Exit, 和 Help|About菜单消息的处理。我们的时钟程序不需要这些默认的菜单项,但是现在将它们留在代码中也没有害处。现在可以编译并运行向导生成的代码,不过这个程序确实没有什么用处。如果你感兴趣的话可以深入CMainFrame::CreateEx()函数的内部看看主窗口和它的资源是如何被加载和创建得。

  我们的下一步WTL之旅是CMessageLoop,它掌管消息泵和空闲处理。


上一页  1 2 3 4 5  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • MFC程序员的WTL开发指南之ATL界面类
  • ATL布幔下的秘密之窗口类的秘密
  • ATL布幔下的秘密之底层技术和汇编
  • Windows 中不规则窗体的编程实现
  • ATL布幔下的秘密之模板技术
  • 寄出钱易趣说没收到 网上购物“优惠”遭质疑
  • 内地C2C网站集体对接海外 扩展两岸三地市场
  • 企业信息化时代的新兴职业:客户关系管理师
  • 诺基亚光辉岂止区区15年 CEO奥利拉不信邪
  • CN域名注册价格大跳水 将与.COM域名持平
  • 中国将制定首个国家信息化战略 年底前发布
  • 04年中国企业十大新闻揭晓 联想收购列第一
  • 跨国公司在华兴独资浪潮 欧盟与日本打头阵
  • Advertisement