WEB开发网
开发学院软件开发VC MFC程序员WTL指南(3)WTL界面基类 阅读

MFC程序员WTL指南(3)WTL界面基类

 2008-01-19 20:26:39 来源:WEB开发网   
核心提示:CFrameWindowImpl中的CreateEx()函数的参数使用了常用的默认值,所以我们不需要特别指定任何参数,MFC程序员WTL指南(3)WTL界面基类(2),正如前面介绍的,CFrameWindowImpl会处理资源的装载,如SetTimer(),这使得对窗口API的调用有点象MFC的代码,你只需要使用IDR

CFrameWindowImpl中的CreateEx()函数的参数使用了常用的默认值,所以我们不需要特别指定任何参数。正如前面介绍的,CFrameWindowImpl会处理资源的装载,你只需要使用IDR_MAINFRAME作为ID定义你的资源就行了(译者注:主要是图标,菜单和加速键表),你也可以直接使用本章的例子代码。

如果你现在就运行程序,你会看到主框架窗口,事实上它没有做任何事情。我们需要手工添加一些消息处理,所以现在是介绍WTL的消息映射宏的最佳时间。

WTL 对消息映射的增强

将Win32 API通过消息传递过来的WPARAM和LPARAM数据还原出来是一件麻烦的事情并且很容易出错,不幸得是ATL并没有为我们提供更多的帮助,我们仍然需要从消息中还原这些数据,当然WM_COMMAND和WM_NOTIFY消息除外。但是WTL的出现拯救了这一切!

WTL的增强消息映射宏定义在atlcrack.h中。(这个名字来源于“消息解密者”,是一个与windowsx.h的宏所使用的相同术语)首先将BEGIN_MSG_MAP改为BEGIN_MSG_MAP_EX,带_EX的版本产生“解密”消息的代码。

class CMyWindow : public CFrameWindowImpl<CMyWindow>
{
public:
   BEGIN_MSG_MAP_EX(CMyWindow)
     CHAIN_MSG_MAP(CFrameWindowImpl<CMyWindow>)
   END_MSG_MAP()
};

对于我们的时钟程序,我们需要处理WM_CREATE消息来设置定时器,WTL的消息处理使用MSG_作为前缀,后面是消息名称,例如MSG_WM_CREATE。这些宏只是代表消息响应处理的名称,现在我们来添加对WM_CREATE消息的响应:

class CMyWindow : public CFrameWindowImpl<CMyWindow>
{
public:
   BEGIN_MSG_MAP_EX(CMyWindow)
     MSG_WM_CREATE(OnCreate)
     CHAIN_MSG_MAP(CFrameWindowImpl<CMyWindow>)
   END_MSG_MAP()
   // OnCreate(...) ?
};

WTL的消息响应处理看起来有点象MFC,每一个处理函数根据消息传递的参数不同也有不同的原型。由于我们没有向导自动添加消息响应,所以我们需要自己查找正确的消息处理函数。幸运的是VC可以帮我们的忙,将鼠标光标移到“MSG_WM_CREATE”宏的文字上按F12键就可以来到这个宏的定义代码处。如果是第一次使用这个功能,VC会要求从新编译全部文件以建立浏览信息数据库(browse info database),建立了这个数据库之后,VC会打开atlcrack.h并将代码定位到MSG_WM_CREATE的定义位置:

#define MSG_WM_CREATE(func) \
   if (uMsg == WM_CREATE) \
   { \
     SetMsgHandled(TRUE); \
     lResult = (LRESULT)func((LPCREATESTRUCT)lParam); \
     if(IsMsgHandled()) \
       return TRUE; \
   }

标记为红色的那一行非常重要,就是在这里调用实际的消息响应函数,他告诉我们消息响应函数有一个LPCREATESTRUCT类型的参数,返回值的类型是LRESULT。请注意这里没有ATL的宏所用的 bHandled 参数,SetMsgHandled()函数代替了这个参数,我会对此作些简要的介绍。

现在为我们的窗口类添加OnCreate()响应函数:

class CMyWindow : public CFrameWindowImpl<CMyWindow>
{
public:
   BEGIN_MSG_MAP_EX(CMyWindow)
     MSG_WM_CREATE(OnCreate)
     CHAIN_MSG_MAP(CFrameWindowImpl<CMyWindow>)
   END_MSG_MAP()
   LRESULT OnCreate(LPCREATESTRUCT lpcs)
   {
     SetTimer ( 1, 1000 );
     SetMsgHandled(false);
     return 0;
   }
};

CFrameWindowImpl 是直接从CWindow类派生的, 所以它继承了所有CWindow类的方法,如SetTimer()。这使得对窗口API的调用有点象MFC的代码,只是MFC使用CWnd类包装这些API。

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

Tags:MFC 程序员 WTL

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