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


    /*------------------------------------------------------------------ 
        函数 init_hanenv : 初始化 HANENV 系统 
    ------------------------------------------------------------------*/ 
    #include  
 
    /*-- 全局变量定义 ------------------------------------------------*/ 
    #ifndef ERR_NO 
        #define ERR_NO 
        int _ErrorNo = 0; 
    #endif 
 
    int _ScreenTop     = 0;             /* 当前屏幕首行位置           */ 
    int _ScreenWidth   = 80;            /* 逻辑屏幕宽度(以字节为单位) */ 
    int _ScreenHigh    = 480;           /* 逻辑屏幕高度(以象素为单位) */ 
    int _WindowLeft    = 0;             /* 屏幕显示窗口列坐标         */ 
    int _WindowTop     = 0;             /* 屏幕显示窗口行坐标         */ 
    int _WindowHigh    = 480;           /* 屏幕显示窗口高度           */ 
 
    int _MouseLeft     = 0;             /* 鼠标活动左边界             */ 
    int _MouseTop      = 0;             /* 鼠标活动上边界             */ 
    int _MouseRight    = 639;           /* 鼠标活动右边界             */ 
    int _MouseBottom   = 479;           /* 鼠标活动下边界             */ 
    int _MouseSpeed    = 200;           /* 鼠标响应速度               */ 
 
    int _TextCol       = 0;             /* 光标当前列                 */ 
    int _TextLine      = 0;             /* 光标当前行                 */ 
    int _TextWinLeft   = 0;             /* 正文窗口左边界             */ 
    int _TextWinTop    = 0;             /* 正文窗口上边界             */ 
    int _TextWinRight  = 79;            /* 正文窗口右边界             */ 
    int _TextWinBottom = 480;           /* 正文窗口下边界             */ 
    int _TextColor     = LIGHTGRAY;     /* 正文字符颜色               */ 
    int _Background    = BLACK;         /* 正文区背景色               */ 
    int _EditColor     = BLACK;         /* 编辑字符颜色               */ 
    int _EditBk        = LIGHTGRAY;     /* 编辑区背景色               */ 
    int _TitleColor    = WHITE;         /* 标题字符颜色               */ 
    int _TitleBk       = BLUE;          /* 标题区背景色               */ 
    int _TabColor      = RED;           /* 表格颜色                   */ 
    int _TabBk         = WHITE;         /* 表格背景色                 */ 
    int _Xtimes        = 1;             /* 横向放大倍数               */ 
    int _Ytimes        = 1;             /* 纵向放大倍数               */ 
    int _VideoBusy     = NO;            /* 显示卡寄存器组工作标志     */ 
    HZK *_CurrentHZK   = NULL;          /* 当前汉字库                 */ 
    int _BoxLineColor  = BLACK;         /* 框线颜色                   */ 
    unsigned _BarColor = GRAY_BAR;      /* 按键颜色                   */ 
    void interrupt far (*_Oldint1CH)(); /* 原BIOS 中断INT1CH 地址     */ 
    void interrupt far (*_Oldint09H)(); /* 原BIOS 中断INT09H 地址     */ 
    void interrupt far (*_Oldint23H)(); /* 原中断 INT23H(^C) 地址     */ 
    void far (*_Int1CHfun[10])();       /* 时钟处理程序向量           */ 
 
    extern void _Cdecl _SmoothScroll(int x,int y); 
    extern void _Cdecl set_mode_ctrl(void); 
 
    /*----------------------------------------------------------- 
        函数 emptyfunction : 空函数,用于定时器中 
    -----------------------------------------------------------*/ 
    unsigned _Cdecl emptyfunction(unsigned h) 
    { 
        return h; 
    } 
 
    /*----------------------------------------------------------- 
        函数 _Newint1CH : 新1CH中断处理 
    -----------------------------------------------------------*/ 
    void interrupt _Newint1CH(void) 
    { 
        static int i; 
        for(i = 0;i < 10; i++) 
            if(_Int1CHfun[i]) 
                (*_Int1CHfun[i])(); 
        (*_Oldint1CH)(); 
    } 
    /*----------------------------------------------------------- 
        函数 _Newint23H : 新23H中断处理(^C & ^Break) 
    -----------------------------------------------------------*/ 
    void interrupt _Newint09H(void) 
    { 
        unsigned char ch     = inportb(0x60); 
        unsigned char excode = peekb(0x40,0x17); 
 
        if((ch==224 || ch==46) && excode&4) 
            pokeb(0x40,0x17,excode&0xfb); 
        (*_Oldint09H)(); 
    } 
    /*----------------------------------------------------------- 
        函数 _Newint23H : 新23H中断处理(^C & ^Break) 
    -----------------------------------------------------------*/ 
    void interrupt _Newint23H(void) 
    { 
    } 
 
    /*----------------------------------------------------------- 
        函数 init_hanenv : 初始化HANENV系统的汉字处理环境 
    -----------------------------------------------------------*/ 
    void _Cdecl init_hanenv(void) 
    { 
        int i; 
 
        /*-- 存储原西文屏幕信息 ---------------*/ 
        _SaveEnv(); 
 
        /*- 设置VGA的图形模式12H(640×480×16) */ 
        _AH    = 0x00; 
        _AL    = 0x12; 
        geninterrupt(0x10); 
 
        /*-- 设置逻辑屏幕宽度 -----------------*/ 
        if(_ScreenWidth > 80) 
        { 
            _VideoBusy = YES; 
            outportb(0x3d4,0x13); 
            outportb(0x3d5,_ScreenWidth/2); 
            poke(0,0x44a,_ScreenWidth); 
            set_mode_ctrl(); 
            _SmoothScroll(_WindowLeft,_ScreenTop); 
            _VideoBusy = NO; 
        } 
 
        /*-- 设置屏幕分割 ---------------------*/ 
        if(_WindowHigh<480) 
        { 
            _SplitScreen(_WindowHigh); 
            _ScreenTop = 480-_WindowHigh; 
            smooth_scroll(_WindowLeft,_ScreenTop); 
        } 
 
        /*-- 设置鼠标 -------------------------*/ 
        reset_mouse(); 
        set_mouse_range(0,0,_ScreenWidth*8-1,_ScreenHigh-1); 
        light_mouse(); 
 
        /*-- 设置新的BIOS中断1CH --------------*/ 
        _Triggers[0].press_key = 1;        /* 触发器0专为定时器而保留 */ 
        _Triggers[0].trigger   = emptyfunction; 
        for(i=0;i<10;i++) 
            _Int1CHfun[i] = NULL; 
        _Oldint1CH        = getvect(0x1c); /* 保存原中断1CH的指针     */ 
        setvect(0x1c,_Newint1CH); 
 
        /*-- 设置新的中断23H ------------------*/ 
        _Oldint09H        = getvect(0x09); 
        setvect(0x09,_Newint09H); 
        _Oldint23H        = getvect(0x23); 
        setvect(0x23,_Newint23H); 
    }