博文

第三课:MFC思想(2007-09-22 12:55:00)

摘要:第三课:MFC思想 学完第一课的Windows程序运行原理及第二课经典C++知识回顾,这一课我们主要来看看MFC是如何用面向对象的方式对传统的面象过程的Windows程序运行原理代码进行封装的。 先看看第一课中的Winmain()代码 int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {        WNDCLASS wndClass;        wndClass.style=CS_HREDRAW;        wndClass.lpfnWndProc=(WNDPROC)DefWndProc;        wndClass.cbClsExtra=0;        wndClass.cbWndExtra=0;     wndClass.hInstance=hInstance;        wndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));        wndClass.hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1));        LOGBRUSH lgbr;        lgbr.lbStyle=BS_SOLID;        lgbr.lbColor=RGB(192,192,0);   &nbs......

阅读全文(4657) | 评论:0

第二课 C++经典知识回顾(三)(2007-09-22 12:37:00)

摘要:this指针: 如果成员函数Output被调用,一定是产生了一个对象实例,在这假设对象名称为a,并以a.Output形式调用的,Output的操作一定是针对对象a的。有时,成员函数需要访问它所依赖的那个对象,而不仅仅是这个对象中的其他成员。在类的成员函数中,可以用this关键字代表成员函数所依赖的那个对象的地址,所以,在成员函数中可以用this->成员的方式访问其它的成员,如CPoint(int x2,int y2)函数中用this->x2访问成员变量x2。在成员函数中,我们通常可以省略this->,直接访问类中的成员变量。在CPoint(int x2,int y2)函数中,由于函数参数变量x2,y2与成员CPoint中的成员变量x2,y2同名,要在该函数中访问成员变量x2,y2,可用this->x2,this->y2与参数变量x2,y2区分。小技巧:在以后的MFC编程中,如果在成员函数中想调用同类中的某个成员,可以使用VC++提供的自动列出成员函数功能,使用this->,VC++将列出该类中的所有成员,我们可以从列表中选择我们想调用的成员。自动列出成员函数功能,可以提高编写速度,减少拼写错误。特别是我们不能完全记住某个函数的完整拼写,但却能够从列表中辨别出该函数时,自动列出成员函数功能更是有用。事实上,在各种IDE编程环境中,我们通常都没有完全记住某些函数的完整拼写,只是记住其大概写法和功能,要调用该函数时都是从自动列出成员函数中选取的。这样能够大大节省我们的学习时间,我们没有花大量的时间去死记硬背许多函数,利用自动列出成员函数功能和帮助系统,却也能够在编程使顺利使用这些函数,等用的次数多了,也就在不知不觉中完全掌握了这些函数。   注意比较Output全局函数与Output成员函数的差别。对Output全局函数的调用,可以理解成“输出某个pt点的坐标”,是一种谓宾关系,是面向过程(或函数)Output的。对Output成员函数的调用,可以理解成“pt这个点对象执行输出动作”,是面向对象pt的。希望通过这样的比较,能够有助于读者理解c++中关于面向对象的概念。   四、类的继承与protected访问修饰符: 类是可以继承的,如果类B继承了类A,我们称A为基类(也叫父类),B为派生类(也叫子类)。......

阅读全文(4372) | 评论:0

第二课 C++经典知识回顾(二)(2007-09-22 12:34:00)

