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


    /*----------------------------------------------------------- 
        函数 gethan : 基本汉字输入模块 
    -----------------------------------------------------------*/ 
    #include  
    #include  
 
    /*------------------ 西文字符输入方式 ---------------------*/ 
    #define BANJIAO         0            /* 输入半角字符       */ 
    #define QUANJIAO        1            /* 输入半角字符       */ 
    /*--------------- 全角单、双引号输入方式 ------------------*/ 
    #define LEFT_QUOTATION  0            /* 输入全角左引号     */ 
    #define RIGHT_QUOTATION 1            /* 输入全角右引号     */ 
 
    /*-------------------- 全局变量定义 -----------------------*/ 
    int _HanMode     = ALT_F10;          /* 当前汉字输入方法   */ 
    int _AscMode     = BANJIAO;          /* 西文字符输入方式   */ 
    int _DispPrompt  = NO;               /* 提示行是否已经弹出 */ 
    int _PromptStyle = WIN_STYLE;        /* 提示行风格         */ 
    int _PmtColor    = BLACK;            /* 提示行字符颜色     */ 
    int _PmtBk       = LIGHTGRAY;        /* 提示行背景颜色     */ 
    int _PromptLine  = 450;              /* 提示行位置         */ 
    int _SectionCode;                    /* 区码               */ 
    int _PositionCode;                   /* 位码               */ 
    int _Quotation   = LEFT_QUOTATION;   /* 左右全角单引号标志 */ 
    int _DBQuotation = LEFT_QUOTATION;   /* 左右全角双引号标志 */ 
    MODE_TYPE _Mode[10]=                 /* 汉字输入法参数     */ 
    { 
        {"国标区位",0,NULL,0,YES,_GetSP,    0}, 
        {"        ",0,NULL,0,NO, NULL,      0}, 
        {"        ",0,NULL,0,NO, NULL,      0}, 
        {"        ",0,NULL,0,NO, NULL,      0}, 
        {"        ",0,NULL,0,NO, NULL,      0}, 
        {"英文数字",0,NULL,0,YES,_GetAscii, 0}, 
        {"        ",0,NULL,0,NO, NULL,      0}, 
        {"        ",0,NULL,0,NO, NULL,      0}, 
        {"图形符号",0,NULL,0,YES,_GetFigure,0}, 
        {"        ",0,NULL,0,NO, NULL,      0} 
    }; 
 
    extern unsigned (*mouseKB)();        /* 虚拟键盘的激活条件 */ 
    extern void _Cdecl _ClearPrompt(int clear_mode); 
 
    unsigned _Cdecl gethan(void) 
    { 
        unsigned h = geth();             /* 从键盘读入一个键码 */ 
 
        /*-- 如果是输入方式切换键,转换输入方式 ----------------*/ 
        if(h>=KEY_Alt_F1 && h<=KEY_Alt_F10) 
        { 
            /*-- 如果该输入方式已被装入,显示或清理提示行 ------*/ 
            if(_Mode[h-KEY_Alt_F1].haveload) 
            { 
                delight_mouse(); 
 
                /*-- 如果提示行尚未弹出,首先弹出提示行 --------*/ 
                if(_DispPrompt==NO) 
                { 
                    _DispPrompt = YES; 
 
                    /*-- 保存提示行位置上原来的图象 -----------*/ 
                    _MoveImage(0,_PromptLine,80,30,0,780-_ScreenTop); 
 
                    /*-- 显示提示行 ---------------------------*/ 
                    _Block(0,_PromptLine,80,30,_PmtBk); 
                    draw_rectangle(0,_PromptLine,640,30,_PmtColor,0xff); 
 
                    /*-- 如果是WINDOS风格的提示行,显示提示框 --*/ 
                    if(_PromptStyle==WIN_STYLE) 
                    { 
                        _Hole( 14,_PromptLine+4, 35,22,DARKGRAY,_PmtBk+8,1); 
                        _Hole( 54,_PromptLine+4, 68,22,DARKGRAY,_PmtBk+8,1); 
                        _Hole(126,_PromptLine+4,100,22,DARKGRAY,_PmtBk+8,1); 
                        _Hole(230,_PromptLine+4,324,22,DARKGRAY,_PmtBk+8,1); 
                        _Hole(558,_PromptLine+4, 28,22,DARKGRAY,_PmtBk+8,1); 
                        _Hole(590,_PromptLine+4,36,22,DARKGRAY,_PmtBk+8,1); 
                    } 
 
                    /*-- 如果是DOS风格的提示行,显示提示分隔符 -*/ 
                    else 
                    { 
                        outxyc(15,_PromptLine+7,_PmtColor,':'); 
                        outxyc(69,_PromptLine+7,_PmtColor,'['); 
                        outxyc(73,_PromptLine+7,_PmtColor,']'); 
                    } 
 
                    /*-- 显示西文字符输入提示 -----------------*/ 
                    outxys(2,_PromptLine+7,_PmtColor,_AscMode?"全角":"半角"); 
 
                    /*-- 如果鼠标虚拟键盘已装入,显示其提示符 --*/ 
                    if(mouseKB) 
                        outxys(74,_PromptLine+7,_PmtColor,"键盘"); 
                } 
 
                /*-- 清提示行,显示输入法名称 ------------------*/ 
                _HanMode      = h-KEY_Alt_F1; 
                _PositionCode = 0; 
                _ClearPrompt(0); 
                outxys(7,_PromptLine+7,_PmtColor,_Mode[_HanMode].modename); 
                light_mouse(); 
            } 
 
            /*-- 提示行已弹出,但所要之输入法未安装,故取消提示行 -*/ 
            else if(_DispPrompt) 
            { 
                _DispPrompt = NO; 
                _HanMode    = ALT_F10; 
 
                /*-- 恢复提示行下面原来的图象 -----------------*/ 
                delight_mouse(); 
                _MoveImage(0,780-_ScreenTop,80,30,0,_PromptLine); 
                light_mouse(); 
            } 
        } 
 
        /*-- 如果所需输入模式已安装,进入当前输入模式处理函数 --*/ 
        else if(_Mode[_HanMode].get_han) 
            h = (*(_Mode[_HanMode].get_han))(h); 
 
        /*-- 如果输入为西文字符,并且西文模式为全角方式 --------*/ 
        if(_AscMode==QUANJIAO && isprint(h)) 
        { 
            /*-- 如果在汉字输入模式下,转换汉字的编辑符号 ------*/ 
            if(_HanMode!=ALT_F10) 
            { 
                switch(h) 
                { 
                    case '.':                /* 句号“。”     */ 
                        h = 0xa3a1; 
                        break; 
                    case '/':                /* 顿号“、”     */ 
                        h = 0xa2a1; 
                        break; 
                    case '[':                /* 左书名号“《” */ 
                        h = 0xb6a1; 
                        break; 
                    case ']':                /* 右书名号“》” */ 
                        h = 0xb7a1; 
                        break; 
                    case '\"':               /* 全角双引号     */ 
                        h = _DBQuotation?0xb1a1:0xb0a1; 
                        _DBQuotation = !_DBQuotation; 
                        break; 
                    case '\'':               /* 全角单引号     */ 
                        h = _Quotation?0xafa1:0xaea1; 
                        _Quotation = !_Quotation; 
                        break; 
                } 
            } 
 
            /*-- 如果为半角西文字符,转换为全角字符 ------------*/ 
            if(h==' ') 
                h = 0xa1a1; 
            else if(isprint(h)) 
                h = ((161+h-'!')*256+163); 
        } 
 
        /*-- 返回得到的统一键盘编码 -----------*/ 
        return h; 
    }