关于MFC遇到的一系列类型转换问题

1.LPTSTR 转换成 CString:

(1)直接赋值
CString strText;
LPTSTR lpszText = _T("LPTSTR >> CString");
strText = lpszText;
::MessageBox( NULL, strText , _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );

(2)CString::Format()格式化
CString strText;
LPTSTR lpszText = _T("LPTSTR >> CString");
strText.Format( _T("%s"), lpszText );
::MessageBox( NULL, strText , _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );

  

2.Cstring转Char*

(1)方法1:使用函数 T2A、W2A:

  

CString cstr = _T("test")

//声明标识
USES_CONVERSION;
//函数T2A和W2A均支持ATL和MFC中的字符
char * pFileName = T2A(cstr);   
//char * pFileName = W2A(cstr); //也可实现转换,vs2017可以通过

  

注意:有时候可能还需要添加引用#include <afxpriv.h>
(2)方法2:使用API:WideCharToMultiByte进行转换
  
  CString str = _T("test");
   //注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
  int n = str.GetLength();

  //获取宽字节字符的大小,大小是按字节计算的
  int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);

  //为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
  char * pFileName = new char[len+1]; //以字节为单位

  //宽字节编码转换成多字节编码 
  WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);
  pFileName[len+1] = '/0'; //多字节字符以'/0'结束

  

 

3.char*转CString:

方法一:使用函数 A2T、A2W

1 char * pFileName = "test";
2 
3 USES_CONVERSION;
4 CString s = A2T(pFileName);
5 //CString s = A2W(pFileName);

方法二:使用API:MultiByteToWideChar进行转换

复制代码
 1 char * pFileName = "test";
 2 
 3 //计算char *数组大小,以字节为单位,一个汉字占两个字节
 4 int charLen = strlen(pFileName);
 5 
 6 //计算多字节字符的大小,按字符计算。
 7 int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,0);
 8 
 9 //为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
10 TCHAR *buf = new TCHAR[len + 1];
11 
12 //多字节编码转换成宽字节编码
13 MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len);
14 
15 buf[len] = '/0'; //添加字符串结尾,注意不是len+1
16 
17 //将TCHAR数组转换为CString
18 CString pWideChar;
19 pWideChar.Append(buf);
20 
21 //删除缓冲区
22 delete []buf;

方法三:使用_T宏,将字符串转换为宽字符

1 //书写代码使用TEXT("")或_T(""),文本在UNICODE和非UNICODE程序里都通用
2 AfxMessageBox(_T("test string"));  
3 
4 注意:直接转换在基于MBCS的工程可以,但在基于Unicode字符集的工程中直接转换是不可行的,CString会以Unicode的形式来保存数据,强制类型转换只会返回第一个字符。

5.char *转LPTSTR

  

2005默认使用Unicode字符集,在创建项目时可以指定为多字节字符集,也可以创建之后再修改。
如果只是要把LPTSTR指向的Unicode字符串转换为LPSTR字符串,可以用WideCharToMultiByte函数。MSDN中有参数说明和例子。

我一般用char   *   和CString  
  VC里一般都提供CString的接口  
  否则也有LPCTSTR的。  
  如果是LPCTSTR可以直接用CString转换  
  CString   str;  
  (LPCTSTR)str就是LPCTSTR的了。  
  char   *   也可以这么转换成LPCTSTR。  
   
  char   *   不能直接转换成CString,CString   也不能直接转换成char   *  
  但是有了LPCTSTR就可以了。哈哈  
  char   *   p  
  CString   str;  
  p   =   (char*)(LPCTSTR)str;  
  str   =   (CString)(LPCTSTR)p;  
   
  所以,对我来说,LPCTSTR是用来转换的过度工具,它能干什么?我不管。反正我这么用就足够了。

在代码中未定义 UNICODE 的情况下
LPTSTR    等价于  char *
LPCSTR    等价于  const char *

所以直接使用就是了。
char temp[6] = "abcd";
LPTSTR lptstr = (LPTSTR)temp;
LPCTSTR lpctstr = (LPCTSTR)temp;

