www.pudn.com > cwin.rar > HLINE.C


    /*----------------------------------------------------------- 
        函数 hline : 横线 
    -----------------------------------------------------------*/ 
    #include  
 
    void _Cdecl _H_Line(x,y,len,color,pattern) 
    int x;                     /* 横线左端列坐标(以象素为单位) */ 
    int y;                     /* 横线左端行坐标(以象素为单位) */ 
    int len;                   /* 横线长度(以象素为单位)       */ 
    int color;                 /* 线颜色                       */ 
    unsigned char pattern;     /* 线型                         */ 
    { 
        register char far *addr; 
        unsigned mask=pattern; 
        register int i; 
 
        /*-- 计算线左端在显示存储器中的地址 ---*/ 
        addr = MK_FP(0xa000,(y+_ScreenTop)*_ScreenWidth+x/8); 
 
        /*-- 置显示寄存器组标志为"忙" ---------*/ 
        _VideoBusy = YES; 
 
        /*-- 设置显示寄存器组 -----------------*/ 
        outportb(0x3ce,0); 
        outportb(0x3cf,color); 
        outportb(0x3ce,1); 
        outportb(0x3cf,0x0f); 
 
        /*-- 如果线局限于一个字节内则直接输出 -*/ 
        if( x%8 && (x+len)/8 == x/8) 
        { 
            mask     = (pattern>>x%8) & (pattern<<(8-(x+len)%8)); 
            outportb(0x3ce,0x08); 
            outportb(0x3cf,mask); 
            *(addr) &= 0xff; 
        } 
        else 
        { 
            /*-- 如果线左端不满一个字节 -------*/ 
            if(x%8) 
            { 
                mask=pattern>>x%8; 
                outportb(0x3ce,0x08); 
                outportb(0x3cf,mask); 
                *(addr)&=0xff; 
                addr++; 
                len-=8-x%8; 
                x=x/8*8+8; 
            } 
 
            /*-- 如果线长大于1个字节 ----------*/ 
            if((x+len)/8 > x/8) 
            { 
                outportb(0x3ce,0x08); 
                outportb(0x3cf,pattern); 
                for(i=0;i