一、常用的C++MFC类
1、CString
1)字符串连接能体现出 CString 类型方便性特点的一个方面就是字符串的连接,使用 CString 类型,你能很方便地连接两个字符串,正如下面的例子:
CString gray("Gray");
CString cat("Cat");
CString graycat = gray + cat;
//then graycat="GrayCat"
2)字符串输入输出以及将数字格式化
CString s;
s.Format(L("The total is %d"),total); //注意此处的“”
用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。
格式化是一种把其它不是字符串类型的数据转化为CString类型的最常用技巧,比如,把一个整数转化成CString类型,可用如下方法:
CString s;
s.Format(L("%d"),total);
3)成员函数
>>构造函数
CString(const CString& stringSrc);
将一个已经存在的CString对象stringSrc的内容拷贝到该CString对象。例如:
CString str1(L(jizhuomi)); // 将常量字符串拷贝到str1
CString str2(str1); // 将str1的内容拷贝到str2
CString(LPCTSTR lpch,int nLength);
将字符串lpch中的前nLength个字符拷贝到该CString对象。例如:
CString str(L("wwwjizhuomi"),3); // 构造的字符串对象内容为"www"
CString(TCHAR ch,int nLength = 1);
使用此函数构造的CString对象中将含有nLength个重复的ch字符。例如:
CString str(L(‘w‘),3); // str为"www"
>>CString类的大小写转换及顺序转换函数
多个CString对象的连接可以通过重载运算符+、+=实现。例如:
CString str(_T("jizhuomi")); // str内容为"jizhuomi"
str = _T("www") + str + _T("-"); // str为"wwwjizhuomi-"
str += _T("com"); // str为wwwjizhuomi-com
>>CString对象的比较
CString对象的比较可以通过==、!=、<;、>;、<=、>=等重载运算符实现,也可以使用Compare和CompareNoCase成员函数实现。
int Compare(PCXSTR psz) const;
将该CString对象与psz字符串比较,如果相等则返回0,如果小于psz则返回值小于0,如果大于psz则返回值大于0。
int CompareNoCase(PCXSTR psz) const throw();
此函数与Compare功能类似,只是不区分大小写。
例如:
CString str1 = _T("JiZhuoMi");
CString str2 = _T("jizhuomi");
if (str1 == str2)
{
// 因为str1、str2不相等,所以不执行下面的代码
...
}
if (0 == str1.CompareNoCase(str2))
{
// 因为不区分大小写比较时,CompareNoCase函数返回0,所以执行下面的代码
...
}
>>CString对象字符串的提取操作
CString Left(int nCount) const;
提取该字符串左边nCount个字符的子字符串,并返回一个包含这个子字符串的拷贝的CString对象。
CString Right(int nCount) const;
提取该字符串右边nCount个字符的子字符串,并返回一个包含这个子字符串的拷贝的CString对象。
CString Mid(int iFirst,int nCount) const;
提取该字符串中以索引iFirst位置开始的nCount个字符组成的子字符串,并返回一个包含这个子字符串的拷贝的CString对象。
CString Mid(int iFirst) const;
提取该字符串中以索引iFirst位置开始直至字符串结尾的子字符串,并返回一个包含这个子字符串的拷贝的CString对象。
例如:
CString str1 = _T("jizhuomi");
CString str2 = str1.Left⑶; // str2为"jiz"
str2 = str1.Right⑵; // str2为"mi"
str2 = str1.Mid(1,3); // str2为"izh"
str2 = str1.Mid⑸; // str2为"omi"
>>CString对象字符串的查找操作
int Find(PCXSTR pszSub,int iStart=0) const throw();
int Find(XCHAR ch,int iStart=0) const throw();
在CString对象字符串的iStart索引位置开始,查找子字符串pszSub或字符ch第一次出现的位置,如果没有找到则返回-1。
int FindOneOf(PCXSTR pszCharSet) const throw();
查找pszCharSet字符串中的任意字符,返回第一次出现的位置,找不到则返回-1。
int ReverseFind(XCHAR ch) const throw();
从字符串末尾开始查找指定的字符ch,返回其位置,找不到则返回-1。这里要注意,尽管是从后向前查找,但是位置的索引还是要从开始算起。
CString str = _T("jizhuomi");
int nIndex1 = str.Find(_T("zh")); // nIndex1的值为2
int nIndex2 = str.FindOneOf(_T("mui")); // nIndex2的值为1
int nIndex3 = str.ReverseFind(_T(‘i‘)); // nIndex3的值为7
>>CString类对象字符串的替换与删除
int Replace(PCXSTR pszOld,PCXSTR pszNew);
用字符串pszNew替换CString对象中的子字符串pszOld,返回替换的字符个数。
int Replace(XCHAR chOld,XCHAR chNew);
用字符chNew替换CString对象中的字符chOld,返回替换的字符个数。
int Delete(int iIndex,int nCount = 1);
从字符串中删除iIndex位置开始的nCount个字符,返回删除操作后的字符串的长度。
int Remove(XCHAR chRemove);
删除字符串中的所有由chRemove指定的字符,返回删除的字符个数。
例如:
CString str = _T("jizhuomi");
int n1 = str.Replace(_T(‘i‘),_T(‘j‘)); // str为"jjzhuomj",n1为2
int n2 = str.Delete(1,2); // str为"jhuomj",n2为6
int n3 = str.Remove(_T(‘j‘)); // str为"ihuom",n3为1
>>CString类的格式化字符串方法
使用CString类的Format成员函数可以将int、short、long、float、double等数据类型格式化为字符串对象。
void __cdecl Format(PCXSTR pszFo rmat,[,argument]...);
参数pszFormat为格式控制字符串;参数argument可选,为要格式化的数据,一般每个argument在pszFormat中都有对应的表示其类型的子字符串,int型的argument对应的应该是"%d",float型的应对应"%f",等等。
例如:
CString str;
int a = 1;
float b = 2.3f;
str.Format(_T("a=%d,b=%f"),a,b); // str为"a=1,b=2.300000
>>将char*类型的字符串转换为CString类型
char* 转化为 CString
你有一个 char* 类型的数据,或者说一个字符串。怎么样创建 CString 对象呢?这里有一些例子:
char * p = "This is a test";
或者像下面这样更具有 Unicode 意识:
TCHAR * p = _T("This is a test")
或
LPTSTR p = _T("This is a test");
你可以使用下面任意一种写法:
CString s = "This is a test"; // 8-bit only
CString s = _T("This is a test"); // Unicode-aware
CString s("This is a test"); // 8-bit only
CString s(_T("This is a test")); // Unicode-aware
CString s = p;
CString s(p);
用这些方法可以轻松将常量字符串或指针转换成 CString。需要注意的是,字符的赋值总是被拷贝到
CString 对象中去的,所以你可以像下面这样操作:
TCHAR * p = _T("Gray");
CString s(p);
p = _T("Cat");
s += p;
结果字符串肯定是"GrayCat"。
2、CPect
>>CRect成员函数
Width 计算CRect的宽度
Height 计算CRect的高度
Size 计算CRect的大小
TopLeft 返回CRect的左上角点
BottomRight 返回CRect的右下角点
CenterPoint 返回CRect的中心点
IsRectEmpty 确定CRect是否是空的。如果CRect的宽度和/或高度为0,则它是空的
IsRectNull 确定CRect的top,bottom,left,和right是否都等于0
PtInRect 确定指定的点是否在CRect之内
SetRect 设置CRect的尺寸
SetRectEmpty 设置CRect为一个空的矩形(所有的坐标都等于0)
CopyRect 将一个源矩形的尺寸拷贝到CRect
EqualRect 确定CRect是否等于给定的矩形
InflateRect 增加CRect的宽度和高度
DeflateRect 减少CRect的宽度和高度
NormalizeRect 使CRect的高度和宽度返回规范
OffsetRect 将CRect移动到指定的偏移
SubtractRect 从一个矩形区域中减去一个矩形
IntersectRect 设置CRect等于两个矩形的交集
UnionRect 设置CRect等于两个矩形的并集
>>CRect运算符
operator LPCRECT 将一个CRect转换为一个LPCRECT
operator LPRECT 将一个CRect转换为一个LPRECT
operator = 将一个矩形的尺寸拷贝到CRect
operator == 确定CRect是否与一个矩形相等
operator != 确定CRect是否不等于另一个矩形
operator += 使CRect增加指定的偏移,或使CRect放大
operator -= 从CRect中减去指定的偏移,或缩小CRect
operator &= 设置CRect等于CRect和某个矩形的交
operator |= 设置CRect等于CRect和某个矩形的并
operator + 增加给定偏移量到CRect,并返回得到的CRect对象
operator - 从CRect中减去给定偏移量,并返回得到的CRect对象
operator & 创建CRect与某个矩形的交,并返回得到的CRect对象
operator | 创建CRect与某个矩形的并,并返回得到的CRect对象
默认坐标系:原点为左上角,右边为x轴正方向,下边为y轴正方向。
还有很多实例,在此不再详细介绍
3、CPen
实例:
CPen pen1;
CPen *oldPen;
pen1.CreatePen(PS_SOLID,2,RGB(192,192,192));//创建对象
oldPen = pDC->SelectObject(&pen1);//将画笔选入设备描述表,并保存旧的画笔
4、CImage
>>保存图片
保存图片只有一个函数,就是Save函数,该函数有两个参数,一个是文件的完整路径和文件名,一个是文件的扩展名。但是如果只有保存和显示图片功能,CImage的Save函数发挥不了太大的作用,不过是一个转存文件的工具。CImage的强大之处在于可以对图片进行修改,再进行保存。
修改图片的函数有这么3个函数可以修改图片,都是像素级的操作。这三个函数分别为SetPixel,SetPixelRGB,SetPixelIndexed。可以通过双重循环对屏幕进行逐点扫描,并把像素颜色值保存到CImage对象中达到截屏的目的。
我们可以用一段很简单的代码来实现将DC(设备上下文)里绘制的图形存入图片文件中。基本的思想是先初始化一个CImage对象,再为它设定大小和位数,也就是图片大小和图片的色彩总数,再用设备上下文绘图。绘制完图形后再建立另外一个设备上下文对象,称为目的DC,将之前绘图的DC称为源DC,目的DC必须与CImage对象关联起来,然后利用BitBlt函数和其他函数将绘图DC的内容拷贝到目的DC中,最后将CImage对象保存到文件中,以下是代码实现(VS2010支持中文变量名):
CRect rect;
this->GetClientRect(rect);
CImage image;
image.Create(rect.Width(),rect.Height(),24);
CDC* DCpoint=this->GetDC();
DCpoint->Ellipse(20,20,200,200);
CDC dstDC;
dstDC.CreateCompatibleDC(DCpoint);
dstDC.SelectObject(image);
dstDC.BitBlt(0,0,rect.Width(),rect.Height(),DCpoint,0,0,SRCCOPY);
image.Save(L"D:\\用户目录\\Pictures\\写图片文件.jpg");
>>显示图片
首先看下面这段代码
CImage image;
image.Load(L"D:\\用户目录\\Pictures\\example.jpg");
image.Draw(GetDC()->m_hDC,CRect(0,0,320,240));
CImage类支持以Load方法读取本地磁盘上的文件,并用Draw方法来显示图片。CIamge类的成员函数中还有很多可以实现显示图片。例如BitBlt办法。如以下代码:
image.BitBlt(GetDC()->m_hDC,0,0,320,240,0,0,SRCCOPY);
Bitblt方法同CDC类的Bitblt函数一样,是一比一地复制图像并显示在屏幕上,支持对源图像取反,也就是反色显示。这样功能通过BitBlt的最后一个参数来实现,比如参数为NOTSRCCOPY就是反色显示。
MaskBlt可以将图片与目的图片进行特殊的光栅操作并进行掩码处理。
PlgBlt函数可以将图片拉伸成平行四边形进行显示。
StretchBlt函数可以将图片进行拉伸显示。
>>创建图片
CImage的Creat函数和CreatEx函数用来创建空白图片,编程人员可以利用这个函数来创建图像,并添加代码让用户可以使用鼠标来改变CImage对象的像素颜色,以实现类似于windows画图的功能。
pDC->MoveTo(10,10);//定义起点
pDC->LineTo(200,20);//线的终点
pDC->SelectObject(oldPen);//将以前的画笔选入设备描述表
5、CArry
CArray类支持与C arrays相似的数组,但是必要时可以动态压缩并扩展。数组索引从0开始。可以决定是固定数组上界还是允许当添加元素时扩展当前的边界。内存对上界是连续地分配空间,甚至一些元素可为空。
在使用一个数组之前,使用SetSize建立它的大小和为它分配内存。如果不使用SetSize,则为数组添加元素就会引起频繁地重新分配和拷贝。频繁地重新分配和拷贝不但没有效率,而且导致内存碎片。
MFC提供了一套模板库,来实现一些比较常见的数据结构如Array,List,Map。CArray即为其中的一个,用来实现动态数组的功能。CArray是从CObject派生,有两个模板参数,第一个参数就是CArray类数组元素的变量类型,后一个是函数调用时的参数类型。有一个类
class Object,要定义一个Object的动态数组,那么可以用以下两种方法:
CArray<Object,Object> Var1;
CArray<Object,Object&> Var2;
Var2的效率要高。