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

关于MFC遇到的一系列类型转换问题相关推荐

  1. MFC 如何将DWORD类型转换成CString放入ListBox中

    问题来源描述:这个问题是我在用MFC写内存修改器的时候碰见的,我有一个DWORD[ ]类型,如何将它转成字符串放入ListBox中呢? 解决这一问题需要用到Format函数,这个函数是CString中 ...

  2. MFC 教程【9_MFC的状态】

    MFC的状态 MFC定义了多种状态信息,这里要介绍的是模块状态.进程状态.线程状态.这些状态可以组合在一起,例如MFC句柄映射就是模块和线程局部有效的,属于模块-线程状态的一部分. 模块状态 这里模块 ...

  3. MFC类结构-1、CObject类

    CObject是"MFC类之母",由它派生出庞大的类体系.CObject并不是对整个类体系进行语义抽象的结果,它只为所有派生类定义几种功能特性.由于这几项功能应用于MFC的大部分类 ...

  4. MFC消息处理学习总结

    Windows消息机制概述 http://www.cppblog.com/suiaiguo/archive/2009/07/18/90412.html 消息是指什么?      消息系统对于一个win ...

  5. MFC 教程【5_MFC对象的创建】

    MFC对象的创建 前面几章介绍了MFC的核心概念和思想,即介绍了MFC对Windows对象的封装方法和特点:MFC对象的动态创建.序列化:MFC消息映射机制. 现在,考查MFC的应用程序结构体系,即以 ...

  6. MFC 教程【4_消息映射的实现】

    消息映射的实现 Windows消息概述 Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口.这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows. 消息的 ...

  7. 走进Visual C++

    一 走进Visual C++...................................................................................... ...

  8. 项目:私“图”定制——利用ffmpeg制作Gif

    目录: 项目背景 可行性方面 需求分析 详细设计 测试 维护 项目效果图展示 完整代码 项目背景: 文字信息时代,传统的文字聊天方式已不能满足大众的需求,很多时候文字不能表达自己的想法,或者沟通技巧的 ...

  9. Windbg在软件调试中的应用

    Windbg在软件调试中的应用 Windbg是微软提供的一款免费的,专门针对Windows应用程序的调试工具.借助于Windbg, 我们常见的软件问题:软件异常,死锁,内存泄漏等,就可以进行高效的排查 ...

最新文章

  1. oracle系列(三)oracle的配置与管理
  2. [转载]java中Date,SimpleDateFormat
  3. 异步fifo with 读控制
  4. 搭建K8s集群(二进制方式)-操作系统初始化
  5. java奥运会安排赛程问题_记录奥运-当今五大Java记录框架之间的竞赛
  6. 软件测试工程师和WGT,软件系统测试(WGT)工程师---ATK
  7. plc tcp ip通讯怎么只能连一个客户端_一款Ethernet/IP和Modbus TCP转OPC UA产品
  8. Atiit 常见功能 常用功能与模块的最快速解决方案
  9. 如何构建稳健的品期carry组合
  10. Intelij的IDEA启动报错!parent directory is read-only or the user lacks necessary permissions
  11. Java日志框架的使用
  12. Python采集 11月最新 世界疫情数据 + 可视化动态地图,实时查询超稳定
  13. 关于JS如何实现图片闪烁
  14. 如何对图片主题色进行提取
  15. chrome扩展程序安装_如何从Chrome网上应用店外部安装扩展程序
  16. AutoWare install
  17. java 防渗透_火焰 对于 () 相当于墨汁对于()A.冰冷 洁白B.温暖 黝黑C.氧气 砚台D.光明 黑暗...
  18. CSSJS弹出层效果,兼容所有浏览器
  19. linux怎么强制解挂,linux下强制卸载挂接点——umount+Fuser命令详解
  20. Vue实例详解与生命周期

热门文章

  1. matlab r2007课后答案,《MATLAB R2007基础教程》习题答案.doc
  2. python文件批量改名_python文件批量重命名
  3. Voltage Keepsake CodeForces - 801C (思维+二分)
  4. 【莫比乌斯反演】10.30破译密码
  5. Confluence 6 针对你的数据库类型确定校验 SQL
  6. 【bzoj1911】 Apio2010—特别行动队
  7. [字符串]与[数组]的互相转换
  8. 35岁以前把下面十件事做好
  9. java获取表主外键_通过 jdbc 分析数据库中的表结构和主键外键
  10. 安卓APP_ Fragment(5)—— Fragment + ViewPager2 模拟微信首页 (2)两者联动翻页