(资料来源:http://blog.sina.com.cn/s/blog_5a82024e0100bgmv.html

  

4.int 转String

int m=100;
Cstring s;
s.Format(_T("%d"), m);
MessageBox(s);//显示s=100;

  

5.int * 与string

int *m;
int mingwenStrlen=100;//m数组长度

miwenBuff = (int*)malloc(sizeof(int)*mingwenStrlen);
CString str,strr;
for (int i = 0; i < mingwenStrlen; i++)
{
	strr.Format(_T("%d"), miwenBuff[i]);
	str += strr;
}
MessageBox(str);

  

6.MFC中ASCII码转对应字符:

 

int x=116;//t的ASCII码
CString cs;
cs.Format(_T("%c"),x);//此时cs为t,%c为输出对应单个字符,c/c++中ASCII码与对应字符等价,不需要转换。
MessageBox(cs);

  

 

 

 

7.类型间区别:

LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的区分与转化

首先在编译程序时经常会遇到这种问题:

错误 1 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [3]”转换为“LPCTSTR”


(1)、觉得很烦,一般的做法就是不管三七二十一,在字符串前面加一个‘L’:

如调用函数FUN(LPCTSTR str)时,不能  FUN("HELLO");     而是FUN(L"HELLO");

通常这样做都比较能解决问题。

(2)、或者还可以用_T(), 即 FUN(_T("HELLO"));   _T() 的别名还有 _TEXT(), TEXT()。

稍微研究了下,BSTR,LPSTR,LPWSTR,LPCTSTR,LPTSTR等这些让人头晕的东东。(还是C#里简单啊,直接tostring)

BSTR:是一个OLECHAR*类型的Unicode字符串,是一个COM字符串,带长度前缀,与VB有关,没怎么用到过。

LPSTR:即 char *,指向以'/0'结尾的8位(单字节)ANSI字符数组指针

LPWSTR:即wchar_t *,指向'/0'结尾的16位(双字节)Unicode字符数组指针

LPCSTR:即const char *

LPCWSTR:即const wchar_t *

LPTSTR:LPSTR、LPWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI

LPCTSTR: LPCSTR、LPCWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI,如下是从MFC库中拷来的:

#ifdef UNICODE

    typedef LPWSTR LPTSTR;

    typedef LPCWSTR LPCTSTR;

#else

    typedef LPSTR LPTSTR;

    typedef LPCSTR LPCTSTR;

#endif

(3)、相互转换方法:

LPWSTR->LPTSTR:   W2T();
LPTSTR->LPWSTR:   T2W();
LPCWSTR->LPCSTR: W2CT();
LPCSTR->LPCWSTR: T2CW();

ANSI->UNICODE:     A2W();

UNICODE->ANSI:     W2A();

另外,CString转为CStringW方法(通过一个wchar_t数组来转)

 CString str;

 CStringW strw;
 wchar_t *text = new wchar_t[sizeof(wchar_t) * str.GetLength()];
 MultiByteToWideChar(CP_ACP,0,str,-1,text,str.GetLength());
 strw = text;

(4)、另外,还可以强行转换,不过不一定能成功

(5)、还有_bstr_t ( 对BTSTR的封装,需要#include<comdef.h> ),也可将单字节字符数组指针转为双字节字符数组指针,还没怎么没用到过。

8.MessageBox()与AfxMessageBox();区别:

Afx开头的都是全局函数,也就是说AfxMessageBox可以用于任何程序;而MessageBox只能用在CWnd及其派生类中。

AfxMessageBox的函数原型:有两种形式

int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );//第一种
int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) –1 );//第二种

参数的说明

第一个参数 
在第一种形式中:lpszText表示在消息框内部显示的文本,消息框的标题为应用程序的可执行文件名(如Hello)。 
在第二种形式中, nIDPrompt为要显示的文本字符串在字符串表中的ID。函数调用时会自动从字符串表中载入字符串并显示在消息框中。

第二个参数 
第二个参数nType为消息框中显示的按钮风格和图标风格的组合,可以采用|(或)操作符组合各种风格。 
按钮风格有如下几种:

MB_ABORTRETRYIGNORE 消息框中显示Abort、Retry、Ignore按钮 
MB_OK 显示OK按钮 
MB_OKCANCEL 显示OK、Cancel按钮 
MB_RETRYCANCEL 显示Retry、Cancel按钮 
MB_YESNO 显示Yes、No按钮 
MB_YESNOCANCEL 示Yes、No、Cancel按钮 
图标风格 
MB_ICONINFORMATION 显示一个i图标,表示提示 
MB_ICONEXCLAMATION 显示一个惊叹号,表示警告 
MB_ICONSTOP 显示手形图标,表示警告或严重错误 
MB_ICONQUESTION 显示问号图标,表示疑问

  

与AfxMessageBox类似的函数MessageBox,它是CWnd的类成员函数:

MessageBox
MessageBox的原型如下

int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL,UINT nType =MB_OK );

 


1
参数的说明:与AfxMessageBox的函数原型的参数类似
lpszText: 要显示的消息内容
lpszCaption:是消息框标题(默认没有)
nType:消息框的风格,与上面讲的相似

两个函数的区别总结

 


举例
AfxMessageBox("你是猪吗?",MB_YESNO|MB_ICONQUESTION);
int a = MessageBox( "确定删除吗?" , "Warning!!",MB_YESNO|MB_ICONWARNING);
if (a == IDYES)
AfxMessageBox("Yes");
else
AfxMessageBox("No");

转自:https://blog.csdn.net/u010412719/article/details/47312845

 

posted @ 2019-04-16 20:52  星海violet  阅读(808)  评论(0编辑  收藏  举报