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

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…