使用SDK实现MFC模式的处理方法(一)
2008-09-30 17:07
609 查看
一.起子 没有,想用SDK而已, 程序看的清爽. 讨厌mfc许多麻烦的代码.有时候明明很简单,却只好用mfc,不爽.二.构想 如果你尝试模仿mfc, 你就会发现似乎有一道过不去的坎, 你想实现自己的CWnd, CDialog, 可是发现很难实现复用. 因为你的"CWnd,CDialog"似乎必须要有一个尾巴, 这个尾巴就是WndProc, 一个被要求是__stdcall 的函数. 假设,你实现了你的基类: CMyWindow, 然后你的程序中有两个窗口: CPigWnd 和 CWolfWnd. 你如何使用一个WndProc来处理两个窗口? 你的基类设计也已经失败了. 实际上,mfc使用了一种 很麻烦的技术实现如何让每一个类只与一个窗口句柄想关联, 而mfc只有一个WndProc,叫什么AfxWndProc之类的, 在这个AfxWndProc中, 他会检查 HWND hwnd 参数, 然后通过 FromHandle() ,使hwnd 转换为CWnd, 然后才调用CWnd类的消息处理函数. 这个是非常麻烦的过程, 想想看MFC把hwnd都存在一个表格中, 然后需要的时候通过HashTable来定位. 从这点看,不得不说SDK的实现非常优雅,准确的说,很纯洁. 其实在::CreateWindowEx 中有一个 LPVOID lpParam参数,允许用户传递一个值和hwnd捆绑起来, 许多人就这样实现了捆绑.如果真的那么完美就好了, 可问题是这个参数只在WM_CREATE消息时才传递出来, 也就是说只有在这个时候CMyWindow才有机会和句柄绑定, 可是在WM_CREATE之前的消息对于CMyWindow来说都不可见(尽管这些消息也许并不重要,可是最为一个基类,这样的缺陷还是致命的)
怎么办? 如果有一个WndProc能有一个this指针,指向各自的类,那该有多好啊~ 这是一个称为动态函数的技术, 1.我们事先制造一个WndProc的模板,里面有一个叫pThis的指针,他有一个特征值. 2.CMyWindow在构造时, 复制WndProc的模板, 然后把pThis的值,改写成CMyWindow实例的this指针. 3.在CreateWindow时, WNDPROC 就使用CMyWindow的WndProc.通过这几步, 很完满的实现了句柄与类的绑定, 相信也比MFC的实现清晰许多,(我一直觉得,MFC是M$的技术人员卖弄技术的产品)
怎么办? 如果有一个WndProc能有一个this指针,指向各自的类,那该有多好啊~ 这是一个称为动态函数的技术, 1.我们事先制造一个WndProc的模板,里面有一个叫pThis的指针,他有一个特征值. 2.CMyWindow在构造时, 复制WndProc的模板, 然后把pThis的值,改写成CMyWindow实例的this指针. 3.在CreateWindow时, WNDPROC 就使用CMyWindow的WndProc.通过这几步, 很完满的实现了句柄与类的绑定, 相信也比MFC的实现清晰许多,(我一直觉得,MFC是M$的技术人员卖弄技术的产品)
相关文章推荐
- 安卓开发中,在低版本SDK使用高版本的API会报错。一般处理方法是换一种实现方法,或者在高版本SDK中使用高版本API,低版本SDK中使用效果可能会差点的折衷方案;后者可以用如下技巧来实现。
- SpringMVC(27):json数据的传递处理的示例(实现功能:使用jQuery框架的ajax()方法实现用户信息查看)
- 使用等待对象的方法,实现多线程的同步处理。。
- Android使用百度定位SDK方法及错误处理
- python中的__new__方法与__init__方法区别与调用;通过使用__new__实现单例模式
- python中getattr函数使用方法 getattr实现工厂模式
- Python使用logging结合decorator模式实现优化日志输出的方法
- 使用Decorate模式实现留言版词汇处理
- 【代码】Android 使用百度定位SDK 方法及处理错误
- 在MFC GridCtrl中使用CGridCellCheck类根据GetCheck()状态做不同处理的实现
- 五星-原型模式常使用于以下场景--而JAVA中的任何类只要实现了Cloneable标识接口,就可以使用clone方法来进行对象的拷贝
- Python使用logging结合decorator模式实现优化日志输出的方法
- 使用思事标签,实现包含GTD模式的一种方法
- 模式识别初体验——模式识别中要处理的问题以及使用的方法
- IE11兼容模式内信息空白 无法使用的处理方法
- PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
- Python中使用多进程来实现并行处理的方法小结
- 使用模板方法模式实现选择题答题 C++
- Android使用百度定位SDK 方法及错误处理