SetDlgItemText() 用来在控件(如静态文本控件)上输出文本,其原型是:
- BOOL SetDlgItemText( int nID, LPCTSTR lpszString ) throw();
复制代码
第 2 个参数 lpszString 是个字符串,或是一个字符指针。但是我们在这里也可以填入 CString 对象,为什么?下面来分析一下。
首先,LPCTSTR 是由 typedef 来定义的:
在 atlsimpstr.h 中有如下定义:
[C++] 纯文本查看 复制代码 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;
};
这是个模板类,定义了字符及相关指针的基本类型。这里,LPCWSTR 和 PCYSTR是等价。
同样在 atlsimpstr.h 中有的类 CSimpleStringT 中有:
typedef typename CThisSimpleString::PCYSTR PCYSTR;
也就是说,在该类中,PCXSTR 和在 ChTraitsBase 类中的 PCXSTR 是一样的东西。
由于 typedef 后面是要跟着一个明确的类型的,而 CThisSimpleString::PCYSTR 只是一个还未实例化的模板,因此编译器并不了解它到底是个什么类型,为了通知编译器这是个合法的类型,就使用了 typename 来防止编译器报错。
在 CSimpleStringT 中,我们找到了转换函数:
- operator PCXSTR() const throw()
- {
- return( m_pszBuffer );
- }
复制代码
注意和构造函数的区别,构造函数可用于从某种类型到类类型的转换。如果要进行相反的转换,构造函数无能无力,只能用特殊的 C++ 运算符函数,即 转换函数。
也就是说,当一个 CString 对象传递到给一个函数中的 LPCTSTR 参数中时,CString 对象会经由转换函数,将对象转换为 LPCTSTR 。
|