關于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

?

轉載于:https://www.cnblogs.com/lyqf/p/10719954.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275342.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大蕭條時期什么行業走俏_大流行時期的用戶體驗

大蕭條時期什么行業走俏You’ve read a lot about uncertain times and social distancing. We’re all surrounded by the same words, but what exactly do they mean for the UX people? The nearest future is just the tip of the iceberg. The COVID-19 pandemic is lik…

vsftp虛擬用戶無法上傳文件,解決辦法

vsftp虛擬用戶無法上傳文件&#xff0c;解決辦法 1、打開/etc/vsftpd 目錄中的vsftpd.conf文件&#xff0c;查找&#xff1a;guest_usernamexxx&#xff0c;這里指的是vsftpd虛擬用戶對應的實 際系統用戶。 2、將該xxx用戶的R權限賦予想要上傳的目錄&#xff1a;chown -R xxx.x…

面試官問:來實現一個Promise

大家好&#xff0c;我是若川。最近組織了源碼共讀活動《1個月&#xff0c;200人&#xff0c;一起讀了4周源碼》&#xff0c;已經有超50人提交了筆記&#xff0c;群里已經有超1500人&#xff0c;感興趣的可以點此鏈接掃碼加我微信 ruochuan12 參與&#xff0c;一起學習&#xff…

奇跡暖暖服務器不穩定,閃耀暖暖用土豆當服務器?開服僅半小時就崩潰,無數玩家瘋狂吐槽...

大家好&#xff0c;這里是正驚游戲&#xff0c;我是你們的正驚小弟。繼奇跡暖暖之后&#xff0c;疊紙游戲的3D換裝類游戲《閃耀暖暖》于昨天正式開啟了全平臺公測。就在大家想要上游戲給女兒買好看的衣服時&#xff0c;發現游戲的服務器崩了&#xff0c;誰都登錄不上去&#xf…

D2 日報 2019年4月17日

? 新聞 ?? Is React Translated Yet? ¡S! Sim! はい&#xff01; react 文檔翻譯了多種語言reactjs.org? 開源項目 ?? formal/packages/formal-web at master kevinwolfcr/formal React Hooks 版本的 rc-form&#xff0c;集成了 React 表單組件通用的的非受控值緩…

nda協議_如何將NDA項目添加到您的投資組合

nda協議Being on the job hunt meant I needed to update my portfolio again. I had a new project to add, but it was under an NDA and I couldn’t say too much about it. Since I’ve never had to figure out how to display an NDA project on my portfolio before, I…

程序員一定會有35歲危機嗎?

大家好&#xff0c;我是若川。最近組織了源碼共讀活動《1個月&#xff0c;200人&#xff0c;一起讀了4周源碼》&#xff0c;已經有超50人提交了筆記&#xff0c;群里已經有超1500人&#xff0c;感興趣的可以點此鏈接掃碼加我微信 ruochuan12你好&#xff0c;我是黃老師。最近經…

hdu 2141 Can you find it? hdu1597 find the nth digit

hdu2141 唉&#xff0c;是我 想多了&#xff0c;用普通方法拼命剪枝&#xff0c;還是TLE 直接將前倆個數組的和求出來并保存&#xff0c;之后就是一個二分查找的過程了 二分的倆種寫法 第一種 #include<iostream>#include<algorithm>#include<string>using …

好程序員分享大勢所趨 HTML5成Web開發者最關心的技術

好程序員分享大勢所趨 HTML5成Web開發者最關心的技術&#xff0c;最近&#xff0c;在Stack Exchange上出現了一個比較熱門的問題&#xff1a;Web開發者最頭疼的問題是什么?結果并不是大家通常認為的兼容性問題&#xff0c;而是關于HTML5。  在所有與前端開發相關的技術中&am…

微軟bi 架構 服務器,微軟BI體系結構.

《微軟BI體系結構.》由會員分享&#xff0c;可在線閱讀&#xff0c;更多相關《微軟BI體系結構.(41頁珍藏版)》請在人人文庫網上搜索。1、Data Warehouse Data Access 前端報表用戶前端報表用戶 Data Sources Data Input Staging Area Data Marts 財務經理的視角財務經理的視角 …

