在编译的时候出现,提示了
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
要不你就这样
用atoi或者itoa这类的函数搞定
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;
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;
str.format(_T("%d"), nChar);
m_strLine += str;
#9
+1
#10
m_strLine += nChar;
你看看你的m_strLine是什么类型?
你看看你的m_strLine是什么类型?
#11
其他类型转CString最简单,用CString::Format
至于编码的问题,你按编码规则来
至于编码的问题,你按编码规则来
#12
正解
#13
atoi 貌似比较快。。。不过俺一般习惯用 FORMAT
#14
来晚了,上边讲得都挺好。
UINT是无符号整型数据,在转CString,long 时没有问题,但在转INT是需要主要越界。
UINT是无符号整型数据,在转CString,long 时没有问题,但在转INT是需要主要越界。
#15
tt
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
#16
tt
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
#17
强制转化为TCHAR
#18
这个方法 我用的成功,其他的方法就不会了
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);
}
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
要不你就这样
用atoi或者itoa这类的函数搞定
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;
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;
str.format(_T("%d"), nChar);
m_strLine += str;
#9
+1
#10
m_strLine += nChar;
你看看你的m_strLine是什么类型?
你看看你的m_strLine是什么类型?
#11
其他类型转CString最简单,用CString::Format
至于编码的问题,你按编码规则来
至于编码的问题,你按编码规则来
#12
正解
#13
atoi 貌似比较快。。。不过俺一般习惯用 FORMAT
#14
来晚了,上边讲得都挺好。
UINT是无符号整型数据,在转CString,long 时没有问题,但在转INT是需要主要越界。
UINT是无符号整型数据,在转CString,long 时没有问题,但在转INT是需要主要越界。
#15
tt
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
#16
tt
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
#17
强制转化为TCHAR
#18
这个方法 我用的成功,其他的方法就不会了
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);
}
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++深入详解》里第五课的的代码。