如何吧UINT转换成CString

时间:2023-01-27 13:02:32
下面是我的代码

void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
//回车符
if (0x0d == nChar)
{
m_strLine.Empty();
m_ptOrigin.y += tm.tmHeight;
}
//退格符
else if (0x08 == nChar)
{
COLORREF clr = dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine);
m_strLine = m_strLine.Left(m_strLine.GetLength() - 1);
dc.SetTextColor(clr);
}
else
{
m_strLine += nChar;      //here错误
}

CSize sz = dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x = m_ptOrigin.x + sz.cx;
pt.y = m_ptOrigin.y;
SetCaretPos(pt);
dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine);
CView::OnChar(nChar, nRepCnt, nFlags);
}
在编译的时候出现,提示了
c:\documents and settings\administrator\桌面\text\text\textview.cpp(189): error C2593: “operator +=”不明确
1>          e:\visual studio 2010\vc\atlmfc\include\cstringt.h(1338): 可能是“ATL::CStringT<BaseType,StringTraits> &ATL::CStringT<BaseType,StringTraits>::operator +=(wchar_t)”
1>          with
1>          [
1>              BaseType=char,
1>              StringTraits=StrTraitMFC_DLL<char>
1>          ]
1>          e:\visual studio 2010\vc\atlmfc\include\cstringt.h(1331): 或       “ATL::CStringT<BaseType,StringTraits> &ATL::CStringT<BaseType,StringTraits>::operator +=(unsigned char)”
1>          with
1>          [
1>              BaseType=char,
1>              StringTraits=StrTraitMFC_DLL<char>
1>          ]
1>          e:\visual studio 2010\vc\atlmfc\include\cstringt.h(1319): 或       “ATL::CStringT<BaseType,StringTraits> &ATL::CStringT<BaseType,StringTraits>::operator +=(char)”
1>          with
1>          [
1>              BaseType=char,
1>              StringTraits=StrTraitMFC_DLL<char>
1>          ]
1>          尝试匹配参数列表“(CString, UINT)”
时这样的错误,我猜测是类型不对造成的,敢问,如果是类型不对造成的,我想把UINT转换成CString类型,需要怎么转换,如果是其他原因造成的,也请大神们指点下,谢谢了

21 个解决方案

#1


忘记说 我的编译器是vs2010

#2


代码好长,没细看,你试试这个,应该OK

CString str;
UINT  nInt;
str.Format(_T("%d"),nInt);


要不你就这样
用atoi或者itoa这类的函数搞定
int   nValue   =   atoi(str.GetBuffer(0))   ;
UINT   nUint   =   (UINT)nValue   ;

#3


m_strLine += (TCHAR)nChar;

#4


你最好格式化成字符串再进行 + 操作

#5


最方便的做法是将字符集由UNICODE改成多字节。

#6


你那个是多字节问题,把项目属性设置下,设置支持成多字节

#7


CString a;
UINT b = 0;
a.format("%d", b);

经测试可用,另外,字符串最好先格式化在再进行 + 操作。

你的代码可以这样写
CString str;
str.format("%d", nChar);
m_strLine += str;

#8


CString str;
str.format(_T("%d"), nChar);
m_strLine += str; 

#9


引用 8 楼 xiaojunjun1202 的回复:
CString str;
str.format(_T("%d"), nChar);
m_strLine += str;

+1

#10


m_strLine += nChar; 
你看看你的m_strLine是什么类型?

#11


其他类型转CString最简单,用CString::Format

至于编码的问题,你按编码规则来

#12


引用 2 楼 doctorwing 的回复:
代码好长,没细看,你试试这个,应该OK

C/C++ code
CString str;
UINT  nInt;
str.Format(_T("%d"),nInt);


要不你就这样
用atoi或者itoa这类的函数搞定
C/C++ code
int   nValue   =   atoi(str.GetBuffer(0))   ;
UINT   nUint   =   ……

正解

#13


atoi  貌似比较快。。。不过俺一般习惯用  FORMAT

#14


来晚了,上边讲得都挺好。
UINT是无符号整型数据,在转CString,long 时没有问题,但在转INT是需要主要越界。

#15


tt
  
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 

http://feiyun0112.cnblogs.com/

#16


tt
  
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 

http://feiyun0112.cnblogs.com/

#17


强制转化为TCHAR

#18


引用 3 楼 stjay 的回复:
C/C++ code
m_strLine += (TCHAR)nChar;


这个方法 我用的成功,其他的方法就不会了

m_strLine是CString类型,  我需要的是吧UINT转换成CString类型,再把2个CString相加

#19


...
else
{
    CString str;
    str.Format(_T("%c"),nChar);
    m_strLine += str;
}
...

这样就行了,刚才已测试过,用的是VS2008。(注:调试前,修改:项目--属性-->配置属性-->字符集,改成“使用多字节字符集”)
我调试的完整代码是:

