|
发表于 2011-1-23 14:44:17
|
显示全部楼层
给你一个完美的解决方法,我花了一天的时间才把它弄好,MESSAGEBOX显示出问题,其实主要问题是出在GUI_GetTextExtend()这个函数上,我们看看下面的修改
void GUI_GetTextExtend(GUI_RECT* pRect, const char GUI_UNI_PTR * s, int MaxNumChars) {
int xMax = 0;
int NumLines = 0;
int LineSizeX = 0;
U16 Char;
pRect->x0 = GUI_Context.DispPosX;
pRect->y0 = GUI_Context.DispPosY;
while (MaxNumChars--) {
Char = GUI_UC__GetCharCodeInc(&s); // <------------------先看这里,返回一个字节的机内码,但汉字是占两个字节机内码,而且汉字低字节机内码与ASCII机内码不重合
if(Char >= 0x80) // <----------加入以下代码 判断是否汉字
Char = Char<<8 | GUI_UC__GetCharCodeInc(&s); //<----------加入以下代码 再读出低字节机内码,重新组合成一个完全的汉字
if ((Char == '\n') || (Char == '\0')) {
if (LineSizeX > xMax) {
xMax = LineSizeX;
}
LineSizeX = 0;
NumLines++;
if (!Char) {
break;
}
} else {
LineSizeX += GUI_GetCharDistX(Char); //<----------------来到这里GUI_GetCharDistX(Char); 这个函数的主要作用是在字库中读出汉字的字宽,而这里的Char只有汉字的高字节机内码,因为字库里没有半个汉字机内码的信息,所以返回了0,所以LineSizeX是一直为0的.这就是Message显示汉字不全的原因
}
}
if (LineSizeX > xMax) {
xMax = LineSizeX;
}
if (!NumLines) {
NumLines = 1;
}
pRect->x1 = pRect->x0 + xMax - 1;
pRect->y1 = pRect->y0 + GUI__GetFontSizeY() * NumLines - 1;
}
至此MessageBox已经能完美支持中文了 |
|