今天在看 vc++ 深入详解时,字符输入内容时,自己突然想输入汉字测试程序,
源程序的两句是
int s= m_input.GetLength();
m_input=m_input.Left(s-1);
m_input 是CString ,程序是mfc
结果输入汉字,测试时,会出现乱码,因为一个汉字两个字节。到网上找了一下午的解决方案,老是出问题。
最后还是参考这个,得出方法
http://bbs.csdn.net/topics/330118156
就是修改 编译器的编码设置,我当前的是ansi,属于mbcs(多字节)编码方式,修改为unicode编码方式(所有的字母,汉字都是双字节)。
设置可以参考
http://blog.csdn.net/maweiqi/article/details/7801281
设置后,我程序出错了
m_input=m_input+nChar;
这一句报错,说+号重载不明确,我看确实有很多重载,我就试了几个发现 强制转为 TCHAR 就没问题了。 m_input=m_input+(TCHAR)nChar;
查询的时候,还看了一下其他的问题解决,也有参考价值:
http://bbs.csdn.net/topics/70245081
前面查询一个解决方案说,可以直接用CStringW来定义m_input。可是我在vc6里面用不了CStringW,说未定义,不知道怎么解决,查询说貌似vc6是mfc 4.0,CStringW是mfc9.0的东西,不过不知道怎么把vc6的mfc4.0改为mfc9.0,mfc9.0下载下来是个dll,而vc6按照目录下不是mfc4.0.dll,不知道怎么弄,估计要换个高级的编译器吧。
相关代码
void CTest12View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if (nChar==0x0d)
{
m_input.Empty();
m_caretpoint.y+=tm.tmHeight;
SetCaretPos(m_caretpoint);
}
else if (nChar==0x08)
{
COLORREF cr=dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_caretpoint.x,m_caretpoint.y,m_input);
int s= m_input.GetLength();
m_input=m_input.Left(s-1);
dc.SetTextColor(cr);
}
else
{
m_input=m_input+(TCHAR)nChar;
}
CSize cs=dc.GetTextExtent(m_input);
POINT pt;
pt.x=m_caretpoint.x+cs.cx;
pt.y=m_caretpoint.y;
SetCaretPos(pt);
dc.TextOut(m_caretpoint.x,m_caretpoint.y,m_input);
CView::OnChar(nChar, nRepCnt, nFlags);
}