CString

CString .LoadString

 如果程序中涉及到多国语言,那么当在屏幕上写字的时候,我们就不能再用DrawText(hdc, L"Test",...)的方式了,而应该用LoadString函数从资源加载字符串资源,这样在换语言的时候只需要替换字符串资源就行了, 而无需改动代码。

以下是LoadString函数的原型:

int LoadString(

  HINSTANCE hInstance,

  UINT uID,

  LPTSTR lpBuffer,

  int cchBufferMax

);

参数解释:

hInstance: 资源所在的实例句柄。

nID:字符串资源的ID号。

lpBuffer:用来存放字符串的缓冲区。

cchBufferMax缓冲区的大小。如果cchBufferMax大于字符串的长度,那么字符串将会被截断,并以/0结束;如果字符串的长度大于等于cchBufferMax那么程序将会因为缓冲区溢出而崩溃。

例如下面的代码:(IDS_STR_TEST = L "测试中"

[cpp]  view plain copy
  1. WCHAR temp[2];  
  2. ::LoadString(NULL, IDS_STR_TEST, temp, sizeof(temp));  
  3. ::DrawText(hdc, temp, -1, &rect, DT_CENTER |DT_VCENTER);  

这段程序将会因为缓冲区溢出而崩溃。

      LoadString还有一种用法,无需传入buffer,而直接将lpBuffer设为NULL,然后将返回值强制转换为LPWSTR,得到指向资源文件的指针,由于是直接指向资源文件,所以这个时候得到的字符串是只读的。

用法如下:(IDS_STR_TEST = L "测试中"

[cpp]  view plain copy
  1. LPWSTR lpstr = (LPWSTR)::LoadString(NULL, IDS_STR_TEST, NULL, 0);  
  2.     ::DrawText(hdc, lpstr, -1, &rect, DT_CENTER |DT_VCENTER);  

不过在这么使用之前我们必须为资源编译器加上-n标志,以确保所得到的字符串是以“/0”为结束符的。在vs2005中的设置如下图:

 

CString_第1张图片

 

 

实际上CString已近为我们封装好了LoadString函数,我们也可以直接调用CString的成员函数来加载资源字符串。

[c-sharp]  view plain copy
  1. CString s;  
  2. s.LoadString(IDS_STR_TEST);  

你可能感兴趣的:(测试,null,buffer,语言,编译器)