none
在Unicode下调用Textout 打印的字母和中文字符的字符宽度怎么不一样 RRS feed

  • 问题

  • 做一个文本编辑软件,从CWnd派生一个类,Unicode方式编译,发现输入一个英文字母后,分隔符正好在字母后面,输入中文字符,分隔符在中文字符中间,我是通过得到字符的大致宽度,然后在后面画一个分隔符。是不是这样处理有问题

    static int x;
    void CEditWnd::OnShowWindow(BOOL bShow, UINT nStatus)
    {
       if (bShow)
       {
          CClientDC dc(this);
          TEXTMETRIC tm;
          dc.SelectObject(m_font);
          dc.GetTextMetrics(&tm);
    
          // here's why we're limited to fixed width fonts.
          m_iCharDX = tm.tmAveCharWidth;
          m_iCharDY = tm.tmHeight;
       }
    
       CWnd::OnShowWindow(bShow, nStatus);
    }
    void CEditWnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    pDC->TextOut(x,y,nChar);
    x+=m_iCharDX;
    }

    2012年2月15日 7:11

答案

  • 您所说的分隔符应该指的是插入符吧,您可以试试用GetTextExtentPoint32()函数得到中文字符的size,然后得到m_iCharDX等于这个CSize的cx值,如果您使用的是等宽字体的话,一个中文差不多是等于两个英文半角字符的宽度。另外您可以考虑从CEdit类或者CRichEditCtrl类派生,这样可能会比较简单一些。


    2012年2月15日 15:03
    版主
  • 不同字符的宽度本来就不同

    不能用估算的方法确定提示符的位置

    可以用GetTextExtentPoint32精确计算字符串的宽度


    新浪微博http://weibo.com/xianglitian,欢迎围观

    • 已建议为答案 Helen Zhao 2012年2月16日 7:42
    • 已标记为答案 janemzc 2012年2月16日 15:06
    2012年2月16日 0:19

全部回复

  • 您所说的分隔符应该指的是插入符吧,您可以试试用GetTextExtentPoint32()函数得到中文字符的size,然后得到m_iCharDX等于这个CSize的cx值,如果您使用的是等宽字体的话,一个中文差不多是等于两个英文半角字符的宽度。另外您可以考虑从CEdit类或者CRichEditCtrl类派生,这样可能会比较简单一些。


    2012年2月15日 15:03
    版主
  • 不同字符的宽度本来就不同

    不能用估算的方法确定提示符的位置

    可以用GetTextExtentPoint32精确计算字符串的宽度


    新浪微博http://weibo.com/xianglitian,欢迎围观

    • 已建议为答案 Helen Zhao 2012年2月16日 7:42
    • 已标记为答案 janemzc 2012年2月16日 15:06
    2012年2月16日 0:19