摘要:
/* 根据数组创建二元查找树,再把二元查找树转变成排序的双向链表要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16转换成双向链表:4=6=8=10=12=14=16。*/第一版程序写出来如下:struct BSTreeNode *bstree2dlist(struct BSTreeNode *bt){ struct BSTreeNode *anchor = NULL; struct BSTreeNode *ret = bt; if(bt->m_pLeft != NULL)... 阅读全文
摘要:
CDialogImpl 对话框本质上是布局和行为受约束的窗口。最原始的模态对话框API是: 1: WINUSERAPI2: INT_PTR3: WINAPI4: DialogBoxParamW(5: __in_opt HINSTANCE hInstance, //applicaton instance6: __in LPCWSTR lpTemplateName,... 阅读全文
摘要:
消息链(Message chaining) 当我们一次又一次用相同的方式来处理消息时,一定想到了重用消息处理的实现。一种直接而简单的想法实现如下: 1: template <typename Deriving> 2: class CFileHandler { 3: public: 4: LRESULT OnFileNew(WORD, WORD, HWND, BOOL&); 5:... 阅读全文
摘要:
超类化 Windows窗口对象模型定义窗口类并创建窗口对象实例,和c++的对象模型十分相似。HWND之于WNDCLASSEX结构体正如同this指针之于c++的类。如果仍然按照c++的面向对象模型来进一步用于Windows,那么我们也可以延伸出继承这个特性:Windows superclassing。 超类化技术可以复制一个已有窗口类的WNDCLASSEX结构体并可赋予一个新的命名,重新给定一个W... 阅读全文
摘要:
现在分析ATL中窗口过程的实现。这部分功能在CWindowImplBaseT类中实现。 在Win32程序中,窗口过程(WndProc)是一个回调函数,且其指针保存在WNDCLASSEX结构体中,在窗口注册时传递给了操作系统。当窗口得到消息时,OS会调用窗口过程,通过一个大的switch-case语句块实现了消息的分发和处理。而在ATL中,以一种看似优雅的方式来封装这个过程。 首先,注意到在DE... 阅读全文
摘要:
典型的Win32程序可以分为这几部分:注册窗口类(WNDCLASSEX的一个实例,可认为是一个类对象);创建窗口对象(HWND hwnd来保持);创建窗口过程(WndProc,在注册窗口类时完成WndProc的注册,本质是回调函数);创建并开始消息循环(MSG对象)。 整个过程有很多繁琐和例行的步骤,而窗口部分Win32 API设计意图还是以对象模型实现的(尽管不那么完美,扁平而繁杂)。程序员天性懒惰,又喜欢新奇的tricks;c++语言的面向对象实现,模板,这一切便造就了ATL/WTL的实现。 一、 CWindow 主要作用:创建及保持窗口对象(HWND hwnd)。实现了构造、赋值、创建. 阅读全文