目前只专门对ansi码DWORD strcx(HDC hdc,char* s)//这个是计算这个字符串的长度
{
SIZE size;
GetTextExtentPoint32(hdc,s,strlen(s),&size);
return size.cx;
}void linecheck(HDC hdc,text *temp,TextInfo *ti)//这个是计算每一段(也就是非自动换行的一行)占当前屏幕多少行
{
DWORD line=1;
DWORD x=0;
char *s = temp->data;
char str[3];
for(;*s!='\0';)
{
if(*s<0xFF)
{str[0] = *s; str[1] = '\0';s++;}
else
{str[0] = *s;str[1] = *(s+1);str[2] = '\0';s=s+2;} x = x+strcx(hdc,str); if(x>ti->clientx)//ti->clientx是屏幕宽;
{line++;x = 0;}
}
temp->endline = line;//这个记录行数;
}void txtrush(HDC hdc,HWND hwnd,TextInfo *ti)//收到WM_SIZE时刷新分行
{
hdc = GetDC(hwnd);
text *temp = ti->head->next;
for(;temp!=ti->head;temp=temp->next)
linecheck(hdc,temp,ti); ReleaseDC(hwnd,hdc);
}//下面这个就是最终在屏幕上写字了
//最右边参数test是个测试的结构体,在这里忽略
void txtshow(HWND hwnd,HDC hdc,PAINTSTRUCT *ps,TextInfo *ti,infomation *test)
{
hdc = BeginPaint(hwnd,ps);HDC Vhdc = CreateCompatibleDC(hdc);//先把要写的字放到内存里
HBITMAP hBitmap = CreateCompatibleBitmap(Vhdc,ti->clientx,ti->clienty);
SelectObject(Vhdc,(HGDIOBJ)hBitmap);
FloodFill(Vhdc,0,0,RGB(255,255,255));//先设置白屏(白纸)
SelectObject(Vhdc,(HGDIOBJ)ti->hfont);//ti->hfont是"微软雅黑"句柄
text *temp;
temp = head->next;//链表头
DWORD linesum=0;//总行数for(ti->clienthead = temp;linesum<(ti->pos)/(ti->cy);temp = temp->next)//ti->clienthead是当前屏幕第一行所在的段落,(ti->pos)/(ti->cy)是滚轮位置除以字体高度(每行高度){
linesum = linesum+(ti->clienthead->endline);
ti->clienthead = temp->next;
}//找到当前屏幕第一行所属段落(结点)DWORD num=0;
DWORD x = 0;
char s[3];char *c = temp->data;char *show;
for(int y = -(int)((ti->pos)-(linesum - (ti->clienthead->endline) + 1));y*(ti->cy)<=(ti->clienty);)
//从y行开始画,y可能是负数,也就是从当前屏幕第一行所在的结点头开始画,如果屏幕开始的行不是结点的头部,那么
//结点该行前面的行画到屏幕上方(负的地方)
{ for(x = 0,num = 0;x<=ti->clientx;)
{
if(*c==0x00) 
                {
                        temp = temp->next;
c = temp->data;
        break;
else if(*c<0xFF)
{
s[0] = *c;
s[1] = '\0';
x = x+strcx(hdc,s);
c++;num=1;
}
else
{
s[0] = *c;
s[1] = *(c+1);
s[2] = '\0';
x = x+strcx(hdc,s);
c = c+2;num=num=2;
}
                TextOut(Vhdc,x,y*ti->cy,s,num);//一个字一个字的画
}
y++;
}BitBlt(hdc,0,0,ti->clientx,ti->clienty,Vhdc,0,0,SRCCOPY);

DeleteObject(hBitmap);
DeleteDC(Vhdc);

EndPaint(hwnd,ps);}
错误1:
乱码,这个乱码酷似阿拉伯文,仔细辨认的话酷似某种文字和一般的现实不可显字符的那种乱码不同;
在没有自动换行的代码里则现实正常的微软雅黑,hfont之类未改变;错误2:
滚轮一旦拖动就一片空白,有时可以出现乱码;滚动条之类的代码并没有改变;还有一些错误没发现。求教一下各位高手,我的代码哪里错了,能不能改进下?

解决方案 »

  1.   

    void linecheck(HDC hdc,text *temp,TextInfo *ti)//这个是计算每一段(也就是非自动换行的一行)占当前屏幕多少行
    {
    DWORD line=1;
    DWORD x=0;
    char *s = temp->data;
    char str[3];
    for(;*s!='\0';)
    {
    if(*s<0xFF)
    {
    str[0] = *s; str[1] = '\0';s++;
    }
    else
    {
    str[0] = *s;
    str[1] = *(s+1);
    str[2] = '\0';
    s=s+2;
    }

    int width = x + strcx( hdc, str ); // 预计算一下,并不是真实加

    if( width > ti->clientx )//ti->clientx是屏幕宽;
    {
    // 现在该换行了
    line++;x = 0;
    }
    else
    {
    // 宽度并没有想加,现在才相加
    x + strcx( hdc, str );
    }
    }
    temp->endline = line;//这个记录行数;
    }