VC++的那些事儿

  因为项目需求,需要本人学习VC++ 6.0 MFC框架来开发项目模块。在本人学习完了MDI应用开发过程中,对使用VC++的开发有一点初步的心得,总想说点事儿给后来者,可以帮助他们在学习过程中得到启发和帮助。
   因为我是一个Java程序员,所以学习C++时比较容易理解,同时也比较顺利。但是,当我学习VC++的MFC框架的开发时,我发现就像当初学习EJB 2.0开发一样,非常“痛快”--所谓“痛快”就是先“痛苦”,然后再“快乐”!因为,这个VC++并不是一个纯粹的C++语言,并且VS 6.0这个IDE并不像我想像那样“自动化”(因为我看见本中心学习.Net的学生常常说什么“程序自动怎么怎么的。。。”,让本人误以为MS的产品都是M6“全自动武器”!其实,当你用了VS 6.0之后,你就知道什么是“半自动武器”了--其实,本人觉得VS 6.0连半自动武器都不算,它只是一个搭MFC框架的简陋帮助工具而已--几乎什么都要自己写,有点类似于Java中的Ant构建工具--只需要记事本和JDK就可以开发的工具)。
  另外MFC框架也非常复杂--当然相对于使用纯C语言进行Win32编程方式是比较简单的!因为本人的自我感觉OO的思想不错,并且框架思想也不错,所以选择学习MFC框架开发(在这里我向使用C语言进行Windows编程的程序员们致敬,因为可能有一天我会进一步学习使用C语言来进行Windows编程)。
  好了言归正传,本人觉得学习VC++6.0应用开发应该具有如下条件:第一、必须学会C++语言,第二,必须具有OO的思想,第三,必须熟习VS 6.0开发环境。学习VC++如果不会C++语言,那么不可能看懂VC++代码中的语法,那么这是一个必要条件;学习VC++如果没有OO的思想,那么当然不能理解MFC框架,那么这也是一个必要条件;学习VC++如果不会VS 6.0这个工具,那么当然你是“牛人”--使用记事本开发MFC的“牛人”!所以,这不是一个必要条件--当然只是本人觉得的必要条件。当我学习完了SDI应用开发时,我觉得VS 6.0生成的代码非常恶心,而且觉得《VC++编程内幕》一书中的示例代码比较不OO,所以在学习MDI应用开发时,决定根据自己对OO的认识,对MFC的MDI应用进行OO的改造一下--把对集合CObList的操作--集合的移动、新增和删除功能--封装成一个类CStudentPersistence中,然后把这个类与MFC框架生成的View类和Document文档类双向关联,就是根据Java中的OO风格来编写VC++程序。但是,当我编译通过,并且连接通过之后,在运行应用时却出现了许多让我“痛苦”的Bug调试。在调试VC++程序之后,我才发现Java的e.printStackTrace()是多么的伟大,它让我们Java程序员可以非常轻松的找出bug,而这个VC++只有TRACE宏可以使用,运行时错误就是某某内存地址出错!!!真是“爽死你”!
  怎么解决这个问题?怎样有效的解决问题?这是我一直思考的问题。根据自己的经验,即然我学习MFC框架开发,那么当然必须熟练掌握这个MFC的流程,就像当年学习EJB框架开发一样。我们觉得MFC和EJB一样是一种“硬性框架”(或者说重量级框架),不允许我可以很轻易的破Java中的轻量级框架(比如SSH等)进行开发--或者说,不可能让我随心所欲的写代码!下面是我根据“技术内幕”一书,然后结合自己的实践总结了一下MFC的框架的生命周期:
1.Windows操作系统装载我们的应用到内存
2.在装载我们的应用时创建全局对象theApp
3.Windows操作呼叫全局函数WinMain
4.WinMain寻找CWinApp类的实例
5.WinMain呼叫MyWinApp的InitInstance函数
6.InitInstance函数装载文档对象、显示主框架和视图窗体
6.1.应用创建CMyDocument对象
6.2.应用创建CMyView对象
6.3.应用呼叫CMyView::OnCreate方法(如果影射了的话)
6.4.应用呼叫CMyDocument::OnNewDocument方法
6.5.应用呼叫CMyView::OnInitialUpdate函数
   6.5.1.初始化View对象
   6.5.2.验证View窗体对象
   6.5.3.呼叫CMyView::OnDraw方法
7.WinMain呼叫theApp的run方法,然后处理Windows的消息和命令消息分发循环
8.用户编辑数据时CMyView的函数更新CMyDocument成员变量
9.用户退出应用时应用销毁CMyView对象,然后销毁CMyDocument对象
这里关键是记住三个方法:CMyWinApp的InitInstance方法、CMyDocument的OnNewDocument方法、CMyView的OnInitialUpdate方法的从上到下的顺序。因为它是重量级框架,所以它不允许我使用CStudentPersistence类与MFC框架生成的文档类与视图类有双向关联的关系,所以我们只有改成单向的依赖关系,在这做这样的调整之后,bug少了一半。因为bug无非就是语法错和逻辑错,当我的框架逻辑没有错时,这时我们考虑VC++的语法错了,接着就是具体C++代码调试,这里比较麻烦就是栈指针和堆指针的理解。比如,保存CStudent到CObList集合中,CStudent类必须使用堆指针,否则程序会问题。以及,CStudent类要实现序列化时必须重写Serialize方法,否则在反序列化时集合中不会有数据等一个问题一个问题调试解决。当我按照这种思路写出自己OO想法的MDI示例程序时,我非常喜悦--一种久违的感觉!
  总结,学习VC++一定要首先熟悉MFC框架的生命周期,然后是必须熟悉VC++语法,这样你学习VC++编程时应该比较轻松。另外,学习C++/VC++开发,可以让Java程序员理解底层的东西,因为我们是针对OS进行编程的,而不是针对JVM编程。同时,我发现Java语言真的是比较简单的语言,它只需要OO的思想建立了,那么就可以写出优雅而自由的程序。在这里我要感谢Sun公司十五年的努力给我们Java程序员提供了自由的编程“天空”!
   -- I love you Java and I love code!

Thanks for reading!

                                           AZ

你可能感兴趣的:(java,编程,框架,mfc,语言,vc++)