摘要: 在MFC下编程,很多时候对于标准的按钮控件不是很满意,想要弄的美观些。这就需要按钮重绘。重绘按钮一般的实现方法就是重写CButton类。 首先给工程添加一个自绘按钮类MyDrawButton,基类为CButton。要想让按钮具备自绘功能,就要为按钮添加BS_OWNERDRAW属性。为类CButton重载PreSubclassWindow虚函数。在该函数中添加如下一行代码:SetButtonStyle(GetButtonStyle() | BS_OWNERDRAW); 当按钮控件具有了自绘功能之后,每次控件状态改变都会触发DrawItem函数,在该函数中来绘制按钮的形态外观,所以第二步就要重载D 阅读全文
posted @ 2013-03-17 20:58 Jamy Cai 阅读(2511) 评论(0) 推荐(0) 编辑
摘要: 在对话框重绘设计与实现过程中,一般需要绘制的对话框区域主要有标题部分、边框部分和客户区部分。具体的区域划分如下图所示。既然要对多个区域进行位图显示输出,所以我们先封装一个bmp位图显示输出函数如下:void CCTestDlg::ShowBmp(int x,int y,int w,int h,int nID){//nID 表示位图资源的ID CRect winRC; CDC* pDC=GetWindowDC(); CDC memDC; memDC.CreateCompatibleDC(pDC); BITMAPINFO bmpInfo; CBitmap bmp; GetWindowRect(&a 阅读全文
posted @ 2013-03-17 20:55 Jamy Cai 阅读(1982) 评论(0) 推荐(0) 编辑
摘要: 去年那会对MFC中对话框重绘进行了简单的了解,后来一直没有时间写,刚好现在有了博客园的自己博客,就在此写写,主要是实现对话框界面的重新自定义绘制,主要包括标题栏的重绘、对话框边框的重绘、对话框背景重绘、以及最小化按钮、最小化按钮和关闭按钮等的重绘实现,实现的编程平台是基于Microsoft Visual Studio 2008 集成开发环境,编程语言使用C++ 。源代码会在最后给出下载地址哈。好了,废话不说 ,切入正题!在对话框重绘中,使用的主要技术有两个,一个是绘制对话框的背景位图,在对话框大学改变时能够输出位图,使位图能够适应对话框的大小。另一个是在对话框的指定区域输出位图。1。绘制对话框 阅读全文
posted @ 2013-03-17 20:50 Jamy Cai 阅读(1570) 评论(0) 推荐(0) 编辑
摘要: C++中的友元包括友元函数和友元类。友元函数在前面章节类的使用中已经知道了,现在主要讨论友元类1.友元类:前面已经将友元函数用于类的扩展接口中,类并非只能友元函数的,也可以将类作为友元,即友元类。友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:friendclass类名;其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。例如,以下语句说明类B是类A的友元类:classA{…public:friendclassB;…} 阅读全文
posted @ 2013-03-17 19:38 Jamy Cai 阅读(389) 评论(0) 推荐(0) 编辑
摘要: 引言:C++的一个主要目的是代码重用,提高效率,公有继承是实现这个目的的一种机制。还有其他的机制,本部分主要介绍其他代码重用方法,一种是包含、组合或层次化,另一种是私有或保护继承,通常组合、私有继承和保护继承哟国语实现has-a关系,即新的对类将包含另一个类的对象。还有一种就是和函数模板对应的类模板。1.包含对象成员的类:包含对象的类就是这样一种类:类中包含了这样的一个类成员:本身是另一个类的对象。这种方法称为包含、组合或层次化。C++和约束:C++包含让程序员能够限制程序结构的特性——使用explicit防止单参数构造函数的隐式转换,使用const限制方法修改数据等等。这样做的根本原因是:在 阅读全文
posted @ 2013-03-17 19:36 Jamy Cai 阅读(1317) 评论(0) 推荐(0) 编辑
摘要: 1.基类与派生类:从一个类派生出另一个类时,原始类称为基类,继承类称为派生类。基本语法是:classSubClassName:publicBaseClassName{};public表示公有派生,当然也有私有派生和受保护派生(private和protected)。派生类对象包含基类对象。使用公有派生,基类的公有成员将成为派生类的公有成员,基类的私有部分也将称为派生类的一部分,但只能通过基类的公有和保护方法访问。派生类不能直接访问基类的私有成员,而必须通过基类的的类方法进行访问。派生类构造函数:(1)基类对象首先被创建(2)派生类构造函数应通过成员初始化列表基类信息传递给基类构造函数:如:Rat 阅读全文
posted @ 2013-03-17 19:35 Jamy Cai 阅读(557) 评论(0) 推荐(0) 编辑
摘要: 1.动态内存和类:类静态成员:不能在类声明中初始化类静态成员,应为声明描述了如何分配内存,但并不分配内存。类静态成员是单独存储的,而不是对象的组成部分。总而言之,静态数据成员应在类声明中声明,在包含类方法的文件中初始化,初始化时使用类作用域操作符::来指出静态成员所属的类,但静态成员如果是整型或枚举型const,则可以在类声明中初始化。隐式成员函数:C++主要提供了这些隐式成员函数:(1)默认构造函数,如果没有定义构造函数(2)复制构造函数,如果没有定义(3)赋值操作符,如果没有定义(4)默认析构函数,如果没有定义(5)地址操作符,如果没有定义复制构造函数:用于将一个对象复制到新创建的对象中, 阅读全文
posted @ 2013-03-17 19:32 Jamy Cai 阅读(417) 评论(0) 推荐(0) 编辑
摘要: 引言:本章的重点是类的设计技术,而不是通用原理1.操作符(运算符)重载:操作符重载本质(实质上)是一个函数(方法),不能重载基本类型的运行。语法为:void operator+(const classs & i);class c;c.operator+(const class & i);//说明operator+ 就是个函数即: operator+()几乎可以重载所有的c操作符,但是也有其限制,主要有以下一些限制:(1)重载后的操作符必须至少有一个操作数是用户定义类型,这将防止用户为标准类型重载操作符(2)使用操作符时不能违反操作符原来的语法规则,也不能修改操作符的优先级。(3 阅读全文
posted @ 2013-03-17 19:28 Jamy Cai 阅读(456) 评论(0) 推荐(0) 编辑
摘要: 这部分是c++升级c的主要内容,也是c++的精髓部分,c是面向过程的,而C++是面向对象的。面向对象编程(OOP)的最重要特性有:*抽象*封装和数据隐藏*多态*继承*代码的可重用性1.抽象和类:C++中的类,是一种将抽象将抽象转换为用户定义类型的C++工具(其他面向对象语言也类似,如java),它将数据表示和操纵数据的方法组合成一个整洁的包。定义类的规范有两个部分:类声明和类方法定义。类声明:以数据成员的方式描述数据部分,以成员函数(也成为方法)的方式描述公有接口。类方法定义:描述如何实现类成员函数。简单地说就是,类声明提供了类的蓝图,而类的方法定义则提供了实现细节。对类成员的控制访问:由于隐 阅读全文
posted @ 2013-03-17 19:18 Jamy Cai 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 1.单独编译:跟C语言一样,C++也允许甚至鼓励程序员将组件函数放在独立的文件中。2.程序结构:包括三部分: 头文件:包含结构声明和使用这些结构的函数的声明 源代码文件:包含与结构有关的函数的代码 源代码文件:包含调用与结构相关的函数的代码头文件常包含的内容如下: (1)函数原型 (2)使用#define或const定义的符号常量 (3)结构声明 (4)类声明 (5)模板声明 (6)内联声明3.include头文件 尖括号和双引号的区别:采用尖括号,则C++编译器将在存储标准头文件主机系统的文件系统中查找;如果采用双引号,则编译器将首先查找当前工作目录或源代码目录(或其他目录,这取决于编译器) 阅读全文
posted @ 2013-03-17 19:15 Jamy Cai 阅读(249) 评论(0) 推荐(0) 编辑
摘要: 1.内联函数:是以空间(内存空间)代价换取时间的(程序执行效率),不能使用递归。既可以用于值传递,也可以用于地址传递,而宏不能用于值传递。内联函数一般在如下情况下采用:程序中多次调用,而且函数代码执行时间较短时采用。2.引用(变量):主要用途是用作函数的形参。3.引用与指针的区别:(1)引用必须在其声明时就初始化,即必须在创建时就将它初始化,而不像指针那样,可以先声明,后初始化#include<iostream>usingnamespacestd;intmain(){intrat=100;int&shu=rat;cout<<"rat="< 阅读全文
posted @ 2013-03-17 19:10 Jamy Cai 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 1.函数原型:函数原型描述了函数到编译器的接口,也即是说它将函数返回值的类型以及参数的类型数量告诉编译器。2.指针和const:const用法有两种:一种是让指针指向一个常量对象(指针所指的内容是const),另一种是将指针本身声明为常量(指针为const)。intage=39;constint*pt=&age;intconst*pt与constint*pt是完全相同的。该声明指出,pt指向一个constint(这里是39),因此不能用pt来修改这个值,也即是说,*pt的值为const,不能被修改(不能通过*pt修改age的值),但是可以通过age修改age的值。在C++中,禁止将co 阅读全文
posted @ 2013-03-17 19:03 Jamy Cai 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 1.数组名其实是个地址。2.结构体访问成员,如果是指针则采用“->”成员操作符,如果是结构名,则采用“.”成员操作符。3.共用体(union)能够存储不同的数据类型,但是只能同时存储其中的一种数据类型。就是说,结构可以同时存储int、char和long类型,而共用体只能存储int、char或long类型。4.指针:用于存储地址的。指针名表示地址,*操作符称为间接值,或解除引用操作符.int*pointer中int*是个类型,是个指向int的指针(地址)。使用new和delete时,应遵守以下规则:(1)不要使用delete释放不是new分配的内存(2)不要使用delete释放同一内存块两 阅读全文
posted @ 2013-03-17 19:02 Jamy Cai 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 1.成语函数cout.put()是通过类对象cout来使用put()函数,提供了显示一个字符的方法,可以替代<<操作符。2.强制类型转换:intnum;longlong(num)(c++格式);转换不会修改num本身,而是创建一个新的、指定类型的值,在表达式中可以使用这个值。c++格式就是想像函数那样调用。 阅读全文
posted @ 2013-03-17 19:01 Jamy Cai 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 1.cout对象的实质:cout<<"myC++";实质上是把字符串“myC++”插入到输出流中,<<表示插入输出符。cin类似。2.在头文件中的声明是编译器要求的,在C++中,不能调用事先未声明的函数。还有一种就是将自定义函数写在main()函数之前,这样编译器才能往前查找,以便于识别。3.c++结构声明不用像c语言那样必须加typedef,只需这样:structMyStruct{}即可;使用时直接可以像使用简单类型那样使用,如:MyStructmyname{intname;charc;};个人觉得结构体应该就是c++类的前身。结构体中可以包含结构 阅读全文
posted @ 2013-03-17 19:00 Jamy Cai 阅读(192) 评论(1) 推荐(0) 编辑