




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC/C+程序设计学习笔记与心得1、const的基本用法1.1保护被限制的常量,如:const int a = 3; /*a = 4;错误1*/不能修改由const修饰的变量的值,且必须被初始化!1.2便于进行类型检查,如:const_test(const const_test & a)property1 = perty1;property2 = perty2;/*perty1 = 3;错误2*/保护引用的参数,防止意外的修改进行函数参数的保护和提醒1.3为函数重载提供参考,如:void print()/print1cout 1 endl;char print()const/print2cout 2 endl;return a;常函数可以作为区分重载的标准1.4节省空间,提高效率,避免不必要的内存分配,如:const定义的变量在内存中只保留一份拷贝,#define定义的常量却有若干份拷贝1.5修饰指针,如:int b=1;const int * const a_ptr = &b;b = 2;/正确/* (*a_ptr) = 2;错误4*/不能通过指针修改指向的值/* a_ptr = &c;错误5*/a_ptr = &b; 错/定义的常量指针,不能修改指向的地址第一个const限定不能由该指针去改变被指对象的值,第二个const限定不能改变指针所指的对象1.6修饰引用,如:const int &bb = b;b = 2;/ok/bb = 2;/error引用的对象默认就不可以修改,再加上第一个const之后,也不能通过本引用名对其进行修改1.7修饰类的数据成员必须在初始化列表中进行初始化或者在类外进行初始化,不能在构造函数的大括号里面进行初始化2、面向对象与面向过程面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。面向对象程序的基本特点:抽象、封装、继承、多态。面向对象的优点:1结构清晰。使人们的编程与实际的世界更加接近,所有的对象被赋予属性和方法,结果编程就更加富有人性化。2封装性。减小外部对内部的影响。封装将对象有关的数据和行为封装成整体来处理,使得对象以外的部分不能随意存取对象的内部属性,从而有效地避免了外部错误对它的影响,大大减小了查错和排错的难度。3 容易扩展,代码重用率高。容易扩展,在大框架不变的情况下很容易就开发出适合自己的功能,实现简单,可有效地减少程序的维护工作量,软件开发效率高。面向过程的优点:易于经常以只读的方式读取数据3、构造函数和析构函数构造函数作用:在对象被创建时利用特定的值创建对象,将对象初始化一个固定的状态。构造函数在创建时被自动调用。编译器会自动生成无参数的构造函数,但是一旦你定义了自己的构造函数,系统默认构造函数将失效拷贝构造函数作用:使用已经存在的一个对象,去初始化一个同类的新对象拷贝构造函数调用的三种情况:1、 类对象作为函数的返回值,执行完成返回时2、 类对象作为函数的形参与实参结合时3、 用类对象对另一个类对象进行赋值或初始化析构函数作用:完成对象被删除前的清理工作,释放对象所占有的内存。析构函数在对象生存期即将结束时被自动调用,且不接受任何参数构造函数调用顺序:按声明的继承顺序,然后时定义类成员实例的顺序。类内嵌则先调用内嵌对象的构造函数,然后调用本类析构函数调用顺序与其相反深拷贝和浅拷贝:若自动调用默认的拷贝构造函数是浅拷贝,与被拷贝对象共用内存若想有独立内存,必须进行深拷贝,相当于利用被拷贝对象的成员变量值重新进行构造,如:CmcArrayOfPoint2:CmcArrayOfPoint2(const CmcArrayOfPoint2 &array)cout CmcArrayOfPoint2的拷贝构造函数被调用! m_n_num = array.m_n_num;this-point_ptr = new CmcPointarray.m_n_num;for (int i=0; im_n_num-1; i+)this-get_point(i).set_xy(array.get_point(i).get_x(), array.get_point(i).get_y();前向引用声明总结:1、不能调用没有实现的类2、可以以形参形式在内联函数中使用,但不能用于类内实现3、不能在实现前涉及该类的任何细节4、指针与引用指针本身为unsigned long int类型const在前为指向常量的指针,const在*后为指针类型的常量不能声明void的类型的变量,但是可以声明使用void类型的指针,赋值时其他类型的指针可以赋值给void*,但是void指针对其他指针赋值需要进行强制类型转换。函数指针:数据类型 (*函数指针名)(形参表)【函数名本身就是函数指针】,如:void f1(int a);void f2(int a,int b);int f3(double a);void f4(double a);void (*func_ptr)(double);double d = 1.1;func_ptr = f4;(*func_ptr)(d);/func_ptr = f3;/错误!/func_ptr = f2; /错误!/func_ptr = f1;/错误!必须使用时符合函数指针声明时的返回值类型和参数类型。指向类成员函数的函数指针需要被声明为:数据类型 (类名:*函数指针名)(形参表)如:int (A:*fp)(void) = & A:get_a;int (*f)(void);/f = A:get_a; 错误!C+标准规定,不能将非静态成员函数名直接赋值给成员函数指针,必须进行取地址运算。非静态成员函数调用时也必须基于类对象,利用 .* 运算符进行调用,如:cout (Ca.*fp)() ends;对象指针是指指向对象的指针,this指针是隐含于每一个类的成员函数中的特殊指针(包括构造、析构函数),用于指向正在被操作的对象。指向非静态数据成员的指针需要被声明为 类型 (类名:*指针名)指向静态数据成员的指针需要被声明为 类型 *指针名同理,非静态的数据成员也需要建立在类对象的基础上进行访问5、静态数据成员和友元静态数据成员具有静态生存期,可以用类名:标识符进行访问,由该类的所有对象共同维护和使用必须在文件作用域对静态数据成员进行初始化,如:int CmcPoint:c_n_count = 0;/必须进行初始化定义性说明友元函数是在类中定义的非成员函数(所以也不能引用this指针),如:friend double get_length(const CmcPoint &p1,const CmcPoint &p2);/返回两个点之间的距离(友元函数)/不能用const修饰!?尽量传引用?友元函数说明如下:1)必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数*的函数原型, 友元函数的说明可以出现在类的任何地方,包括在private和public部分;2)注意友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用:指示属于哪个类,只有成员函数才使用:作用域符号;3)友元函数不能直接访问类的成员,只能访问对象成员,4)友元函数可以访问对象的私有成员,但普通函数不行;5)调用友元函数时,在实际参数中需要指出要访问的对象,6)类与类之间的友元关系不能继承。类的友元关系说明如下:(1)友元关系不可继承(2)友元关系是单向的(3)友元关系是不可传递的6、函数的重载和默认形参定义:两个以上的函数,具有相同函数名和类似的功能,但是形参的个数和类型不同,编译器在调用时对其进行自动匹配。(C+语法,C语言不支持重载)能作为重载的区分:1、 函数的形参个数2、 函数的形参类型3、 常函数的const标识符待默认形参的函数:声明时时只能从右向左缺省,而且必须给出缺省值定义时(实现时)不必给出缺省值7、运算符重载运算符重载是指对已有的运算符赋予多重含义,使得同一个运算符作用与不同类型的数据时,导致不同的行为。可以以友元函数的形式或者类成员函数的形式。不能重载的运算符:类属运算符(.) 成员指针运算符(.*) 作用域运算符(:) sizeof运算符 和三目运算符(?:)关于运算符(+,-)前置后置问题,如Clock& operator +();/前置单目运算符重载Clock& operator+(int);/后置单目运算符重载调用时像正常形式调用就行关于CString的运算符重载(声明部分):class CMyStringpublic:CMyString(int i_n_length = INIT_SIZE);/默认构造函数CMyString(const char* i_c_str);/含有一个参数的构造函数CMyString(const CMyString &i_s_str);/拷贝构造函数CMyString();/析构函数CMyString operator=(const CMyString i_s_str);/重载赋值运算符CMyString operator+(const CMyString i_s_str);/重载加法运算符CMyString operator+=(const CMyString i_s_str);/重载加等于运算符friend bool operator=(const CMyString &i_s_str1, const CMyString &i_s_str2);/重载判断是否相等运算符void show()const;/打印字符串private:char* m_c_path;/初始地址int m_n_length;/当前字符串长度int m_n_max_size;/最大的储存空间;实现部分(基于):CMyString:CMyString(int i_n_length/*INIT_SIZE*/)/默认构造函数this-m_c_path = (char*)malloc(sizeof(char) * i_n_length);this-m_c_path0 = 0;m_n_length = 0;m_n_max_size = i_n_length;CMyString:CMyString(const char* i_c_str)/含有一个参数的构造函数this-m_n_length = strlen(i_c_str);this-m_n_max_size = strlen(i_c_str);this-m_c_path = (char*)malloc(sizeof(char) * this-m_n_length);strcpy(this-m_c_path,i_c_str);CMyString:CMyString(const CMyString &i_s_str)/拷贝构造函数this-m_c_path = (char*)malloc(sizeof(char) * i_s_str.m_n_max_size);for (int i=0; im_c_pathi = i_s_str.m_c_pathi;this-m_n_length = i_s_str.m_n_length;this-m_n_max_size = i_s_str.m_n_max_size;CMyString:CMyString()this-m_c_path = NULL;this-m_n_length = 0;this-m_n_max_size = 0;CMyString CMyString:operator=(const CMyString i_s_str)free(this-m_c_path);this-m_c_path = (char*)malloc(sizeof(char) * i_s_str.m_n_max_size);this-m_n_length = i_s_str.m_n_length;this-m_n_max_size = i_s_str.m_n_max_size;for (int i=0; im_c_pathi = i_s_str.m_c_pathi;return i_s_str;CMyString CMyString:operator+(const CMyString i_s_str)CMyString c_str(this-m_n_max_size + i_s_str.m_n_max_size);c_str.m_n_max_size = this-m_n_max_size + i_s_str.m_n_max_size;c_str.m_n_length = this-m_n_length + i_s_str.m_n_length;c_str.m_c_path = (char*)malloc(sizeof(char) * c_str.m_n_max_size);strcpy(c_str.m_c_path, this-m_c_path);strcat(c_str.m_c_path, i_s_str.m_c_path);c_str.m_c_pathc_str.m_n_length = 0;return c_str;CMyString CMyString:operator+=(const CMyString i_s_str)this-m_n_max_size += i_s_str.m_n_max_size;this-m_c_path = (char*)realloc(this-m_c_path, sizeof(char) * this-m_n_max_size);this-m_c_paththis-m_n_length = 0;this-m_n_length += i_s_str.m_n_length;strcat(this-m_c_path, i_s_str.m_c_path);/需要足够的空间return (*this);void CMyString:show()const/打印字符串cout m_c_path endl;bool operator=(const CMyString &i_s_str1, const CMyString &i_s_str2)/重载判断是否相等运算符if (i_s_str1.m_c_path=NULL | i_s_str2.m_c_path=NULL)if (i_s_str1.m_c_path != i_s_str2.m_c_path)/不同时为空return false;if (i_s_str1.m_n_length != i_s_str2.m_n_length)return false;if (strcmp(i_s_str1.m_c_path, i_s_str2.m_c_path)!=0)return false;return true;微软的实现方式:char* strcpy(char * dst, const char * src)char * cp = dst;while( *cp+ = *src+ ); / Copy src over dstreturn( dst );/Microsoft 的实现方式int strcmp ( const char* src, const char* dst )int ret = 0 ;while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) & *dst)+src, +dst;if ( ret 0 )ret = 1 ;return( ret );/Microsoft 的实现方式char* strcat ( char * dst , const char * src )char * cp = dst;while( *cp )cp+; / find end of dstwhile( *cp+ = *src+ ) ; / Copy src to end of dstreturn( dst ); / return dst/Microsoft 的实现方式8、类的继承和派生构造函数和析构函数不会被继承私有继承和protected类型继承会把父类的public成员变成对应的类型,有多个基类(多继承),一个(单继承)从两个不同基类继承来的同名成员,如果不在本类进行覆盖,直接调用,将会导致二义性,编译无法通过,需要利用作用域运算符,会有两份内存分配。默认为私有继承。公有继承:public和protected类属性不变,private类被隐藏,不能直接进行调用。保护继承:public和protected类以protected类的属性出现,私有成员不能直接访问。私有继承:public和protected类以private类的属性出现,私有成员不能直接访问。构造派生类对象时,就要对基类数据成员、新增数据成员和成员对象的数据成员进行初始化。9、虚基类、虚函数、纯虚函数将继承中的共同基类设置成虚基类,这时从不同路径继承来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射,不会出现二义性。如:class CmcBird : virtual public CmcAnimal/将CmcAnimal视为虚基类class CmcHorse : virtual public CmcAnimal/将CmcAnimal视为虚基类class CmcFlyHorse : public CmcBird, public CmcHorse如果使用非默认形式的构造函数,在整个继承关系中,直接或者间接继承虚基类的所有派生类,都必须在构造函数初始化列表中给出初始化。虚函数是动态绑定的基础,且必须是非静态的成员函数。(如果认为该类会被继承,最好声明其方法为虚函数,但是需要生成虚函数列表,会一定程度上影响性能)通俗来看,如果一个基类成员函数不是虚函数的话,其派生类将该成员函数覆盖后,利用该基类的指针(或引用),即使指向(引用)的是一个派生类的实例,也只能对基类的函数进行调用。如:CmcAnimal *animal = new CmcAnimal;CmcAnimal *bird = new CmcBird;CmcAnimal *horse = new CmcHorse;animal-move();horse-move();bird-move();其中CmcBird、CmcHorse类分别继承了CmcAnimal类,并覆盖了其move()方法,如果在CmcAnimal类中,move()不是虚函数,运行结果为:如果用virtual标识符对CmcAnimal的move函数进行声明(定义时不必加),即:virtual void move();/动物的移动函数运行结果为:即基类指针分别正确调用了子类的move()方法注意:不能声明类的虚构造函数,析构函数可以,用来指向性清理抽象类是为了抽象和设计为目的建立的,不能实例化其本身,只能实例其非抽象派生类。抽象类带有纯虚函数。纯虚函数是特殊的虚函数(比虚函数还虚),声明举例如下:virtual void move() = 0;/动物的移动函数,纯虚函数,必须进行覆盖声明了纯虚函数后,基类中就不必给出其实现部分【试了一下,给出实现部分也能编译通过,但是没有任何实际意义,因为子类肯定会覆盖它】,函数体由派生类给出。因为你无法使用基类指针指向基类,如:/CmcAnimal *animal = new CmcAnimal;/error因为包含纯虚函数,因此CmcAnimal是一个抽象类所以无法通过指针调用纯虚函数在基类中的实现,因此完全没有意义。但是你可以声明抽象基类的指针指向非抽象子类,这是正确的,而且能调用正确的方法:CmcAnimal *bird = new CmcBird;CmcAnimal *horse = new CmcHorse;但是但是,如果通过这种方法:CmcHorse horse2;horse2.CmcAnimal:move();/ok!可以利用作用域进行直接调用,虽然是纯虚函数,但是可以被调用!/不过既然作为纯虚函数,有定义应该是件不适合的事情强行通过子类实例的作用域运算符对其调用,可以使用该纯虚函数!非常有趣这样做未免有点过于较劲了,而忽略了纯虚函数的抽象类的目的,只有你绝对肯定不需要使用该类的对象和其成员方法时,你才会将其声明为抽象类和纯虚函数。最后,如果一个类由抽象类派生,但没有完全重写改抽象类的所有纯虚函数,那它仍然是一个抽象类。10、模板函数与模板类利用模板可以将处理的对象的类型参数化,使得一段程序可以用于处理多种不同类型的对象。定义形式为:template inline const T& max(const T &i_t_a, const T &i_t_b, const T &i_t_c)return max(max(i_t_a, i_t_b), i_t_c);或者:template inline const T& max(const T &i_t_a, const T &i_t_b)return i_t_a i_t_b ? i_t_a : i_t_b;可以声明多参数:template void print(const T1 &t1, const T2 &t2)cout t1 endl t2 endl;print(I love Coding C+, 12.08);运行结果为:模板类:使用类模板课以为类声明一种模式,使得类的一些数据成员、函数成员的参数、返回值可以取任意类型。如:template class CmcTemplatepublic:CmcTemplate();/默认构造函数CmcTemplate(T i_t_elem);/初始化类数据的构造函数CmcTemplate(const CmcTemplate &i_c_t);/拷贝构造函数CmcTemplate();T get_elem();/得到类的成员变量void set_elem(T i_t_elem);/设置类的成员变量T2 test_t2;/测试两模板的模板类private:T m_t_elem;/类的数据成员bool is_initial;/已经初始化类成员为true,否则为false;写类的函数实现时要按照如下形式:template void CmcTemplate:set_elem(T i_t_elem)/设置类的成员变量m_t_elem = i_t_elem;is_initial = true;实例化时:CmcTemplate a(12);/用int型成员变量关于模板类实现部分和声明部分分开两个文件,需要在包含.h文件时,同时包含.cpp实现文件,因为编译时,需要给模板类生成具体的代码。注:关于模版类成员函数声明和实现的分离问题, 可参照资料出处:/share/detail/1610931111、字符串的操作C+常用于字符串操作的有3种数据类型。11.1 char*可用方法集中在中,除去strcpy(),strcmp(), strlen(), strcat()这些常用简单方法,还有一些实用方法,如:char* strdup(const char*);/相当于赋值语句char* strpbrk(const char* s1, const char* s2);/得到第一个在s2出现,也在s2中出/现的位置指针,没有返回NULLint strcspn(const char* s1, const char* s2);/得到strpbrk()中的下标char* strchr(const char*, char);/找字符串中char的位置,不存在返回NULLchar* strrchr(const char*, char);/从后向前找字符char* strstr(const char*s1, const char* s2);/找到s2在s1中的位置char* strrev(char*);/将字符串倒置char* strnset(char*, char, int n);/用n个char替代char*char* strupr(char*);/所有的小写字母变成大写char* strlwr(char*);/所有的大写字母变小写char* strerror(int);/返回对应错误值的字符串void* memcpy(void*, const void*, int);/对缓冲区进行拷贝11.2 string这是一个异常强大的类,在C+数据处理中处处发挥着重要的作用,尤其是重载的运算符较于的使用,有了很大的方便性,这里也列举出一些实用的方法。int length();/返回长度int find_first_of(const string &s, int pos = 0);/从pos开始查找当前串中第一个在串s出现的字符下标,失败返回string:nposint find_last_of(const string &s, int pos = 0);/同理,只是从后向前找string &assign(const string &s, int start, int n);/将s由start开始的n个字符赋值给当前串,at()/均可用于获取字符,at()会在越界时抛出out_of_range异常string &replace(int p0, int n0, const string &s);/实用s替代本串中由p0开始的n0个字符 string &insert(int p0, int n, char c);/在本串p0处插入n个cstring &insert(int p0, const string &s);/在本串p0处插入字符串sint find(*, int pos=0);/从pos开始找对应东西的位置注意:不能对lenght()以外的区域赋值,需用insert()11.3 CString这是MFC封装的一个类,基于char*,但是同时封装了很多实用的方法,重载了很多运算符。参照,可得/ get data lengthint GetLength() const;/ TRUE if zero lengthBOOL IsEmpty() const;/ clear contents to emptyvoid Empty();/ return single character at zero-based indexTCHAR GetAt(int nIndex) const;/ return single character at zero-based indexTCHAR operator(int nIndex) const;/ set a single character at zero-based index/*以下资料取自/lijuwen/article/details/623186*/int Compare( LPCTSTR lpsz ) const;返回值字符串一样 返回0小于lpsz返回-1 大于lpsz返回1区分大小字符int CompareNoCase( LPCTSTR lpsz ) const;返回值字符串一样 返回0小于lpsz返回-1大于lpsz返回1 不区分大小字符int Delete( int nIndex, int nCount = 1);返回值是被删除前的字符串的长度nIndex是第一个被删除的字符,nCount是一次删除几个字符。根据我实验得出的结果:当nCount要删除字符串的最大长度(GetCount() -nIndex)时会出错,当nCount过大,没有足够的字符删除时,此函数不执行。int Find( TCHAR ch ) const;int Find( LPCTSTR lpszSub ) const;int Find( TCHAR ch, int nStart ) const;int Find( LPCTSTR lpszSub, int nStart ) const;返回值不匹配的话返回-1;索引以0开始nStar代表以索引值nStart的字符开始搜索,即为包含以索引nStart字符后的字符串void Format( LPCTSTR lpszFormat, . );void Format( UINT nFormatID, . );lpszFormat一个格式控制字符串nFormatID字符串标识符LPTSTR GetBuffer( int nMinBufLength );返回值一个指向对象的(以空字符结尾的)字符缓冲区的LPTSTR指针。参数nMinBufLength字符缓冲区的以字符数表示的最小容量。这个值不包括一个结尾的空字符的空间。int Insert( int nIndex, TCHAR ch );int Insert( int nIndex, LPCTSTR pstr );返回修改后的长度,nIndex是字符(或字符串)插入后的索引号例子CString Left( int nCount ) const;throw( CMemoryException );返回的字符串是前nCount个字符。void MakeLower( );改变字符的小写void MakeReverse( );字符倒置void MakeUpper( );改变字符的大写CString Mid( int nFirst ) const;CString Mid( int nFirst, int nCount ) const;nCount代表要提取的字符数, nFirst代表要提取的开始索引位置、int CString:Remove ( TCHAR ch );返回值返回从字符串中移走的字符数。如果字符串没有改变则返回零。参数ch要从一个字符串中移走的字符。说明此成员函数用来将ch实例从字符串中移走。与这个字符的比较是区分大小写的。int Replace( TCHARchOld, TCHARchNew);int Replace( LPCTSTRlpszOld, LPCTSTRlpszNew);返回值返回被替换的字符数。如果这个字符串没有改变则返回零。参数chOld要被chNew替换的字符。chNew要用来替换chOld的字符。lpszOld一个指向字符串的指针,该字符串包含了要被lpszNew替换的字符。lpszNew一个指向字符串的指针,该字符串包含了要用来替换lpszOld的字符。说明此成员函数用一个字符替换另一个字符。函数的第一个原形在字符串中用chNew现场替换chOld。函数的第二个原形用lpszNew指定的字符串替换lpszOld指定的子串。在替换之后,该字符串有可能增长或缩短;那是因为lpszNew和lpszOld的长度不需要是相等的。两种版本形式都进行区分大小写的匹配。int ReverseFind( TCHAR ch ) const;返回值返回此CString对象中与要求的字符匹配的最后一个字符的索引;如果没有找到需要的字符则返回-1。参数ch要搜索的字符。说明此成员函数在此CString对象中搜索与一个子串匹配的最后一个字符。此函数类似于运行时函数strrchr。CString Right( int nCount ) const;throw( CMemoryException );返回的字符串是最后nCount个字符。12、windows程序执行原理在程序开始后,要先初始化应用程序,然后创建应用程序窗口。【初始化完毕】然后进入消息循环,等待并获取消息消息传入途径有两种,一种是用户输入消息,另一种为系统消息。然后得到消息要判断是否为退出程序(WM_QUIT),是的话就结束程序否则判断是否为本应用程序应该处理的信息是,则调用对应的消息处理函数进行处理,然后重新进入消息循环获取消息否,则调用默认处理函数,然后重新进入消息循环获取消息如飞信客户端登陆程序,首先运行程序后进行初始化,然后创建可视化窗口。这时进入消息队列,获取用户和系统的信息。此时给它一个登录的消息,首先程序确定不是WM_QUIT,然后判断是否需要进行处理,当然需要本应用程序处理。于是它调用登录时对应的消息处理函数,完成对应的功能后,重新进入消息队列。这时点击退出,即发送了WM_QUIT信息,则其获取后,判断需要退出,然后释放内存占用,结束程序。13、MFC程序的执行过程与所有的windows应用程序一样,MFC应用程序也有作为程序入口点的WinMain()主函数,对应WinMain.cpp中的函数AfxWinMain()MFC程序启动时,首先创建theApp对象,然后调用应用程序类对象进行初始化,然后调用AfxWinMain()主函数。在该函数中,首先调用全局函数AfxGetApp()来获取theApp的指针pApp,然后调用theApp的成员函数InitInstance()来初始化程序。在初始化过程中,还同时生成了文档(doc),视图(view),主框架窗口(frame),并生成工具栏和状态栏。在初始化最后,应用程序将收到WM_PAINT消息,框架会自动调用视图类的OnDraw()函数绘制程序客户区窗口。InitInstance()执行完毕后,AfxWinMain()将调用成员函数Run()进入消息循环队列,直到收到WM_QUIT消息。若队列中无消息,Run()将调用函数OnIdle()进行空闲时的处理。MFC首先调用CWinApp类的成员函数ExitInstance(),然后调用静态对象的析构函数,最后退出程序,交还控制权给操作系统。14、消息映射和消息处理windows消息有三种类型:14.1 标准windows信息14.1.1 键盘信息键盘信息与键的动作相关联,常见信息:WM_KEYDOWN, WM_KEYUP,WM_CHAR(输入非系统字符时产生的信息)14.1.2鼠标消息WM_MOUSEMOVE, WM_RBUTTONDOWN, WM_LBUTTONDOWN,WM_LBUTTONDBLCLICK14.1.3 窗口信息WM_PAINT当客户区产生移动或者显示事件,当用户窗户产生改变大小事件、当产生下拉菜单关闭并需要回复被恢复部分事件、当产生windows清除对话框或者消息框并需要恢复被覆盖部分事件时。处理函数原型为:afx_msg void OnPaint();WM_TIMER每当计时器触发时。处理函数原型为:afx_msg void OnTimer(UINT uIDEvent);/参数为计时器标示符14.2 控件信息指控件或其他子窗口向父窗口发送的WM_COMMAND消息,如图:14.3 命令消息由菜单项、工具栏按钮、快捷键等用户界面对象发出的WM_COMMAND消息。与MFC映射机制有关的宏有:DECLARE_MESSAGE_MAP()BENGIN_MESSAGE_CLASS(MyClass, MyBaseClass)END_MESSAGE_MAP()获取空间信息时可以使用,GetDlgItemText(ID标识符, 缓冲区地址)但是获取时是以CString的形式获取的。同样写出变量时用SetDlgItemText(ID标识符, 缓冲区地址)。仅限于本类获取。还有一种较为方便的方法,就是给空间设置监听变量,如图:这时,只需调用UpdateData(bool);即可完成数据的传递,此函数的缺省参数值为true,表示从控件向变量里面读取数据。如果函数的参数是false,则将变量中的数据写到控件中。15、文档视图结构(1)在View中获取Doc指针 C*Doc *pDoc = GetDocument();/一个viw仅有一个Doc指针(2)在App中获取MainFrame指针直接使用成员变量m_pMainWnd(3)在View中获取MainFrame指针CMainFrame *pMain = (CMainFrame*)AfxGetApp()-m_pMainWnd;(4)获得已经建立的View指针CMainFrame *pMain = (CMainFrame*)AfxGetApp()-m_pMainWnd;C*View *pView = (C*View)pMain-GetActiveView();应用程序对象文档模板对象文档对象框架窗口对象视图对象15、对话框部分基本知识建立一个对话框,初始会有CAboutDlg(帮助信息),App和Dlg三个类可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江西中医药高等专科学校《智能机器人技术》2023-2024学年第二学期期末试卷
- 重庆电讯职业学院《阿拉伯语语法》2023-2024学年第二学期期末试卷
- 北京交通职业技术学院《蜂窝移动通信》2023-2024学年第二学期期末试卷
- 达州职业技术学院《公共与市场的边界》2023-2024学年第二学期期末试卷
- 成都理工大学工程技术学院《英美文学(3)》2023-2024学年第二学期期末试卷
- 柳州工学院《录音与编辑技术》2023-2024学年第二学期期末试卷
- 湖南人文科技学院《操作系统结构分析》2023-2024学年第二学期期末试卷
- 山西能源学院《时装表演艺术4》2023-2024学年第二学期期末试卷
- 变电站冬季安全施工方案
- 2025合作共识协议合同标准版本
- 2021年四川绵竹高发投资有限公司招聘笔试试题及答案解析
- 建设工程消防验收备案抽查复查申请表
- 水费计算、水权与水价课件
- 思想道德与法治课件:第六章 第一节 社会主义法律的特征和运行
- 《康复医学》第四章 常见疾病的康复 第二节 肿瘤康复课件
- 61850报文解析-深瑞版-131016
- 2016年度高考全国3卷文综地理试题(解析版)
- 江西新定额2017土建定额说明及解释
- 国家电网有限公司十八项电网重大反事故措施(修订版)-2018版(word文档良心出品)
- 部编版三下语文《宇宙的另一边》教学课件PPT
- 《工程勘察设计收费管理规定》计价格200210号文
评论
0/150
提交评论