摘要:C++中提供了一套输入输出流方法的对象,它们是cin和cout,cerr,对应c语言中的三个文件指针stdin,stdout,stderr,分别指向终端输入、终端输出和标准出错输出(也从终端输出)。cin与>>一起完成输入操作,cout,cerr与<<一起完成输出与标准错误输出。例如程序main函数中使用cin为pt.x1,pt.y1输入两个整数,Output函数中使用cout连续输出字符串、整数、字符、换行。在输出中使用endl(end of line)表示换行,相当与'\n'。利用cin和cout比scanf和printf要方便得多,cin和cout可以自动判别输入输出数据类型而自动调整输入输出格式,不必象scanf和printf那样一个个由用户指定。使用cin,cout不断方便,而且减少了出错的可能性。   从类CPoint的Output成员函数的实现中,我们可以看到类中的成员函数可以直接访问同类中的成员变量,如:x1,y1,x2,y2。说明:如果成员函数中的局部变量与成员变量同名,则在局部变量的作用范围内,成员变量不起作用。如果有全局变量与成员变量同名,则在成员变量的作用范围内(所有同类成员函数中),全局变量不起作用。main函数中的if(1==1)语句部分,主要是为了说明局部变量的有效范围。局部变量的有效范围位于定义它的复合语句之中,一对{}中所定义的语句即一个复合语句。也就是说,局部变量的有效范围并不是在定义它的函数体当中,而是在外层最靠近它定义的那对{}中,main()函数中定义的第一个CPoint对象pt在if语句的}处被系统释放。   在类中使用的private和public访问修饰符,它们限定成员被访问的范围。从一个修饰符的定义处,直到下一个修饰符定义之间的所有成员都属于第一个修饰符所定义的访问类型。 以public定义的修饰符,能够被同类中的成员函数及类定义之外的所有其他函数访问,如CPoint类中的x1,y1,Output等成员变量与函数。但要注意在类之外的函数中访问类成员,必须是对象.成员的格式。 以private定义的成员,只能被同类中的成员函数中访问,不能在其他函数中访问(即使是对象.成员的格式),如类CPoint中的成员变量x2,y2能被成员函数Output访问,但不能在main......

阅读全文(4055) | 评论:0

第二课 C++经典知识回顾(一)(2007-09-22 12:33:00)

摘要:第二课:C++经典知识回顾   一、类的定义与应用 在C语言中,我们学过结构体,用于将描述某一对象的若干变量包装成一个整体使用,但没有但没有将与该对象相关的函数包含进来。C语言中的结构体只能描述一个对象的特征(属性),不能描述一个对象的动作(方法)。在C++中,我们是通过类的定义来解决这个问题的,在类的定义中,不仅可以包含变量,还可以包含函数。 我们通过一段程序来讲解类的使用。 #include "iostream.h" class CPoint { public:        int x1;        int y1;        void Output();        CPoint();        CPoint(int x2,int y2)        ~CPoint(); private:        int x2;        int y2;        int *pCount; }; //注意类和结构定义完后,一定要用";"号结尾,忘记";"是许多人常犯的错误。 //在c++中,//......用于注释一行,/*......*/可以注释多行。 void CPoint::Output() {        if(pCount)               (*pCount)++;        els......

阅读全文(4789) | 评论:0

第一课 Windows程序内部运行原理及SDK编程实现(二)(2007-09-20 20:48:00)

摘要:产生一个窗口前,也必须设计好窗口(指定窗口的那些特征)。窗口的特性是由一个WNDCLASS结构体进行定义的。参看MSDN,WNDCLASS定义如下: typedef struct _WNDCLASS {     UINT    style;     WNDPROC lpfnWndProc;     int     cbClsExtra;     int     cbWndExtra;     HANDLE  hInstance;     HICON   hIcon;     HCURSOR hCursor;     HBRUSH  hbrBackground;     LPCTSTR lpszMenuName;     LPCTSTR lpszClassName;  } WNDCLASS; style成员指定了这一类型窗口的样式。比较典型的取值有: CS_NOCLOSE,这一类型的窗口没有关闭按钮,请实验体会。 CS_VREDRAW,当改变窗口的垂直方向上的高度时,将引发窗口重画。窗口的重画过程好比汽车重新喷漆一样,汽车车身上原有的文字与图案,如"http://www.it315.org"的字样将被擦除。同样,当窗口重画时,窗口上原有的文字和图形将被擦除。如果没有指定该值,当垂直方向上拉动窗口时,窗口不会重画,窗口上原有的文字和图形将被保留。 CS_HREDRAW,当改变窗口的水平方向上的宽度时,将引发窗口重画。 CS_DBLCLKS,设置该,可以接受到用户双击的消息。 其他的设置值请参阅MSDN,在一些特殊的场合可能要用到这些置。 提示: 在我们的程序中经常要用到一类变量,这个变量里的每一位(bit)都对应某一种特性。当该变量的某位为1时,表示有该位......

阅读全文(5577) | 评论:0

第一课 Windows程序内部运行原理及SDK编程实现(一)(2007-09-20 20:43:00)

