关于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.mzph.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…

面试官问:来实现一个Promise

大家好&#xff0c;我是若川。最近组织了源码共读活动《1个月&#xff0c;200人&#xff0c;一起读了4周源码》&#xff0c;已经有超50人提交了笔记&#xff0c;群里已经有超1500人&#xff0c;感兴趣的可以点此链接扫码加我微信 ruochuan12 参与&#xff0c;一起学习&#xff…

奇迹暖暖服务器不稳定,闪耀暖暖用土豆当服务器?开服仅半小时就崩溃,无数玩家疯狂吐槽...

大家好&#xff0c;这里是正惊游戏&#xff0c;我是你们的正惊小弟。继奇迹暖暖之后&#xff0c;叠纸游戏的3D换装类游戏《闪耀暖暖》于昨天正式开启了全平台公测。就在大家想要上游戏给女儿买好看的衣服时&#xff0c;发现游戏的服务器崩了&#xff0c;谁都登录不上去&#xf…

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 …

网页开发环境的重要性_少即是多:极简方法在网页设计中的重要性

网页开发环境的重要性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;被前言部分图示和文章内容惊艳到。…

服务器内存型号与频率,一张图看懂如何选择DDR4内存的频率和容量

Intel发布了代号为Skylake的第六代酷睿处理器&#xff0c;与此同时各大主板厂商也迅速推出基于100系列芯片组的各型号主板以迎接Skylake处理器&#xff0c;分别有Z170、H170及B150三个不同级别的芯片组。那针对着不同芯片组主板&#xff0c;如何选择DDR4内存的频率和容量&#…

Promise 到底是什么?看这个小故事

大家好&#xff0c;我是若川&#xff0c;点此加我微信进源码群&#xff0c;一起学习源码。还可以进《剑指前端offer》交流群。另外&#xff0c;可以进群免费看下周六Vue专场直播&#xff0c;有尤雨溪分享「Vue3 生态现状以及展望」如果你还是一个 JavaScript 初学者&#xff0c…

Vue 团队公开快如闪电的全新脚手架工具,未来将替代 Vue-CLI,才300余行代码,学它!...

1. 前言大家好&#xff0c;我是若川。欢迎关注我的公众号若川视野源码共读活动ruochuan12想学源码&#xff0c;极力推荐之前我写的《学习源码整体架构系列》jQuery、underscore、lodash、vuex、sentry、axios、redux、koa、vue-devtools、vuex4、koa-compose、vue-next-release…

斑马无线打印服务器,如何设置斑马打印机无线WiFi

安装Zebra Setup Utilities.exe&#xff0c;打开软件(没有该软件的可以向客服索要)界面如果是英文请选择options(选项)&#xff0c;选择应用程序语言Simplified Chinese(简体中文)点击确定&#xff0c;关闭软件&#xff0c;重新打开&#xff0c;界面就会显示中文。点击相应的打…

Python自然语言处理学习笔记(19):3.3 使用Unicode进行文字处理

3.3 Text Processing with Unicode 使用Unicode进行文字处理 Our programs will often need to deal with different languages, and different character sets. The concept of “plain text” is a fiction&#xff08;虚构&#xff09;. If you live in the English-speakin…

小程序卡片叠层切换卡片_现在,卡片和清单在哪里?

小程序卡片叠层切换卡片重点 (Top highlight)介绍 (Intro) I was recently tasked to redesign the results of the following filters:我最近受命重新设计以下过滤器的结果&#xff1a; Filtered results for users (creatives) 用户的筛选结果(创意) 2. Filtered results fo…

效率神器!UI 稿智能转换成前端代码

做前端&#xff0c;不搬砖大家好&#xff0c;我是若川。从事前端五年之久&#xff0c;也算见证了前端数次变革&#xff0c;从到DW&#xff08;Dreamweaver&#xff09;到H5C3、从JQuery到MVC框架&#xff0c;无数前端大佬在为打造前端完整生态做出努力&#xff0c;由于他们的努…

$.when.apply_When2Meet vs.LettuceMeet:UI和美学方面的案例研究

$.when.apply并非所有计划应用程序都是一样创建的。 (Not all scheduling apps are created equal.) As any college student will tell you, we use When2Meet almost religiously. Between classes, extracurriculars, work, and simply living, When2Meet is the scheduling…

前端不容你亵渎

大家好&#xff0c;我是若川&#xff0c;点此加我微信进源码群&#xff0c;一起学习源码。同时可以进群免费看Vue专场直播&#xff0c;有尤雨溪分享「Vue3 生态现状以及展望」背景最近我在公众号的后台收到一条留言&#xff1a;言语里充满了对前端的不屑和鄙夷&#xff0c;但仔…

利益相关者软件工程_如何向利益相关者解释用户体验的重要性

利益相关者软件工程With the ever increasing popularity of user experience (UX) design there is a growing need for good designers. However, there’s a problem for designers here as well. How can you show the importance of UX to your stakeholders and convince…

云栖大会上,阿里巴巴重磅发布前端知识图谱!

大家好&#xff0c;我是若川&#xff0c;点此加我微信进源码群&#xff0c;一起学习源码。同时可以进群免费看Vue专场直播&#xff0c;有尤雨溪分享「Vue3 生态现状以及展望」阿里巴巴前端知识图谱&#xff0c;由大阿里众多前端技术专家团历经1年时间精心整理&#xff0c;从 初…

Linux下“/”和“~”的区别

在linux中&#xff0c;”/“代表根目录&#xff0c;”~“是代表目录。Linux存储是以挂载的方式&#xff0c;相当于是树状的&#xff0c;源头就是”/“&#xff0c;也就是根目录。 而每个用户都有”家“目录&#xff0c;也就是用户的个人目录&#xff0c;比如root用户的”家“目…