網頁開發環境的重要性_少即是多:極簡方法在網頁設計中的重要性

網頁開發環境的重要性Written by Alan Smith由艾倫史密斯 ( Alan Smith)撰寫 Minimalism has been an increasingly popular trend in the web design world. Designers may be tempted by bolder, feature-rich design because it might seem like the best way to engage us…

聊聊前端八股文?

大家好&#xff0c;我是若川&#xff0c;點此加我微信進源碼群&#xff0c;一起學習源碼。同時可以進群免費看Vue專場直播&#xff0c;有尤雨溪分享「Vue3 生態現狀以及展望」前些天&#xff0c;我看到《劍指前端offer》一系列文章&#xff0c;被前言部分圖示和文章內容驚艷到。…

微服務神經元(Neural)

微服務架構中的神經組織&#xff0c;主要為分布式架構提供了集群容錯的三大利刃&#xff1a;限流、降級和熔斷。并同時提供了SPI、過濾器、JWT、重試機制、插件機制。此外還提供了很多小的黑科技(如&#xff1a;IP黑白名單、UUID加強版、Snowflake和大并發時間戳獲取等)。Featu…

flash跨域訪問解決辦法

今天一個客戶的flash程序突然無法訪問到數據&#xff0c;經過檢查發現當時做flash時&#xff0c;對訪問的數據使用了域名方式訪問&#xff0c;但是現在客戶又綁定了另一個域名&#xff0c;所以另一個域名訪問時就造成了跨域訪問&#xff0c;由于flash采用完全域匹配規則&#x…

服務器內存型號與頻率,一張圖看懂如何選擇DDR4內存的頻率和容量

Intel發布了代號為Skylake的第六代酷睿處理器&#xff0c;與此同時各大主板廠商也迅速推出基于100系列芯片組的各型號主板以迎接Skylake處理器&#xff0c;分別有Z170、H170及B150三個不同級別的芯片組。那針對著不同芯片組主板&#xff0c;如何選擇DDR4內存的頻率和容量&#…

Promise 到底是什么?看這個小故事

大家好&#xff0c;我是若川&#xff0c;點此加我微信進源碼群&#xff0c;一起學習源碼。還可以進《劍指前端offer》交流群。另外&#xff0c;可以進群免費看下周六Vue專場直播&#xff0c;有尤雨溪分享「Vue3 生態現狀以及展望」如果你還是一個 JavaScript 初學者&#xff0c…

docker 修改服務器,docker-修改容器掛載目錄的3種方法小結

本文關鍵詳細介紹了docker-修改容器初始化目錄的3種方式總結&#xff0c;具備非常好的實用價值&#xff0c;期待對大伙兒有一定的協助。一起追隨我回來瞧瞧吧方法一&#xff1a;修改配置文件(需停止docker服務)1、停止docker服務systemctl stop docker.service(重要&#xff0c…

什么是測試開發

aaa轉載于:https://www.cnblogs.com/Chamberlain/p/10730856.html

DropDownList 控件不能觸發SelectedIndexChanged 事件的另一個原因

相信DropDownList 控件不能觸發SelectedIndexChanged 事件已經不是什么新鮮事情了&#xff0c;原因也無外乎以下幾種&#xff1a; 1、DropDownList 控件的屬性 AutoPostBack"True" 沒有寫&#xff1b; 2、DropDownList 控件的數據綁定沒有放在if (!Page.IsPostBack) …

Vue 團隊公開快如閃電的全新腳手架工具,未來將替代 Vue-CLI,才300余行代碼,學它!...

1. 前言大家好&#xff0c;我是若川。歡迎關注我的公眾號若川視野源碼共讀活動ruochuan12想學源碼&#xff0c;極力推薦之前我寫的《學習源碼整體架構系列》jQuery、underscore、lodash、vuex、sentry、axios、redux、koa、vue-devtools、vuex4、koa-compose、vue-next-release…