VC++技术内幕-学习笔记

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

『VC++技术内幕』学习笔记写在前面:我看的『VC++技术内幕』版本为--潘爱民和王国印译清华大学出版的第四版,因从网上看到此版译的最好。这篇学习笔记是后补的,因为这本书我已经看到了第三十二章,之前并没有做笔记,只是随意的在书上画了画重点,可是越向后学越觉得前面的知识并没有掌握,所以决定重新来过并补上笔记。我认为只有踏踏实实的记录下每天的学习心得才能真正的有所收获。我个人认为学习这本经典之前最好先看看WINDOWS32位编程的书,至少能用纯SDK写出一些小程序。第一天:WINDOWS应用程序一定要有WinMain函数,该函数用来完成一些特殊的任务,象创建程序的主窗口,主窗口用来处理消息的代码。MFC将WinMain隐藏在框架中,不象写SDK程序时可以很容易的找到它。WINDOWS采用的消息处理机制也交给了程序框架,我们不必担心如何使这些消息和代码联系起来。并且WINDOWS定义好了一些消息,当窗口被创建时系统就会发送WM_CREATE消息,当点击鼠标左键时便系统会发送WM_LBUTTONDOWN消息,当用户按下键盘时系统会发送WM_CHAR消息,当用户关闭窗口时系统会发送WM_CLOSE消息,当用户进行菜单项选择或单击按钮时系统回发送WM_COMMAND消息,什么都不做系统还会发送WM_TIMER消息。先不说别的,先搞清出这几个消息再说。从MSDN中可以很方便的找到关于这几个消息的帮助文档。WINDOWS提供通用的图形设备接口(GUI),我们通过调用(GDI)函数和硬件打交道,不必理会设备环境,WINDOWS会自动将设备环境结构映射到相应的物理设备,这应该就是设备无关性吧。动态连接库(DLL)应该是代码重用的典型例子(不知道可不可这样说),把一些模块、自己新编的类单独调试并编译成DLL,及增加代码的可读性也提高了程序模块的灵活性。用DeveloperStudio建立项目DeveloperStudio会创建很多中间文件,这些文件还是有必要说一下的。APS//支持ResourceViewBSC//浏览器信息文件CLW//支持ClassWizardDSP//项目文件,不能删除和用文本编辑器编辑DSW//工作空间文件,不能删除和用文本编辑器编辑MAK//外部的创建文件NCB//支持ClassViewOPT//保存工作空间的配置PLG//建立日志文件这些文件都有一定的作用,拿CLW来说,如果你有一个新类,需要加到ClassWizard中,除了将相应的.h和.cpp加到DSP中还需要重新编译CLW。PLG文件记录着你的项目配置信息。VC++的源程序浏览器能够使我们从类或函数的角度来了解或编辑程序,而不是直接从文件入手。在看别人的源代码时如果能熟练的使用源代码浏览器将会事倍功半。源程序浏览器主要的查看状态有以下几种:DefinitionsandReferences——选择任何函数、变量、类型、宏定义可以看到它在项目中的定义,并且在何处和什么地方用到它。CallGraph/CallerGraph——对于所选择的函数,给出它的调用与被调用函数的图示。DerivedClassGraph/BaseClassGraph——给出类层次关系的图形表示,可以看到所选择的类的派生类和基类以及成员。FileOutline——对于所选的文件,列出文件中的类、函数和数据成员,同时还显示它们定义的位置和使用位置。可见SourceBrower比起ClassView来功能多了很多也更加好用,以前我就不知道,因为一般的VC++书没有讲或根本没有注意这块,看到讲菜单、操作界面、编辑器时总是跳过,心想“没吃过猪肉还没见过猪跑?这种东西不用学就会”。可实际上还是应该仔细的看看的。对于本章学习雷神建议大家在VC++6中用AppWizard生成一个空的程序,然后试着看看都有那些文件,和他们的类层次、函数、宏、结构的定义,我就是这样干的,学编程不动手是不行的。第二天:Microsoft基本类库应用程序框架◎MFC是C++的MicrosoftWindowsAPI,如果想要开发WINDOWS的应用程序当然VC/MFC是开发环境的首选。◎MFC产生的应用程序使用了标准化的结构。(我现在还体会不出这点的优势所在,请高手指点)◎MFC产生的应用程序短而运行速度快。这应该说的是可以很容易的建立动态连接,其实程序还是需要大量的DLL,不过由于WINDOWS上有很多可以用DLL所以应用程序很短,我是这样想的不知对否。◎VC++工具降低了编码的复杂性。这点不容质疑比起TC方便太多了。◎MFC库功能非常丰富。书上列出了MFC从1.0--4.21的一些特性,我就不废话了,大家应该看看。这一章节主要介绍了MFC库的优点,其实我本人认为在某些特定环境下其实MFC不一定就象说的那样好。我想不会有人用纯VC做MIS系统吧,太累了。我是这样理解编程序的,如果把学编程看成学武的话,C/C++语言及编程思想(OOP)是内功,API是基本功(编程思想是内功、API是基本功这适用于任何WIN32编程,不论VisualC++、Delphi、C++Builder、VB......),VC/MFC应该不同武功其中的一种,不同的学习方法效果不一样,只要下工夫也都可以达到一定的境界。真正的高手是有着深厚的内功,扎实的基本功,至于武功招数无所谓了,随便一站不丁不八全无破绽,无招胜有招了。对不住扯远了。C++可以通过类库来进行扩展,我们除了可以使用随编译器提供的类库外还可以很方便使用软件公司销售的类库产品,甚至可以自己开发。而应用程序框架是一种类库的超集,它定义了程序的结构。下面给出两个示例程序(一个是书上的一个是我写的):雷神建议:虽然现在很多书都附CD,CD上有书中所有示例的源代码,但还是应该亲自在VC6用手敲进去。这样可以加深印象以及感受一下编译除错后程序正确运行时的乐趣,因为是纯手工打造。自从我敲了近一百个代码示例后,由于笔误的BUG就很少了,打字速度也提高了。而且最好在原示例代码的基础上做些改动例如别千篇一律的显示HELLOWORLD!换点别的,这样做也可以加深对示例程序的理解。我的HELLOWORLD用AppWizard向导创建一个显示一个字符串的单文档程序,只需要敲入一行语句,主要是体验MFC的强大功能。1、打开VC++6从菜单选择NEW,给项目命名为”MyApp01“。2、选择MFCAppWizard[exe]选项,除STEP1选择单文档外其他STEP缺省。3、在ClassView选择CMyApp01View类的OnDraw()成员函数双击会在C++编译器看到以下内容voidCMyApp01View::OnDraw(CDC*pDC){CMyApp01Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahere}在//TODO:adddrawcodefornativedatahere的位置增加一行代码voidCMyApp01View::OnDraw(CDC*pDC){CMyApp01Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);pDC-TextOut(10,10,雷神愿意和所有学VC的朋友共同进步!);//-----------增加的一行//TODO:adddrawcodefornativedatahere}完了,就这么简单。编译运行。看到了吗?这个程序具备WINDOWS程序的所有特性,例如有菜单、工具条、状态栏、最大化、关闭、甚至还有关于对话框、打印预览.....全了,这就是AppWizard通过MFC动态创建的一个应用程序。从这个小例子可以看出用VC/MFC设计WINDOWS程序多么方便。下面我们看看书上的例子,以便更进一步了解应用程序框架。书上的例子:1、先建立一个Win32Application的应用程序。2、选择Project-Addtoproject-Files,分别创建一个名为MyApp.h和一个名为MyApp.cpp的文件。3、添加代码:(最好照敲以下代码到编译器,别用Ctrl+C/Ctrl+V)//***********************************************//MyApp.h//classCMyApp:publicCWinApp//见下②{public:virtualBOOLInitInstance();};classCMyFrame:publicCFrameWnd{public:CMyFrame();protected:afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);afx_msgvoidOnPaint();DECLARE_MESSAGE_MAP()};//*****************************************************//MyApp.cpp//#includeafxwin.h#includemyapp.hCMyApptheApp;//建立一个CMyAPP对象见下②BOOLCMyApp::InitInstance(){m_pMainWnd=newCMyFrame();m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();returnTRUE;}BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd)ON_WM_LBUTTONDOWN()ON_WM_PAINT()END_MESSAGE_MAP()CMyFrame::CMyFrame(){Create(NULL,MYAPPApplication);}voidCMyFrame::OnLButtonDown(UINTnFlags,CPointpoint){TRACE(EnteringCMyFrame::OnLButtonDown-%lx,%d,%d\n,(long)nFlags,point.x,point.y);}voidCMyFrame::OnPaint(){CPaintDCdc(this);dc.TextOut(0,0,HelloWorld!);}4、编译运行,报错。为什么呢?原来还没有添加MFC的支持,在ProjectSetting选项General属性页选择”UseMFCinaStaticLibrary5、再Ctrl+F5,哈成功了。让我们看看这个程序中的一些元素。①WinMain函数:并非不存在只是已经被隐藏在应用程序框架内部。②CMyApp类:CMyApp类的对象代表一个应用程序,CWinApp基类决定它的大部分行为。③应用程序的启动:当开始运行应用程序时WINDOWS会调用WinMain函数,WinMain会查找该应用程序的全局对象theApp。④CMyApp::InitInstance成员函数:发现theApp后自动调用重载的虚函数InitInstance来完成主窗口的构造和显示工作。记住这个函数。⑤CWinApp::Run成员函数:WinMain在调用InitInstance之后紧接着调用Run函数,它被隐藏在基类中负责传递应用程序的消息给相映的窗口。(我把它理解为好象SDK的窗口的过程函数不知对不对)⑥CMyFrame类:此类的对象代表着应用程序的主窗口。它的构造函数调用基类CFrameWnd的Create函数创建具体的窗口结构。⑦CMyFrame::OnLButtonDown函数:演示消息处理机制,当鼠标坐键被按下这一事件被映射到CMyFrame的OnLButtonDown函数上,如果你选择F5进行编译运行的话可以在调试窗口看到TRACE宏显示的类似下面的信息EnteringCMyFrame::OnLButtonDown-1,309,119EnteringCMyFrame::OnLButtonDown-1,408,221⑧CMyFrame::OnPaint函数:应用程序每次

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功