当前位置:   article > 正文

MFC与unicode的纠结_clistbox addstring unicode

clistbox addstring unicode

据说是由于从VC++6.0升级过来的代码,因为它的工程默认设置是非Unicode的,而vs2010工程的默认配置是Unicode的,所以在vs2010重写以前的代码的时候难免会出现这样以及那样 的问题,尤其是关于字符的问题。比如说:m_CityName.SetWindowTextA(city[t].c_str());(声明CStatic m_CityName,vector<string>city)出现的错误为: error C2039: “SetWindowTextA”: 不是“CStatic”的成员

和  m_List.AddString(city_name.c_str());出现的错误为:error C2664: “CListBox::AddString”: 不能将参数 1 从“const char *”转换为“LPCTSTR”!

还有 city.push_back(city_name.GetBuffer());出现的错误为: error C2664: “void std::vector<_Ty>::push_back(_Ty &&)”: 不能将参数 1 从“wchar_t *”转换为“std::string &&”

以及 对于出现“**”的字符串会出现错误:error:"const char *"类型的实参与"LPCTSTR"类型的形参不兼容

解决方法:方法1:最简单的方法就是通过设置vs2010的工程的通用属性的常规的字符集设置成“使用多字节字符集”就可以啦!

方法2:方法1虽然好,但是鉴于与时俱进以及与其它平台对接的原因,最好还是不改变vs2010的字符集。那么久需要修改具体的代码了。

一,对于m_CityName.SetWindowTextA(city[t].c_str()) 将其更改为 SetWindowTextA(m_CityName.m_hWnd,city[t].c_str());不知其所以然;

二,对于 m_List.AddString(city_name.c_str())将其改为USES_CONVERSION; m_List.AddString(A2CW(city_name.c_str()));也不知其所以然;

三,city.push_back(city_name.GetBuffer())将其改为: USES_CONVERSION; city.push_back(W2A(city_name.GetBuffer()));原因与第四个一样。  

四,对于字符串不兼容的,可以将"**"修改为:_T("**");  原因与第三个一样,是ANSII的CString的默认是窄字节的,而Unicode是宽字节的,_T在ANSI编译下表示ANSI串,在UNICODE下表示UNICODE串。在UNICODE下我们需要做宽窄字节的转换,比如:

USES_CONVERSION;
CString str;
std::string str1 = W2A(str.Getbuffer());
str.ReleaseBuffer();

                                                                                                                                                                                                                                                  2015.09.17更

unicode

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/123105
推荐阅读
相关标签
  

闽ICP备14008679号