sizeInWords, const char *mbstr, size_t count );
errno_t wcstombs_s( size_t *pConvertedChars, char *mbstr, size_t
sizeInBytes, const wchar_t *wcstr, size_t count ); errno_t rand_s( unsigned int* randomValue); // 获取伪随机数
2.1.5 CString
CString是微软公司在VC中,为MFC和ATL定义的公用字符串类,同时支持普通字符类型char和宽字符类型wchar_t的字符串。
1.概述
CString是MFC/ATL定义的模版类CStringT的实例化,而CStringT又是独立模版类CSimpleStringT的派生类,参见图2-6。
模版类 CSimpleStringT 派 生 模版类 char 实例类
CStringA CStringT 实 例 化 TCHAR CString 图2-6 MFC串类层次结构图
在模版类CSimpleStringT的定义中,使用了BaseType类型做为模板第一个类型参数,并利用ChTraitsBase模板类定义了XCHAR和YCHAR等字符类:
template< typename BaseType , bool t_bMFCDLL = false> class CSimpleStringT {
public:
typedef typename ChTraitsBase< BaseType >::XCHAR XCHAR; typedef typename ChTraitsBase< BaseType >::PXSTR PXSTR; typedef typename ChTraitsBase< BaseType >::PCXSTR PCXSTR; typedef typename ChTraitsBase< BaseType >::YCHAR YCHAR; typedef typename ChTraitsBase< BaseType >::PYSTR PYSTR; typedef typename ChTraitsBase< BaseType >::PCYSTR PCYSTR; ……
16
}
其中模板类ChTraitsBase的定义为:
template< typename BaseType = char > class ChTraitsBase {
public:
typedef char XCHAR; typedef LPSTR PXSTR; typedef LPCSTR PCXSTR; typedef wchar_t YCHAR; typedef LPWSTR PYSTR; typedef LPCWSTR PCYSTR; };
template<>
class ChTraitsBase< wchar_t > {
public:
typedef wchar_t XCHAR; typedef LPWSTR PXSTR; typedef LPCWSTR PCXSTR; typedef char YCHAR; typedef LPSTR PYSTR; typedef LPCSTR PCYSTR; };
可见,在CString中包含两种字符类型——当前字符类型XCHAR和对立字符类型YCHAR。当前字符类型由基类型BaseType决定:如果基类型为char,则当前字符类型XCHAR也为char,且对立字符类型YCHAR为wchar_t;反之亦然,如果基类型为wchar_t,则当前字符类型XCHAR也为wchar_t,且对立字符类型YCHAR为char。而基类型BaseType又与类型TCHAR相同,都由项目的字符集属性是否取值为“使用Unicode库”决定。
2.构造函数
常用的CString构造函数有:
// 创建空对象
CString( ) throw(); // 创建空串 // 从串对象创建
CString(const CString& strSrc); // 由源串对象创建
17
// 从字符串数组创建
CString(const TCHAR* pszSrc); // 由同一字符类型的源串数组创建 CSTRING_EXPLICIT CString(const YCHAR* pszSrc); // 由对立字符类型的源串数组创建
CString(char* pszSrc); // 从char源串数组创建
CSTRING_EXPLICIT CString(wchar_t* pszSrc); // 从wchar_t源串数组创建 // 从字符创建
CSTRING_EXPLICIT CString(char ch, int nLength = 1); // 从char字符创建
CSTRING_EXPLICIT CString(wchar_t ch, int nLength = 1); // 从wchar_t字符创建
CString(const TCHAR* pch, int nLength); // 从同一类型字符创建 CString(const YCHAR* pch, int nLength); // 从对立类型字符创建 例如:
CString s0; // 创建空串 s0 = \赋值
CString s1(s0); // 由串对象创建串
CString s2(\由char数组创建串 CString s3(L\由wchar_t数组创建串 CString s4('a', 4); // 由重复的char字符创建串 CString s5(L'a', 4); // 由重复的wchar_t字符创建串 析构函数只有一个:
~CString() throw();
3.成员函数
常用的成员函数有:
void Empty( ) throw( ); // 清空串
XCHAR GetAt(int iChar) const; // 获取串的第iChar个字符
18
PXSTR GetBuffer( ); // 获取串的字符数组的动态地址 int GetLength( ) const throw( ); // 获取串长
PCXSTR GetString( ) const throw( ); // 获取常数串的指针
void SetAt(int iChar, XCHAR ch); // 将串的第iChar个字符设置为ch void SetString(PCXSTR pszSrc); // 设置串的内容为pszSrc
4.运算符
CString重载了:拼接运算符+,赋值运算符=和+=,比较运算符==、!=、<、>、<=和>=。它们的运算对象都可以是串对象、(普通/宽)字符数组串或(普通/宽)字符,以及它们的两两组合(顺序任意),但必须其中至少有一个操作数是串对象。
例如:
CString s, s1, s2; char ch, str[40]; wchar_t wch, wstr[40];
CString s1 = L\…… // 其他赋值和初始化
s = s1 + s2; // 串对象加串对象
s = s1 + str; // 串对象加普通字符数组串 s = s1 + wstr; // 串对象加宽字符数组串 s = str + s2; // 普通字符数组串加串对象 s = wstr + s2; // 宽字符数组串加串对象 s = s1 + ch; // 串对象加普通字符 s = s1 + wch; // 串对象加宽字符 s = ch + s2;// 普通字符加串对象 s = wch + s2; // 宽字符加串对象
//s = wstr + str; // 错误,两个字符数组串不能直接相加,可以改为:
// s = wstr; s += str;
s = s1; // 串对象
s = str; // 普通字符数组串
19
s = wstr; // 宽字符数组串 s = ch ;// 普通字符 s = wch ; // 宽字符
if (s == s1) ……; // 还可以s == str、wstr、ch、wch
// 对 !=、<、>、<=、>= 也类似
另外,因为CString类是用序列容器实现的,自然重载了下标运算符[]。即,可以像字符数组一样,来访问串中的字符元素。
例如:
CString str; ……
for (int i = 0; i < str.GetLength(); i++) if (str[i] >= 0x8140) break;
2.2 MFC概述
MFC(Microsoft Foundation Class Library,微软基础类库)是Windows API的C++类封装,还提供了以文档视图结构为基础的应用程序框架和新的消息映射机制,可自动生成基本代码,极大地简化了Windows应用程序的编写。
2.2.1 简介
MFC由微软公司的AFX(Application Framework eXtension,应用程序框架扩展)小组于1992年设计创建(因此,MFC的主头文件为StdAfx.h、MFC的全局函数多数以Afx为前缀、MFC的宏也以AFX为前缀)。MFC封装了Windows SDK的结构和功能,提供了应用程序框架和消息映射机制等内部技术,屏蔽了重复繁琐的实现细节,简化了程序员的工作。
MFC 类库中包含了几百个类,组成了一个庞大的类层次结构。如在MFC 9.0版中,含237个类、4个结构和4个接口。而在MFC 9.0功能包(包括在VS08 SP1版中)中,又增加137个新类(及86个内部类)和1个新结构。
MFC中的类大致可分为如下几种类型:应用程序框架、窗口支持、图形绘制、控件支持、功能区控件、管理器、选卡/停靠/属性/任务窗格等支持、文件服务、异常、同步、网络接口、因特网服务、数据库支持、数组/列表/映像类、通用类。可参见2.2.3中的类层次结
20