WEB开发网
开发学院软件开发VC ATL的GUI程序设计(4)ATL的窗口类 阅读

ATL的GUI程序设计(4)ATL的窗口类

 2006-04-11 22:54:24 来源:WEB开发网   
核心提示: 不知道你现在再看到这个类是否会少几分生疏?在这里,CWindowImpl就担任了“七色彩莲”的角色——BEGIN_MSG_MAP/END_MSG_MAP是CMessageMap由继承带来的,ATL的GUI程序设计(4)ATL的窗口类(7),B

不知道你现在再看到这个类是否会少几分生疏?在这里,CWindowImpl就担任了“七色彩莲”的角色——BEGIN_MSG_MAP/END_MSG_MAP是CMessageMap由继承带来的,BeginPaint/EndPaint是CWindow由模板和多重继承带来的,以及控制窗口样式的CWinTraits(在这里要提醒一点,在将CWinTraits作为CWindowImpl的模板参数时,一定要将CWinTraits的模板参数右尖括号与CWindowImpl的模板参数右尖括号用空格分隔开,否则凑在一起的两个右尖括号“>>”将会被编译器判断为右移操作符)是由模板带来的。

当然,我还要回答上一章遗留下来的问题:WNDCLASSEX窗口类是如何注册的?

如果你是前已经偷偷看过CWindowImpl::Create的代码,那么相信这个问题你已经知道答案了。不过我还是要把相关代码列出来:

// from CWindowImpl::Create
if (T::GetWndClassInfo().m_lpszOrigName == NULL)
  T::GetWndClassInfo().m_lpszOrigName = GetWndClassName();
ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);

也就是说,窗口类的注册是在窗口创建前完成的。

下面,李马请你注意上面代码中GetWndClassInfo的部分。这个函数是由窗口类的编写者——也就是我们,ATL的GUI开发者——完成的,它的主要功能是用来获取窗口类的属性。在通常的情况下,GetWndClassInfo使用DECLARE_WND_CLASS/DECLARE_WND_CLASS_EX的形式来实现。参看DECLARE_WND_CLASS宏的定义:

#define DECLARE_WND_CLASS(WndClassName) \
static CWndClassInfo& GetWndClassInfo() \
{ \
  static CWndClassInfo wc = \
  { \
    { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, StartWindowProc, \
     0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName, NULL }, \
    NULL, NULL, IDC_ARROW, TRUE, 0, _T("") \
  }; \
  return wc; \
}

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

Tags:ATL GUI 程序设计

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