zoukankan      html  css  js  c++  java
  • 关于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

  • 相关阅读:
    SSM(六)JDK动态代理和Cglib动态代理
    SSM(三)Mybatis动态SQL
    MyBatis无限级分类实现的两种方法--自关联与map集合
    idea上MyBatis第一个例子
    idea 给maven项目添加依赖(二)
    idea 创建maven项目(一)
    Java学习笔记——三层架构
    MySQL实现自动使用uuid作为主键以及解决不能调用触发器的一点思路
    Java学习笔记——MySQL创建表结构
    jQuery入门——注册事件
  • 原文地址:https://www.cnblogs.com/lyqf/p/10719954.html
Copyright © 2011-2022 走看看