一、引言
学习MFC其实时间也不短了,用MFC开发的功能模块也不少,但是总感觉自己基础知识不够扎实,今天决定好好恶补一下基础知识。《Visual C++技术内幕》这本书也许没有《深入浅出MFC》出名,但是其组织结构和潘爱民老师的翻译风格都很符合我的口味,最重要的是,确实是一本好书。最近公司因为开发需要,买了一套CAD组件,这套组件是基于MFC架构,代码量更是高达50万行,开发这套组件的工程师在文档里都推荐《Visual C++技术内幕》,所以,我也义不容辞的买了一本,嘿嘿。
二、理解消息机制
自己所理解的“Windows消息循环”原理:
三、使用MFC开发应用程序过程
觉得这张图很形象,不好意思盗用一下:
四、MFC开发小技巧
我使用的是《Visual C++技术内幕》第四版。
- 学习MFC之前必须懂得Windows的消息分发机制和窗口类(Windows Classes)的概念;
- GDI是对图形显示设备的一种抽象,如图:
- 学习如何创建MFC扩展DLL和常规DLL;
- 不提倡在资源编辑器以外对RC文件进行编辑;
- 资源编辑器可以处理EXE和DLL文件,因此我们可以用剪贴板来“偷资源”,如其他Windows应用程序的位图和图标等;
- 在一个工作空间可以有多个项目;
- 使用Microsoft Spy++工具可以跟踪系统进程、线程和窗口及其响应消息的信息;
- [灵活性]在使用MFC库时,还可以在任何时候调用Win32函数,可以最大限度的使用Windows;
- WinMain函数被隐藏于应用程序框架内部;
- OnPaint()函数在3种情况下会被调用:1.应用程序刚刚运行时 2.在用户改变窗口大小时 3.窗口的全部或部分被重新显现时
- MFC利用宏来映射Windows的消息到C++类的成员函数,这种机制不需要C++作任何扩展(避免虚函数表VTable带来的开销),如图:
- 如何设置Windows环境,以便得到最快的编译速度和最佳的调试输出;
- 视图实际上是一个从MFC库中的CView类所派生出的类的对象;
- MFC库的架构保证了SDI程序可以很容易的升级为MDI应用程序;
- 在CView类中调用Invalidate()函数会触发对OnDraw()的调用;
- 使用设备环境指针pDC,就可以调用CDC的许多成员函数来完成各种各样的绘制工作;
- 如何在CView中获取CDocument的指针:CMyView* pDoc = GetDocument();
- *.rc是一个ASCII码文件,但最好不要使用文本编辑器来对它进行编辑;
- 通用资源都被保存在MFC.dll库中;
- 必须理解系统处理预编译头文件的过程;
- 理解MFC中Virtual Function和Windows Message Handler的区别;
- 应在构造函数中对类数据成员进行初始化;
- 设备坐标以像素作为绘图单位;
- 使用CDC中的LPtoDP和DPtoLP函数来进行逻辑坐标系和设备坐标系之间的转换;
- 主动调用OnPrepareDC()函数来改变设备上下文DC的属性;
五、总结
不可否认,做项目的确是提升能力最好的途径,但是,做任何事情都不能一味的忙着赶路,偶尔也要停下来思考思考,得到了什么,失去了什么,这样,才会有沉淀和更多的提升。