可以解决:你可以在读入每两个字符的时候,先判断是不是汉字,因为,汉字编码是双字节,而且两个字节是从 0xA1~0xFE,所以,但你判断不为汉字的时候,就只读一个字符,下面是判断是否为汉字的函数,供参考:BOOL  IsHZCode(BYTE bC1,BYTE bC2)
{
if((bC1>=0xa1&&bC1<=0xfe)&&
   (bC2>=0xa1)&&bC2<=0xfe))
 return    TRUE;    return   FALSE;
}

解决方案 »

  1.   

    void CMyPrint::MyDrawText(CDC *pDC,CString str,CRect &rect,int space_x,int space_y,bool bPrint,bool bBlank)
    {
    long x=rect.left ;
    long y=rect.top ;
    int space=space_x;
    BOOL CRLFBEGIN=bBlank;
    BOOL BEGIN=!bBlank;
    CString str_1;
    str_1.Empty (); CSize chinese_size=pDC->GetTextExtent ("中"); chinese_size.cx +=space_x;
    chinese_size.cy +=space_y; for(long i=0;i<str.GetLength ();)
    {
    while(i<str.GetLength ()&&(unsigned int)str.GetAt (i)<0xa1)
    {
    if(GetCRLF(i,str))
    {
    if(bBlank&&CRLFBEGIN)
    x+=2*chinese_size.cx ;
    CRLFBEGIN=FALSE;
    if(bPrint)
    pDC->TextOut (x ,y ,str_1);
    if(bBlank)
    CRLFBEGIN=TRUE;
    else
    BEGIN=TRUE;
    str_1.Empty ();
    i+=2;
    if( i < str.GetLength())
    y+=chinese_size.cy ;
    x=rect.left ;
    }
    else if(!GetCRLF(i,str))
    {
    if(str.GetAt (i)==' ')
    str_1+=_T(" ");
    else
    str_1+=str.GetAt (i); if(i+1<str.GetLength ())
    {
    if((i+2)<str.GetLength ())
    {
    BYTE bit1=str.GetAt (i+1);
    BYTE bit2=str.GetAt (i+2);
    if((bit1==0xa3&&bit2==0xac)||(bit1==0xa1&&bit2==0xa3)||(bit1==0xa3&&bit2==0xbb))
    {
    str_1+=bit1;
    str_1+=bit2;
    i+=2;
    }
    else if(bit1==0x2c||bit1==0x2e||bit1==0x3b)
    {
    str_1+=bit1;
    i++;
    }
    }
    else
    {
    BYTE bit1=str.GetAt (i+1);
    if(bit1==0x2c||bit1==0x2e||bit1==0x3b)
    {
    str_1+=bit1;
    i++;
    }
    }
    } int width=rect.Width ();
    CSize size=pDC->GetTextExtent (str_1);
    long num=size.cx /chinese_size.cx ;
    if(size.cx %chinese_size.cx )
    num++;
    int crlf_length=0;
    if(bBlank&&CRLFBEGIN)
    crlf_length=2*chinese_size.cx ; if(IsChinese(i+1,str))
    {
    if(CRLFBEGIN||BEGIN)
    {
    if(((BEGIN||(!bBlank&&CRLFBEGIN))&&x+(num+1)*chinese_size.cx>rect.left +(width/chinese_size.cx) *chinese_size.cx )||
    ((bBlank&&CRLFBEGIN)&&x+(num+3)*chinese_size.cx>rect.left +(width/chinese_size.cx) *chinese_size.cx ))
    {
    int temp=(num*chinese_size.cx-space-pDC->GetTextExtent (str_1.Right (1)).cx )/(str_1.GetLength ()-1); 
    int temp1=(num*chinese_size.cx-space-pDC->GetTextExtent (str_1.Right (1)).cx )%(str_1.GetLength ()-1); 
    for(int j=0;j<str_1.GetLength ();j++)
    {
    if(bBlank&&CRLFBEGIN)
    x+=2*chinese_size.cx ;
    CRLFBEGIN=FALSE;
    if(bPrint)
    pDC->TextOut (x,y,str_1.GetAt (j));
    x+=temp+(temp1>0);
    temp1--;
    }
    }
    else
    {
    if(bBlank&&CRLFBEGIN)
    x+=2*chinese_size.cx ;
    CRLFBEGIN=FALSE;
    if(bPrint)
    pDC->TextOut (x,y,str_1);
    }
    str_1.Empty ();
    }
    else
    {
    if(x+num*chinese_size.cx>rect.left +(width/chinese_size.cx) *chinese_size.cx )
    {
    if(bBlank&&CRLFBEGIN)
    x+=2*chinese_size.cx ;
    CRLFBEGIN=FALSE;
    if(bPrint)
    {
    long pos=rect.left +(width/chinese_size.cx) *chinese_size.cx-size.cx;
    if(pos<x)
    pos=x;
    pDC->TextOut (pos,y,str_1);
    }
    }
    else
    {
    if(bBlank&&CRLFBEGIN)
    x+=2*chinese_size.cx ;
    CRLFBEGIN=FALSE;
    if(bPrint)
    {
    long pos=rect.left +(num*chinese_size.cx -size.cx )/2-space/2;
    if(pos<x)
    pos=x;
    pDC->TextOut (pos,y,str_1);
    }
    }
    str_1.Empty ();
    }
    x+=num*chinese_size.cx ;
    CRLFBEGIN=FALSE;
    BEGIN=FALSE;
    }
    else if(((i+1)<str.GetLength ()&&x+size.cx+pDC->GetTextExtent (str.GetAt (i+1)).cx+space+crlf_length >
    rect.left +(width/chinese_size.cx) *chinese_size.cx )||
    ((i+1)>=str.GetLength ()&&x+size.cx+space >
    rect.left +(width/chinese_size.cx) *chinese_size.cx ))
    {
    if(bPrint)
    {
    long pos=rect.left +(width/chinese_size.cx) *chinese_size.cx-space -size.cx;
    if(pos<x)
    pos=x;
    pDC->TextOut (pos,y,str_1);
    }
    str_1.Empty (); if(i+1 < str.GetLength()&&!GetCRLF(i+1,str))
    y+=chinese_size.cy ;
    x=rect.left ;
    CRLFBEGIN=FALSE;
    BEGIN=TRUE;
    }
    i++;
    }
    }
    if(!str_1.IsEmpty ())
    {
    if(bPrint)
    {
    if(bBlank&&CRLFBEGIN)
    x+=2*chinese_size.cx ;
    CRLFBEGIN=FALSE;
    pDC->TextOut (x,y,str_1);
    }
    rect.bottom =x+pDC->GetTextExtent (str_1).cx ; str_1.Empty ();
    if(i+1 < str.GetLength()&&!GetCRLF(i+1,str))
    y+=chinese_size.cy ; x=rect.left ;
    CRLFBEGIN=FALSE;
    BEGIN=FALSE;
    }
    while(i<str.GetLength ()&&(unsigned int)str.GetAt (i)>=0xa1)
    {
    if(x+chinese_size.cx >rect.right)
    {
    if(i+1 < str.GetLength()&&!GetCRLF(i,str))
    y+=chinese_size.cy ;
    x=rect.left ;
    } if(GetCRLF(i,str))
    {
    if(bBlank)
    CRLFBEGIN=TRUE;
    else
    BEGIN=TRUE;
    str_1.Empty ();
    i+=2;
    if( i < str.GetLength())
    y+=chinese_size.cy ;
    x=rect.left ;
    } str_1.Format ("%c%c",str.GetAt (i),str.GetAt (i+1));
    if(CRLFBEGIN)
    x=rect.left+2*chinese_size.cx ;
    if(bPrint)
    pDC->TextOut (x,y,str_1);
    rect.bottom =x+pDC->GetTextExtent (str_1).cx;
    x+=chinese_size.cx ;
    i+=2;
    str_1.Empty ();
    CRLFBEGIN=FALSE;
    BEGIN=FALSE; if(GetCRLF(i,str))
    {
    if(bBlank)
    CRLFBEGIN=TRUE;
    else
    BEGIN=TRUE;
    i+=2;
    if( i < str.GetLength())
    y+=chinese_size.cy ;
    x=rect.left ;
    } if(x+chinese_size.cx >rect.right)
    {
    if(i<str.GetLength ())
    {
    if((i+1)<str.GetLength ())
    {
    BYTE bit1=str.GetAt (i);
    BYTE bit2=str.GetAt (i+1);
    if((bit1==0xa3&&bit2==0xac)||(bit1==0xa1&&bit2==0xa3)||(bit1==0xa3&&bit2==0xbb))
    {
    str_1+=bit1;
    str_1+=bit2;
    i+=2;
    }
    else if(bit1==0x2c||bit1==0x2e||bit1==0x3b)
    {
    str_1+=bit1;
    i++;
    }
    }
    else
    {
    BYTE bit1=str.GetAt (i);
    if(bit1==0x2c||bit1==0x2e||bit1==0x3b)
    {
    str_1+=bit1;
    i++;
    }
    }
    }
    pDC->TextOut (x,y,str_1);
    str_1.Empty (); if(i+1 < str.GetLength()&&!GetCRLF(i,str))
    y+=chinese_size.cy ;
    x=rect.left ;
    BEGIN=TRUE;
    }
    }
    }
    rect.top =y+chinese_size.cy ;
    }BOOL CMyPrint::GetCRLF(int i, CString str)
    {
    if(i<str.GetLength ()-1&&str.GetAt (i)==13&&str.GetAt (i+1)==10)
    return TRUE;
    else
    return FALSE;
    }
    不是很理想,可以参看一下!
      

  2.   

    用一个最简单的方法,根本不用你自己去判断,系统自己搞掂,DrawText
      

  3.   

    DrawText 我也试过!
    我的客户要求字与字之间要对齐,不知道DrawText能不能对齐?
      

  4.   

    它只有左对齐和右对齐,我不知道你所指的字与字之间对齐具体是什么意思,
    你试试下面的代码。
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s: string;
      r: TRect;
    begin
      s := '我的客户要求字与字之间要对齐,不知道DrawText能不能对齐?';
      r.Left := 10;
      r.Top := 10;
      r.Right := 300;
      r.Bottom := 300;
      DrawText(Canvas.Handle, PChar(s), Length(s), r, DT_WORDBREAK);
    end;
      

  5.   

    你可以将你的字符串转换成uicode编码再输出就不会有你所说的乱码问题。
      

  6.   

    SORRY,我刚刚是在DELPHI中测试的,结果把DELPHI的代码贴上来了。
      

  7.   

    #include <mbctype.h>
    BOOL CCadText::IsDoubleBit(LPCTSTR pString)
    {
    LPCTSTR pStr = pString;
    if ( _ismbblead ( *(UINT*)pStr))
    return TRUE;  
    else if( !(_getmbcp()) &&((0x81 <= *(unsigned char *) pStr  && *(unsigned char *)pStr  <= 0x9F) ||
     (0xE0 <= *(unsigned char *)pStr  && *(unsigned char *)pStr  <= 0xFC))) 
    return TRUE;
    return FALSE;
    }
    试试这个,我们一直用的