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
?