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