WEB开发网
开发学院软件开发VC MFC程序员的WTL指南(5)对话框与控件 阅读

MFC程序员的WTL指南(5)对话框与控件

 2006-07-22 22:03:31 来源:WEB开发网   
核心提示: 需要注意得一点是大多数封装类都是基于CWindow接口的,和CWindow一样,MFC程序员的WTL指南(5)对话框与控件(2),它们封装了HWND并对控件的消息进行了封装(例如,CListBox::GetCurSel()封装了LB_GETCURSEL消息),MFC通过代码禁用对话框的父窗

需要注意得一点是大多数封装类都是基于CWindow接口的,和CWindow一样,它们封装了HWND并对控件的消息进行了封装(例如,CListBox::GetCurSel()封装了LB_GETCURSEL消息)。所以和CWindow一样,创建一个控件的封装对象并将它与已经存在的控件关联起来只占用很少的资源,当然也和CWindow一样,控件封装对象销毁时不销毁控件本身。也有一些例外,如CBitmapButton, CCheckListViewCtrl和CHyperLink。

由于这些文章定位于有经验的MFC程序员,我就不浪费时间介绍这些封装类,它们和MFC相应的控件封装相似。当然我会介绍WTL的新类:CBitmapButtonCBitmapButton类与MFC的同名类有很大的不同,CHyperLink则完全是新事物。

用应用程序向导生成基于对话框的程序

运行VC并启动WTL应用向导,相信你在做时钟程序时已经用过它了,为我们的新程序命名为ControlMania1。在向导的第一页选择基于对话框的应用,还要选择是使用模式对话框还是使用非模式对话框。它们有很大的区别,我将在第五章介绍它们的不同,现在我们选择简单的一种:模式对话框。如下所示选择模式对话框和生成CPP文件选项:

第二页上所有的选项只对主窗口是框架窗口时有意义,现在它们是不可用状态,单击"Finish",再单击"OK"完成向导。

正如你想的那样,向导生成的基于对话框程序的代码非常简单。_tWinMain()函数在ControlMania1.cpp中,下面是重要的部分:

int WINAPI _tWinMain (
  HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/,
  LPTSTR lpstrCmdLine, int nCmdShow )
{
  HRESULT hRes = ::CoInitialize(NULL);
  AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES);
  hRes = _Module.Init(NULL, hInstance);
  int nRet = 0;
  // BLOCK: Run application
  {
    CMainDlg dlgMain;
    nRet = dlgMain.DoModal();
  }
  _Module.Term();
  ::CoUninitialize();
  return nRet;
}

代码首先初始化COM并创建一个单线程公寓,这对于使用ActiveX控件的对话框是有必要得,接着调用WTL的功能函数AtlInitCommonControls(),这个函数是对InitCommonControlsEx()的封装。全局对象_Module被初始化,主对话框显示出来。(注意所有使用DoModal()创建的ATL对话框实际上是模式的,这不像MFC,MFC的所有对话框是非模式的,MFC通过代码禁用对话框的父窗口来模拟模式对话框的行为)最后,_Module和COM被释放,DoModal()的返回值被用来作为程序的结束码。

上一页  1 2 3 4 5 6 7  下一页

Tags:MFC 程序员 WTL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接