摘要:绪论   应广大学员的要求,准备将我们的讲稿编写成书籍。目前还没有完全写完,主要想让大家评价这种著述风格是否可行,希望大家多提宝贵意见,各抒己见,以便本人参考。我目前写书追求通俗易懂,知识点解释详尽,覆盖面广,把实际开发中的技巧和常见错误贯穿在文章中,几乎不给读者留下问号,在轻松中登入高雅之堂,在读书中体验实际心得。大家看看是否达到了这样的效果。 另外,在实际的VC++教学中,发现很少有真正精通了C语言编程的学员,一般都有或多或少概念不是完全清楚的问题,特别是一些需要丰富的实战经验才能体会和明白的问题,如字符串,指针,类型转换,定义指向函数的指针类型,这也是导致学习VC++困难的一个原因。下面有几个简单测试将能发现你对C语言的掌握情况。 int x=35; char str[10]; //问:strlen(str)和sizeof(str)的值分别是多少? strcpy(str,"www.it315.org"/*共13个字母*/); //问:此时x和strlen(str)的值分别是多少? str="it315.org";//编译能通过吗? char *pstr; strcpy(pstr,"http://www.it315.org"); //上句编译能通过吗?运行时有问题吗? const char *p1; char * const p2; //上面两句有什么区别吗? p1=(const char *)str; //如果是p1=str;编译能够通过吗?明白为什么要类型转换?类型转换的本质是什么? strcpy(p1,"abc");//编译能够通过吗? printf("%d",str);//有问题吗? pstr=3000;//编译能过吗?如果不行,该如何修改以保证编译通过呢? long y=(long)pstr;//可以这样做吗? int *p=str; *p=0x00313200; printf("%s",str);//会是什么效果?提示0x31对应字符'1',0x32对应字符'2'。 p=3000;//p+1的结果会是多少? char *pc=new char[100];//上述语句在内存中占据几个内存块,怎样的布局情况? void test(char **p) {    ......

阅读全文(9495) | 评论:4

张孝祥--VC++讲义之 大 纲(2007-09-20 20:40:00)

摘要:以后会逐渐把 张孝祥 这套VC++讲义发上来 希望对各位有点用 需要这套讲义的请Email联系我。 讲 义 大 纲 一.授课方式与宗旨 用形象的比喻说明复杂的问题,用实际操作与当场编程演示的方式进行讲解说明,用正反效果对比方式加速和加深学员对问题的彻底理解,将语言融入到实际工作中。让学员看着到老手一步步操作,锻炼学员的编程思想和思维,培养良好的编程习惯与查阅帮助、自我解决问题的能力,轻松掌握老手对开发工具的灵活运用和小诀窍。 二.课程安排 第一课: Windows程序运行原理及程序编写流程,窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系,使用VC++的若干小技巧,stdcall与cdecl调用规范的比较,初学者常犯错误及注意事项。我们通常不必要知晓每一个函数和消息。但另一方面,也不得不记住其中的一部分,否则很难将VC++运用自如。到底该记住哪些,这在我们的课程中都会涉及到。 第二课: C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换的内幕,虚拟函数与奇妙多态性。VC工程的编译原理与过程,将工程中不同的类拆分到不同的原文件中,每一个类由一个.h和.cpp文件共同完成,然后解决头文件重复定义问题,培养了学员良好的编程习惯,也为以后分析MFC Appwizard生成的工程奠定了良好基础。 第三课: 讲述MFC AppWizard的原理与MFC程序框架的剖析。AppWizard是一个原代码生成工具,是计算机辅助程序设计软件,Winmain在MFC程序中是如何从源程序中被隐藏的,theApp全局变量是如何被分配的,MFC框架中的几个类的作用与相互关系,MFC框架窗口是如何产生和销毁的,对窗口类的PreCreateWidow和OnCreate两个函数的着重分析,Windows窗口与C++中的CWnd类的关系。 第四课: 讲述如何运用ClassWizard及对MFC消息响应函数机制的分析,理解发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。掌握设备描述表及其封装类CDC的使用,CDC是如何与具体的设备发生关联的,融合具体的画图程......

阅读全文(6577) | 评论:1