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;
}