现在的位置: 首页 > 综合 > 正文

学习笔记之vc 6.0 下 含中文字符串 字符长度 获取及截取

2014年09月28日 ⁄ 综合 ⁄ 共 1378字 ⁄ 字号 评论关闭

今天在看 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);
}

 

 

抱歉!评论已关闭.