可以解决:你可以在读入每两个字符的时候,先判断是不是汉字,因为,汉字编码是双字节,而且两个字节是从 0xA1~0xFE,所以,但你判断不为汉字的时候,就只读一个字符,下面是判断是否为汉字的函数,供参考:BOOL IsHZCode(BYTE bC1,BYTE bC2)
{
if((bC1>=0xa1&&bC1<=0xfe)&&
(bC2>=0xa1)&&bC2<=0xfe))
return TRUE; return FALSE;
}
{
if((bC1>=0xa1&&bC1<=0xfe)&&
(bC2>=0xa1)&&bC2<=0xfe))
return TRUE; return FALSE;
}
{
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;
}
不是很理想,可以参看一下!
我的客户要求字与字之间要对齐,不知道DrawText能不能对齐?
你试试下面的代码。
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;
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;
}
试试这个,我们一直用的