int Ccharpter5_testView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO:  在此添加您专用的创建代码
/*//添加插入符
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();*/

//添加位图插入符
bitmap.LoadBitmapA(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();


return 0;
}

void Ccharpter5_testView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);

if(0x0d==nChar)
{
m_strLine.Empty();
m_ptOrigin.y+=tm.tmHeight;
}
else if(0x08==nChar)
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
dc.TextOutA(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
else
{
CString str;
str.Format("%c",nChar);
    m_strLine += str;
}

CSize sz=dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x=m_ptOrigin.x+sz.cx;
pt.y=m_ptOrigin.y;
SetCaretPos(pt);


dc.TextOutA(m_ptOrigin.x,m_ptOrigin.y,m_strLine);



CView::OnChar(nChar, nRepCnt, nFlags);
}

void Ccharpter5_testView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
    
SetCaretPos(point);
m_strLine.Empty();
m_ptOrigin=point;

CView::OnLButtonDown(nFlags, point);
}

#20


只有TCHAR最正确了,其他不行

#21


楼主的代码是孙鑫的《C++深入详解》里第五课的的代码。

#1


忘记说 我的编译器是vs2010

#2


代码好长,没细看,你试试这个,应该OK

CString str;
UINT  nInt;
str.Format(_T("%d"),nInt);


要不你就这样
用atoi或者itoa这类的函数搞定
int   nValue   =   atoi(str.GetBuffer(0))   ;
UINT   nUint   =   (UINT)nValue   ;

#3


m_strLine += (TCHAR)nChar;

#4


你最好格式化成字符串再进行 + 操作

#5


最方便的做法是将字符集由UNICODE改成多字节。

#6


你那个是多字节问题,把项目属性设置下,设置支持成多字节

#7


CString a;
UINT b = 0;
a.format("%d", b);

经测试可用,另外,字符串最好先格式化在再进行 + 操作。

你的代码可以这样写
CString str;
str.format("%d", nChar);
m_strLine += str;

#8


CString str;
str.format(_T("%d"), nChar);
m_strLine += str; 

#9


引用 8 楼 xiaojunjun1202 的回复:
CString str;
str.format(_T("%d"), nChar);
m_strLine += str;

+1

#10


m_strLine += nChar; 
你看看你的m_strLine是什么类型?

#11


其他类型转CString最简单,用CString::Format

至于编码的问题,你按编码规则来

#12


引用 2 楼 doctorwing 的回复:
代码好长,没细看,你试试这个,应该OK

C/C++ code
CString str;
UINT  nInt;
str.Format(_T("%d"),nInt);


要不你就这样
用atoi或者itoa这类的函数搞定
C/C++ code
int   nValue   =   atoi(str.GetBuffer(0))   ;
UINT   nUint   =   ……

正解

#13


atoi  貌似比较快。。。不过俺一般习惯用  FORMAT

#14


来晚了,上边讲得都挺好。
UINT是无符号整型数据,在转CString,long 时没有问题,但在转INT是需要主要越界。

#15


tt
  
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 

http://feiyun0112.cnblogs.com/

#16


tt
  
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 

http://feiyun0112.cnblogs.com/

#17


强制转化为TCHAR

#18


引用 3 楼 stjay 的回复:
C/C++ code
m_strLine += (TCHAR)nChar;


这个方法 我用的成功,其他的方法就不会了

m_strLine是CString类型,  我需要的是吧UINT转换成CString类型,再把2个CString相加

#19


...
else
{
    CString str;
    str.Format(_T("%c"),nChar);
    m_strLine += str;
}
...

这样就行了,刚才已测试过,用的是VS2008。(注:调试前,修改:项目--属性-->配置属性-->字符集,改成“使用多字节字符集”)
我调试的完整代码是:

int Ccharpter5_testView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO:  在此添加您专用的创建代码
/*//添加插入符
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();*/

//添加位图插入符
bitmap.LoadBitmapA(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();


return 0;
}

void Ccharpter5_testView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);

if(0x0d==nChar)
{
m_strLine.Empty();
m_ptOrigin.y+=tm.tmHeight;
}
else if(0x08==nChar)
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
dc.TextOutA(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
else
{
CString str;
str.Format("%c",nChar);
    m_strLine += str;
}

CSize sz=dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x=m_ptOrigin.x+sz.cx;
pt.y=m_ptOrigin.y;
SetCaretPos(pt);


dc.TextOutA(m_ptOrigin.x,m_ptOrigin.y,m_strLine);



CView::OnChar(nChar, nRepCnt, nFlags);
}

void Ccharpter5_testView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
    
SetCaretPos(point);
m_strLine.Empty();
m_ptOrigin=point;

CView::OnLButtonDown(nFlags, point);
}

#20


只有TCHAR最正确了,其他不行

#21


楼主的代码是孙鑫的《C++深入详解》里第五课的的代码。