www.pudn.com > cwin.rar > HANENV.H
/************************************************************
头文件 HANENV.H : 应用程序中文用户界面软件包 HANENV
的定义和说明
作 者 : 刘路放
日 期 : 1995.7
************************************************************/
#include
#include
/*-----------------------------------------------------------
第一部分 : 基础与环境
定义逻辑常数
EGA/VGA图形模式12H的显示存储器和寄存器操作
鼠标操作
键盘操作
使用扩充内存
HANENV系统的初始化和退出
-----------------------------------------------------------*/
/*-----------------------------------------------------------
1.定义逻辑常数
-----------------------------------------------------------*/
#ifndef NO
#define NO 0
#define YES 1
#endif
/*-----------------------------------------------------------
2.EGA/VGA图形模式12H的有关定义和操作
-----------------------------------------------------------*/
/*------------------- 省缺颜色常数 ------------------------*/
#if !defined(__COLORS)
#define __COLORS
enum COLORS
{
BLACK, /* 黑 */
BLUE, /* 蓝 */
GREEN, /* 绿 */
CYAN, /* 青 */
RED, /* 红 */
MAGENTA, /* 洋红 */
BROWN, /* 棕 */
LIGHTGRAY, /* 浅灰 */
DARKGRAY, /* 深灰 */
LIGHTBLUE, /* 亮蓝 */
LIGHTGREEN, /* 亮绿 */
LIGHTCYAN, /* 亮青 */
LIGHTRED, /* 亮红 */
LIGHTMAGENTA, /* 亮洋红 */
YELLOW, /* 黄 */
WHITE /* 白 */
};
#endif
#define EDGE_COLOR 16 /* 屏幕边缘色 */
/*---------------- 说明屏幕窗口的全局变量 -----------------*/
extern int _ScreenTop; /* 当前屏幕首行位置 */
extern int _ScreenWidth; /* 逻辑屏幕宽度(以字节为单位) */
extern int _ScreenHigh; /* 逻辑屏幕高度(以象素为单位) */
extern int _WindowLeft; /* 屏幕显示窗口左上角列坐标 */
extern int _WindowTop; /* 屏幕显示窗口左上角行坐标 */
extern int _WindowHigh; /* 屏幕显示窗口高度 */
extern int _VideoBusy; /* 是否正在操作VGA寄存器组 */
/*----- 向屏幕写操作的类型(_SetWriteMode函数的参数) -------*/
#define PUT_MODE 0 /* 新数据覆盖屏上原有数据 */
#define AND_MODE 0x08 /* 新数据和屏上原有数据作与运算 */
#define OR_MODE 0x10 /* 新数据和屏上原有数据作或运算 */
#define XOR_MODE 0x18 /* 新数据和屏上原有数据作异或运算 */
/*---------- 对EGA/VGA图形模式12H的操作函数(宏) -----------*/
void _Cdecl _SetWriteMode (int write_mode);
void _Cdecl close_display (void);
void _Cdecl open_display (void);
void _Cdecl get_color (int color_no,int *red,int *green,int *blue);
void _Cdecl set_color (int color_no,int red,int green,int blue);
void _Cdecl change_color (int color,int new_color);
char **_Cdecl getblock (int col,int line,int width,int high);
void _Cdecl putblock (int col,int line,int width,int high,char **block);
void _Cdecl _MoveImage (int col1,int y1,int width,int h,int col2,int y2);
void _Cdecl _Block (int col,int line,int width,int high,int color);
void _Cdecl _SmoothScroll (int x,int y);
#define set_screen_width(width) (_ScreenWidth = (width))
#define set_screen_high(high) (_ScreenHigh = (high))
#define split_screen(high) (_WindowHigh = (high))
#define smooth_scroll(x,y) (_VideoBusy=1,_SmoothScroll(x,(_WindowTop=(y))),_VideoBusy=0)
/*-----------------------------------------------------------
3.鼠标操作
-----------------------------------------------------------*/
/*------------- 说明鼠标工作状态的全局变量 ----------------*/
extern int _HaveMouse; /* 鼠标装载成功标记 */
extern int _MouseLight; /* 当前鼠标光标是否显示 */
extern int _MouseCol; /* 当前鼠标光标列坐标(单位为象素) */
extern int _MouseRow; /* 当前鼠标光标行坐标(单位为象素) */
extern int _MouseColor; /* 鼠标光标颜色 */
extern int _MouseBk; /* 鼠标光标边缘颜色 */
extern int _MouseLeft; /* 鼠标活动范围左上角列坐标 */
extern int _MouseTop; /* 鼠标活动范围左上角行坐标 */
extern int _MouseRight; /* 鼠标活动范围右下角列坐标 */
extern int _MouseBottom; /* 鼠标活动范围右下角行坐标 */
/* (以上4个变量值的单位均为象素) */
/*-------------- 对鼠标的操作函数(宏) ---------------------*/
void _Cdecl reset_mouse (void);
void _Cdecl light_mouse (void);
void _Cdecl delight_mouse (void);
int _Cdecl get_mouse_status(int *x,int *y);
void _Cdecl set_mouse_pos (int x,int y);
int _Cdecl mouse_pressed (int which_button,int *x,int *y,int *count);
int _Cdecl mouse_release (int which_button,int *x,int *y,int *count);
void _Cdecl set_mouse_range (int left,int top,int right,int bottom);
void _Cdecl get_mouse_range (int *left,int *top,int *right,int *bottom);
void _Cdecl till_mouse_pop (int which_button);
void _Cdecl mouse_moved (int *dx,int *dy);
#define havemouse() _HaveMouse
#define ismouselight() _MouseLight
#define mousecolor() _MouseColor
#define mousebk() _MouseBk
#define mousecol() _MouseCol
#define mouserow() _MouseRow
#define set_mouse_color(color,bk) (_MouseColor=(color),_MouseBk=(bk))
#define mouse_enter(l,t,r,b) (_MouseCol>=(l)&&_MouseCol<=(r)&&_MouseRow>=(t)&&_MouseRow<=(b))
/*-----------------------------------------------------------
4.键盘操作
-----------------------------------------------------------*/
/*---------- 触发器的类型定义及全局变量的说明 -------------*/
typedef struct /* 触发器类型的定义 */
{
unsigned press_key; /* 按键触发事件 */
unsigned mouse_affair; /* 鼠标触发事件 */
int left; /* 鼠标左边界(单位为象素) */
int top; /* 鼠标上边界(单位为象素) */
int right; /* 鼠标右边界(单位为象素) */
int bottom; /* 鼠标下边界(单位为象素) */
unsigned (*trigger)(unsigned h); /* 事件函数 */
}TRIGGER;
extern int _TriggerCount; /* 触发器个数 */
extern TRIGGER _Triggers[]; /* 触发器 */
extern unsigned (*mouseKB)(); /* 虚拟键盘激活条件 */
extern int _DoublePressTime; /* 双击鼠标按钮时间 */
extern void (*_GethFunction)(); /* geth函数的内部函数 */
extern void *_GethParameter; /* geth函数的函数参数 */
/*-------------- 键盘操作函数的说明 -----------------------*/
#define set_double_press_time(time) (_DoublePressTime=(time))
unsigned _Cdecl geth (void);
int _Cdecl double_press (unsigned key);
void _Cdecl ungetstr (char *string);
void _Cdecl ungeth (unsigned h);
unsigned _Cdecl mouse_keyboard(unsigned h);
void _Cdecl load_MKB (unsigned key);
void _Cdecl enableMKB (void);
void _Cdecl disableMKB (void);
void _Cdecl set_mouse_KB (int x,int y,unsigned color,int left,int top,int right,int bottom);
void _Cdecl free_MKB (void);
int _Cdecl isins (void);
int _Cdecl isedit (unsigned key);
/*-------------- HANENV系统的统一键盘编码定义 -------------*/
/*-- 功能键 F1 - F10 ----------------------*/
#define KEY_F1 315
#define KEY_F2 316
#define KEY_F3 317
#define KEY_F4 318
#define KEY_F5 319
#define KEY_F6 320
#define KEY_F7 321
#define KEY_F8 322
#define KEY_F9 323
#define KEY_F10 324
/*-- 复合功能键 Ctrl+F1 - Ctrl+F10 --------*/
#define KEY_Ctr_F1 350
#define KEY_Ctr_F2 351
#define KEY_Ctr_F3 352
#define KEY_Ctr_F4 353
#define KEY_Ctr_F5 354
#define KEY_Ctr_F6 355
#define KEY_Ctr_F7 356
#define KEY_Ctr_F8 357
#define KEY_Ctr_F9 358
#define KEY_Ctr_F10 359
/*-- 复合功能键 Alt+F1 - Alt+F10 ----------*/
#define KEY_Alt_F1 360
#define KEY_Alt_F2 361
#define KEY_Alt_F3 362
#define KEY_Alt_F4 363
#define KEY_Alt_F5 364
#define KEY_Alt_F6 365
#define KEY_Alt_F7 366
#define KEY_Alt_F8 367
#define KEY_Alt_F9 368
#define KEY_Alt_F10 369
/*-- 复合功能键 Shift+F1 - Shift+F10 ------*/
#define KEY_Shift_F1 340
#define KEY_Shift_F2 341
#define KEY_Shift_F3 342
#define KEY_Shift_F4 343
#define KEY_Shift_F5 344
#define KEY_Shift_F6 345
#define KEY_Shift_F7 346
#define KEY_Shift_F8 347
#define KEY_Shift_F9 348
#define KEY_Shift_F10 349
/*-- 数字小键盘上的功能键 -----------------*/
#define KEY_Home 327
#define KEY_Up 328
#define KEY_PgUp 329
#define KEY_Left 331
#define KEY_Right 333
#define KEY_End 335
#define KEY_Down 336
#define KEY_PgDn 337
#define KEY_Ins 338
#define KEY_Del 339
/*-- 左 Shift 键与数字小键盘的功能键复合 --*/
#define KEY_LS_Left 587
#define KEY_LS_Up 584
#define KEY_LS_Right 589
#define KEY_LS_Down 592
#define KEY_LS_Home 583
#define KEY_LS_End 591
#define KEY_LS_PgUp 585
#define KEY_LS_PgDn 593
/*-- 右 Shift 键与数字小键盘的功能键复合 --*/
#define KEY_RS_Left 459
#define KEY_RS_Up 456
#define KEY_RS_Right 461
#define KEY_RS_Down 464
#define KEY_RS_Home 455
#define KEY_RS_End 463
#define KEY_RS_PgUp 457
#define KEY_RS_PgDn 465
/*-- Ctrl 键与数字小键盘的功能键复合 ------*/
#define KEY_Ctr_Home 375
#define KEY_Ctr_PgUp 388
#define KEY_Ctr_Left 371
#define KEY_Ctr_Right 372
#define KEY_Ctr_End 373
#define KEY_Ctr_PgDn 374
/*-- Alt, Ctrl 和 Shift 键 tab 键的复合 ---*/
#define KEY_Alt_Tab 321
#define KEY_Ctr_Tab 304
#define KEY_Shift_Tab 271
/*-- Alt 键 + 字母键 ----------------------*/
#define KEY_Alt_A 286
#define KEY_Alt_B 304
#define KEY_Alt_C 302
#define KEY_Alt_D 288
#define KEY_Alt_E 274
#define KEY_Alt_F 289
#define KEY_Alt_G 290
#define KEY_Alt_H 291
#define KEY_Alt_I 279
#define KEY_Alt_J 292
#define KEY_Alt_K 293
#define KEY_Alt_L 294
#define KEY_Alt_M 306
#define KEY_Alt_N 305
#define KEY_Alt_O 280
#define KEY_Alt_P 281
#define KEY_Alt_Q 272
#define KEY_Alt_R 275
#define KEY_Alt_S 287
#define KEY_Alt_T 276
#define KEY_Alt_U 278
#define KEY_Alt_V 303
#define KEY_Alt_W 273
#define KEY_Alt_X 301
#define KEY_Alt_Y 277
#define KEY_Alt_Z 300
/*-- Alt 键 + 数字键 ----------------------*/
#define KEY_Alt_1 376
#define KEY_Alt_2 377
#define KEY_Alt_3 378
#define KEY_Alt_4 379
#define KEY_Alt_5 380
#define KEY_Alt_6 381
#define KEY_Alt_7 382
#define KEY_Alt_8 383
#define KEY_Alt_9 384
#define KEY_Alt_0 385
#define KEY_Alt_MINUS 386
#define KEY_Alt_EQUAL 387
/*-- Ctrl 键 + 字母键 ---------------------*/
#define KEY_Ctr_A 641
#define KEY_Ctr_B 642
#define KEY_Ctr_C 643
#define KEY_Ctr_D 644
#define KEY_Ctr_E 645
#define KEY_Ctr_F 646
#define KEY_Ctr_G 647
#define KEY_Ctr_H 648
#define KEY_Ctr_I 649
#define KEY_Ctr_J 650
#define KEY_Ctr_K 651
#define KEY_Ctr_L 652
#define KEY_Ctr_M 653
#define KEY_Ctr_N 654
#define KEY_Ctr_O 655
#define KEY_Ctr_P 656
#define KEY_Ctr_Q 657
#define KEY_Ctr_R 658
#define KEY_Ctr_S 659
#define KEY_Ctr_T 660
#define KEY_Ctr_U 661
#define KEY_Ctr_V 662
#define KEY_Ctr_W 663
#define KEY_Ctr_X 664
#define KEY_Ctr_Y 665
#define KEY_Ctr_Z 666
/*-- 常用的 ASCII 码 ----------------------*/
#define Beep 0x07
#define Backspace 0x08
#define KEY_ENTER 0x0d
#define KEY_ESC 0x1b
#define KEY_SPACE 0x20
/*-- 鼠标按扭按下或释放的组合情况 ---------*/
#define NO_BUTTON 400
#define LEFT_BUTTON 401
#define RIGHT_BUTTON 402
#define L_R_BUTTON 403
/*-----------------------------------------------------------
5.使用扩充存储器
-----------------------------------------------------------*/
/*--- 通过INT15H使用扩充内存的数据类型和全局变量的定义 ----*/
typedef struct /* 保护地址模式下段的描述符类型定义 */
{
unsigned size; /* 读写缓冲区长度 */
unsigned baselow; /* 基地址低位字 */
unsigned char basehigh; /* 基地址高位字节 */
unsigned char attr; /* 存取权 */
unsigned blank; /* 保留字 */
}Descriptor; /* 描述符类型 */
typedef struct /* 全局描述符表GDT类型 */
{
Descriptor BlankDsc; /* 空地址描述符 */
Descriptor GDTDsc; /* 本GDT表的地址描述符 */
Descriptor Source; /* 源数据块地址描述符 */
Descriptor Destin; /* 目标数据块地址描述符 */
Descriptor BiosCS; /* ROM BIOS代码地址描述符 */
Descriptor BiosSS; /* ROM BIOS堆栈地址描述符 */
}GDT; /* 全局描述符表GDT类型 */
extern long _CurrentEMM; /* 当前自由扩充存储器地址 */
extern GDT _MemCtrlBlock; /* 全局描述符表GDT的说明 */
/*----------- 通过INT15H使用扩充内存的函数说明 ------------*/
void _Cdecl _Init_GDT (void);
unsigned _Cdecl _GetEMMsize (void);
void _Cdecl _SetSourAddr(long addr,unsigned size);
void _Cdecl _SetDestAddr(long addr,unsigned size);
void _Cdecl _MoveDataEMM(unsigned size);
long _Cdecl _LoadEMM (FILE *file,long size);
/*- 通过XMS规范使用扩充内存所用的数据结构和全局变量的定义 -*/
struct EMB /* 扩充内存移动结构定义 */
{
unsigned long len; /* 需传输的数据字节数(32位) */
unsigned sour_han; /* 源数据块句柄 */
unsigned long sour_off; /* 源偏移量(32位) */
unsigned dest_han; /* 目标数据块句柄 */
unsigned long dest_off; /* 目标偏移量(32位) */
};
extern struct EMB _Emb; /* 扩充内存移动结构变量 */
extern int _LargestXMS; /* 最大自由扩充内存块尺寸 */
extern int _AmountOfXMS;/* 剩余自由扩充内存数量总和 */
extern void far (*_FunctionXMS)(); /* XMS服务程序入口地址 */
/*----------- 通过XMS规范使用扩充内存的函数说明 -----------*/
void _Cdecl init_XMS (void);
void _Cdecl _SizeofXMS (void);
int _Cdecl _GetXMS (int size);
int _Cdecl _ChangeXMS (int handle,int size);
void _Cdecl _FreeXMS (int handle);
void _Cdecl _MoveDataXMS(void);
int _Cdecl _LoadXMS (FILE *file,long size);
int _Cdecl getblockXMS (int left,int top,int right,int bottom);
void _Cdecl putblockXMS (int left,int top,int right,int bottom,int handle);
#define sizeofXMS() _AmountOfXMS
#define largestXMS() _LargestXMS
#define haveXMS() ((int)_FunctionXMS)
/*-----------------------------------------------------------
6.HANENV系统的初始化和退出
-----------------------------------------------------------*/
/*--------- HANENV系统的错误检查变量和函数的说明 ----------*/
extern int _ErrorNo; /* 某些函数将其出错码放在此变量中 */
int _Cdecl han_error(void);
/*------------ HANENV系统的初始化等函数的说明 -------------*/
extern void interrupt far (*_Oldint1CH)(); /* 原中断1CH地址*/
extern void interrupt far (*_Oldint09H)();
extern void interrupt far (*_Oldint23H)();
extern void far (*_Int1CHfun[])(); /* 时钟处理程序向量 */
void interrupt _Newint1CH(void);
void interrupt _Newint09H(void);
void interrupt _Newint23H(void);
void _Cdecl _SaveEnv (void);
void _Cdecl _LoadEnv (void);
void _Cdecl init_hanenv (void);
void _Cdecl close_hanenv (void);
int _Cdecl call_DOS (char *envname);
/*-----------------------------------------------------------
第二部分 : 汉字处理
汉字库
汉字显示
正文方式与光标
汉字输入模块
-----------------------------------------------------------*/
/*-----------------------------------------------------------
1.有关汉字库的数据类型定义、全局变量和函数说明
-----------------------------------------------------------*/
typedef struct /* 汉字库类型 */
{
int fontwidth; /* 点阵宽(以字节为单位) */
int fonthigh; /* 点阵高(以象素为单位) */
unsigned char *codelist; /* 指向小字库索引表的指针 */
int wherefont; /* 字库装载位置 */
int fontcount; /* 字库中的字模数量 */
FILE *fontfile; /* 字库文件名 */
unsigned long EMM_addr; /* 字库在扩充内存中的地址 */
int fonthandle; /* 字库在XMS扩充内存中的句柄 */
unsigned char *fontbuff; /* 字库区在常规内存中的指针 */
}HZK;
/* 汉字库的装载位置定义 */
#define DSK 0 /* 汉字库在硬盘中 */
#define EMM 1 /* 汉字库在扩充内存中 */
#define XMS 2 /* 汉字库在XMS扩充内存中 */
#define MEM 3 /* 小字库在内存中 */
extern HZK *_CurrentHZK; /* 当前汉字库结构变量的指针 */
HZK *_Cdecl load_HZK(int width,int high,char *hzkname,unsigned char *codelist,int wherefont);
HZK *_Cdecl free_HZK(HZK *hzk);
int _Cdecl takefont(unsigned h);
/*-----------------------------------------------------------
2.汉字和西文字符的显示
-----------------------------------------------------------*/
/*--------------- HANENV系统的判定函数(宏) ----------------*/
#define isSP(h) ((unsigned)(h)>0xa0a0)
#define ishan(s) (*((unsigned *)(s))>0xa0a0)
int _Cdecl isscan (unsigned h);
/*----- 有关汉字和西文字符显示的全局变量和函数的说明 ------*/
#define CHAR_HIGH 18 /* ASCII码高度(行高) */
#define HORIZONTAL 0 /* 横向显示字模点阵 */
#define VERTICAL 1 /* 纵向显示字模点阵 */
#define SOLIDLINE 0 /* 字模笔划用实线填充 */
#define DOTTEDLINE 1 /* 字模笔划用实线填充 */
extern unsigned char _ChrFont[]; /* 标准ASCII码字模点阵 */
extern unsigned char _HanFont[]; /* 汉字显示缓冲区 */
extern int _Xtimes; /* 横向放大倍数 */
extern int _Ytimes; /* 纵向放大倍数 */
extern int _FontDirection; /* 点阵显示方向 */
extern int _FontBkStyle; /* 字模笔划填充方式 */
#define set_xtimes(times) (_Xtimes=(times))
#define set_ytimes(times) (_Ytimes=(times))
#define set_font_direction(direction) (_FontDirection=(direction))
#define set_font_bk_style(style) (_FontBkStyle=(style))
void _Cdecl _DrawF (int x,int y,int width,int high,int color,unsigned char *font);
void _Cdecl _OutF (int col,int line,int width,int high,int color,unsigned char *font);
void _Cdecl _DrawFont(int x,int y,int width,int high,int color,unsigned char *font);
void _Cdecl _OutFont (int col,int line,int width,int high,int color,unsigned char *font);
unsigned char *_Cdecl takehan(unsigned char *string,unsigned *h);
void _Cdecl drawxys (int x,int y,int color,char *s);
void _Cdecl drawxystr(int x,int y,int color,char *string);
void _Cdecl outxys (int col,int line,int color,char *string);
void _Cdecl outxystr (int col,int line,int color,char *string);
void _Cdecl putxys (int col,int line,int color,int bk,char *string);
void _Cdecl putxystr (int col,int line,int color,int bk,char *string);
#define drawxyc(x,y,color,ch) _DrawF(x,y,1,CHAR_HIGH,color,_ChrFont+(ch)*CHAR_HIGH)
#define outxyc(col,line,color,ch) _OutF(col,line,1,CHAR_HIGH,color,_ChrFont+(ch)*CHAR_HIGH)
#define putxyc(col,line,color,bk,ch) _Block(col,line,1,CHAR_HIGH,bk),outxyc(col,line,color,ch)
#define drawxychar(x,y,color,ch) _DrawFont(x,y,1,CHAR_HIGH,color,_ChrFont+(ch)*CHAR_HIGH)
#define outxychar(col,line,color,ch) _OutFont(col,line,1,CHAR_HIGH,color,_ChrFont+(ch)*CHAR_HIGH)
#define putxychar(col,line,color,bk,ch) _Block(col,line,_Xtimes,CHAR_HIGH*_Ytimes,bk),outxychar(col,line,color,ch)
#define drawxyh(x,y,color,han) takefont(han),_DrawF(x,y,_CurrentHZK->fontwidth,_CurrentHZK->fonthigh,color,_HanFont)
#define outxyh(col,line,color,han) takefont(han),_OutF(col,line,_CurrentHZK->fontwidth,_CurrentHZK->fonthigh,color,_HanFont)
#define putxyh(col,line,color,bk,han) _Block(col,line,_CurrentHZK->fontwidth,_CurrentHZK->fonthigh,bk),outxyh(col,line,color,han)
#define drawxyhan(x,y,color,han) takefont(han),_DrawFont(x,y,_CurrentHZK->fontwidth,_CurrentHZK->fonthigh,color,_HanFont)
#define outxyhan(col,line,color,han) takefont(han),_OutFont(col,line,_CurrentHZK->fontwidth,_CurrentHZK->fonthigh,color,_HanFont)
#define putxyhan(col,line,color,bk,han) _Block(col,line,_Xtimes*_CurrentHZK->fontwidth,_CurrentHZK->fonthigh*_Ytimes,bk),outxyhan(col,line,color,han)
/*---------------- 扩充微型西文 ASCII 字符 ----------------*/
#define UP_ARROW 127 /* 向上箭头 */
#define DOWN_ARROW 128 /* 向下箭头 */
#define RIGHT_ARROW 129 /* 向右箭头 */
#define LEFT_ARROW 130 /* 向左箭头 */
#define SMALL_BAR 131 /* 矩形块 */
extern unsigned char _TinyFonts[]; /* 微型ASCII码字模点阵 */
#define drawxyt(x,y,c,ch) (_DrawF(x,y,1,8,c,_TinyFonts+((ch)-' ')*8))
void _Cdecl drawxytiny (int x,int y,int color,char *s);
/*-----------------------------------------------------------
3.正文方式下的汉字和字符显示函数
-----------------------------------------------------------*/
extern int _TextCol; /* 当前光标列坐标(单位为字节) */
extern int _TextLine; /* 当前光标行坐标(单位为象素) */
extern int _TextColor; /* 当前正文前景色 */
extern int _Background; /* 当前正文背景色 */
extern int _TextWinLeft; /* 正文窗口左列坐标(单位为字节) */
extern int _TextWinTop; /* 正文窗口顶行坐标(单位为象素) */
extern int _TextWinRight; /* 正文窗口右列坐标(单位为字节) */
extern int _TextWinBottom; /* 正文窗口底行坐标(单位为象素) */
#define set_text_color(color) (_TextColor=(color))
#define set_background(color) (_Background=(color))
#define set_window(l,t,r,b) (_TextWinLeft=(l),_TextWinTop=(t),_TextWinRight=(r),_TextWinBottom=(b))
#define get_window(l,t,r,b) (l=_TextWinLeft,t=_TextWinTop,r=_TextWinRight,b=_TextWinBottom)
#define outc(ch) outxyc(_TextCol,_TextLine,_TextColor,ch)
#define outchar(ch) outxychar(_TextCol,_TextLine,_TextColor,ch)
#define outh(han) outxyh(_TextCol,_TextLine,_TextColor,han)
#define outhan(han) outxyhan(_TextCol,_TextLine,_TextColor,han)
void _Cdecl outh1 (unsigned h,int whichhalf);
void _Cdecl outhan1 (unsigned h,int whichhalf);
void _Cdecl outs (char *string);
void _Cdecl outstr (char *string);
void _Cdecl putnstr (char *string,int width);
/*------------------ 光标操作函数(宏) ---------------------*/
#define movecursor(x,y) (_TextCol=(x),_TextLine=(y))
#define iscursorlight() ((int)_Int1CHfun[1])
void far _CursorFun (void);
void _Cdecl setcursor (int width,int high,int line,int speed,int color);
void _Cdecl lightcursor (void);
void _Cdecl delightcursor(void);
void _Cdecl scroll_up (int high);
void _Cdecl scroll_down (int high);
/*-----------------------------------------------------------
4.汉字输入模块
-----------------------------------------------------------*/
/*------------- 定义汉字输入提示行风格 --------------------*/
#define WIN_STYLE 0 /* WINDOWS 风格 */
#define DOS_STYLE 1 /* DOS 风格 */
/*------------ 汉字输入法模块的类型定义 -------------------*/
typedef struct
{
char modename[9]; /* 汉字输入法名称 */
int maxcodes; /* 码表长度 */
char *codeset; /* 输入法所用按键集合 */
int wildchar; /* 通用替代键 */
int haveload; /* 该汉字输入法是否已经装载 */
unsigned (*get_han)(); /* 汉字输入法模块指针 */
int wherecodes; /* 码表位置 */
FILE *codefile; /* 码表文件 */
long filefront; /* 码表文件头指针 */
long filelen; /* 码表文件长度 */
int handle; /* 码表在XMS扩充内存的句柄 */
unsigned long EMM_addr; /* 码表在扩充内存中的地址 */
}MODE_TYPE;
/*-------------------- 全局变量定义 -----------------------*/
extern int _HanMode; /* 当前汉字输入方法 */
extern int _PromptStyle; /* 提示行风格 */
extern int _PmtColor; /* 提示行字符颜色 */
extern int _PmtBk; /* 提示行背景颜色 */
extern int _DispPrompt; /* 提示行是否弹出 */
extern int _PromptLine; /* 提示行位置 */
extern int _SectionCode; /* 区码 */
extern int _PositionCode; /* 位码 */
extern MODE_TYPE _Mode[]; /* 汉字输入法参数 */
/*------------- 汉字输入法切换功能键定义 ------------------*/
#define ALT_F1 0 /* 功能键 Alt+F1 */
#define ALT_F2 1 /* 功能键 Alt+F2 */
#define ALT_F3 2 /* 功能键 Alt+F3 */
#define ALT_F4 3 /* 功能键 Alt+F4 */
#define ALT_F5 4 /* 功能键 Alt+F5 */
#define ALT_F6 5 /* 功能键 Alt+F6 */
#define ALT_F7 6 /* 功能键 Alt+F7 */
#define ALT_F8 7 /* 功能键 Alt+F8 */
#define ALT_F9 8 /* 功能键 Alt+F9 */
#define ALT_F10 9 /* 功能键 Alt+F10 */
/*-------------- 汉字输入模块函数说明 ---------------------*/
#define set_prompt_style(color,bk,style) (_PmtColor=(color),_PmtBk=(bk),_PromptStyle=(style))
#define set_prompt_line(line) (_PromptLine=(line))
unsigned _Cdecl _GetSP (unsigned h);
unsigned _Cdecl _GetAscii (unsigned h);
unsigned _Cdecl _GetFigure (unsigned h);
unsigned _Cdecl _SetAscMode (unsigned h);
unsigned _Cdecl _GetNewCode (unsigned h);
unsigned _Cdecl _GetPY (unsigned h);
unsigned _Cdecl _GetSY (unsigned h);
void _Cdecl _ClearPrompt (int clear_mode);
void _Cdecl set_asc_mode (void);
int _Cdecl set_han_mode (int altfn,char *modename,unsigned (*get_han)(),char *codefile,int wherecodes);
void _Cdecl free_han_mode (int altfn);
unsigned _Cdecl gethan (void);
/*-----------------------------------------------------------
第三部分 : 用户界面
点、线、框、曲线
仿WINDOWS窗口式界面的构件函数
菜单设计
全屏幕数据录入函数
定时器
字符串处理函数
表达式与计算器
-----------------------------------------------------------*/
/*-----------------------------------------------------------
1.屏幕作图函数
-----------------------------------------------------------*/
void _Cdecl _PutPixel (int x,int y,int color);
int _Cdecl _GetPixel (int x,int y);
void _Cdecl _H_Line (int x,int y,int len,int color,unsigned char pattern);
void _Cdecl _V_Line (int x,int y,int len,int color,unsigned char pattern);
void _Cdecl draw_rectangle(int x,int y,int width,int high,int color,unsigned char pattern);
void _Cdecl draw_line (int x1,int y1,int x2,int y2,int color);
void _Cdecl _Bar (int x,int y,int width,int hight,int color,unsigned long pattern);
/*------------- 画弧(扇形的填充参数 -----------------------*/
#define ONLY_ARC 0 /* 只画弧线 */
#define DRAW_SECTOR 1 /* 画空心扇形 */
#define FILL_SECTOR 2 /* 画实心扇形 */
void _Cdecl _DrawArc (int col,int row,int a,int b,int t1,int t2,int color,int fill);
#define draw_circle(x,y,r,color) _DrawArc(x,y,r,r,0,360,color,ONLY_ARC)
#define draw_arc(x,y,r,t1,t2,color) _DrawArc(x,y,r,r,t1,t2,color,ONLY_ARC)
#define draw_pie(x,y,r,color) _DrawArc(x,y,r,r,0,360,color,FILL_SECTOR)
#define draw_fan(x,y,r,t1,t2,color) _DrawArc(x,y,r,r,t1,t2,color,FILL_SECTOR)
#define draw_ellipse(x,y,a,b,color) _DrawArc(x,y,a,b,0,360,color,ONLY_ARC)
/*-- 西文制表符画线、框的线型(用于填写以下函数的参数type) -*/
#define SINGLE 0 /* 单线 */
#define DOUBLE 1 /* 双线 */
void _Cdecl char_rectangle(int col,int line,int width,int high,int type);
void _Cdecl char_v_line (int col,int line,int len,int type);
void _Cdecl char_h_line (int col,int line,int len,int type);
/*-----------------------------------------------------------
2.仿WINDOWS窗口式界面的构件函数
-----------------------------------------------------------*/
/*- 按钮颜色(用于填写使用按键的函数的颜色参数及_BarColor) -*/
#define BLUE_BAR 0x891f
#define GREEN_BAR 0x8a2f
#define CYAN_BAR 0x8b3f
#define RED_BAR 0x8c4f
#define MAGENTA_BAR 0x8d5f
#define BROWN_BAR 0x8e6f
#define GRAY_BAR 0x8f70
extern unsigned _BarColor; /* 按钮颜色 : 0- 3 -- 前景色
4- 7 -- 背景色
8-11 -- 阳边色
12-15 -- 暗边色 */
extern int _TitleColor; /* 标题前景色 */
extern int _TitleBk; /* 标题背景色 */
extern int _EditColor; /* 编辑框前景色 */
extern int _EditBk; /* 编辑框背景色 */
extern int _TabColor; /* 表格前景色 */
extern int _TabBk; /* 表格背景色 */
extern int _BoxLineColor; /* 画框颜色 */
extern int _MouseSpeed; /* 鼠标响应速度 */
#define set_bar_color(c) (_BarColor=(c))
#define set_edit_color(c) (_EditColor=(c))
#define set_edit_bk(b) (_EditBk=(b))
#define set_title_color(c) (_TitleColor=(c))
#define set_title_bk(b) (_TitleBk=(b))
#define set_tab_color(c) (_TabColor=(c))
#define set_tab_bk(b) (_TabBk=(b))
#define set_mouse_speed(s) (_MouseSpeed=(s))
void _Cdecl _Hole (int x,int y,int width,int high,int color1,
int color2,int thickness);
void _Cdecl _Box (int x,int y,int width,int high);
void _Cdecl scroll_h_box(int x,int y,int len,int pagesize,
unsigned key,int range,int *n,int *oldpos);
void _Cdecl scroll_v_box(int x,int y,int len,int pagesize,
unsigned key,int range,int *n,int *oldpos);
void _Cdecl dispinfo (int col,int line,int width,int high,
char *prompt);
int _Cdecl ask (int col,int line,int width,int high,
char *title,char *prompt);
unsigned _Cdecl getinfo (int col,int line,int width,int high,
char *prompt,int twolines,int type,void *v,
int *len,int dec,char *set,double l1,
double l2);
unsigned _Cdecl getcode (int col,int line,int width,int high,
char *title,int n,char *codelist[],int *no,
int mark);
unsigned _Cdecl _GetCode (int col,int line,int width,int high,
char *title,int n,void (*getrec)(),int *no);
unsigned _Cdecl dir_menu (int col,int line,int high,char *path,
int attrib,int full_width,void (*fun)(),
int multiselect);
unsigned _Cdecl ascii_list (int col,int line,int *no);
void _Cdecl SP_list (int col,int line);
unsigned _Cdecl palette (int col,int line,char *buffer);
void _Cdecl prnscr (int x1,int y1,int x2,int y2,int margin,
unsigned palette);
/*-----------------------------------------------------------
3.菜单设计
-----------------------------------------------------------*/
/*----------- 有关按键式菜单的按键类型的定义 --------------*/
typedef struct /* 按键类型定义 */
{
int x; /* 按键左上角相对于菜单的列坐标 */
int y; /* 按键左上角相对于菜单的行坐标 */
int w; /* 按键宽 */
int h; /* 按键高 */
/* 以上4个参数的单位均为象素 */
unsigned butncolor; /* 正常按键颜色 */
unsigned pushcolor; /* 被选中的按键颜色 */
/* 以上两个参数均可用按钮颜色宏 */
unsigned fonttimes; /* 按键名的放大倍数(第0字节为横
向放大倍数,第1字节为纵向放大
倍数,如不放大则此参数填257) */
char *name; /* 按键名 */
unsigned key; /* 按下该按键时菜单函数的返回值 */
unsigned pressed; /* 与该菜单按键同功能的键盘键码 */
int high; /* 按键厚度(单位为象素,可为0) */
int lock; /* 按键是否被锁住 */
unsigned (*fun)(); /* 按下按键时执行的功能模块指针 */
}BUTTON_TYPE;
/*------------ 有关按键式菜单的结构类型定义 ---------------*/
typedef struct /* 按键式菜单类型 */
{
int col; /* 菜单左上角列坐标(单位为字节) */
int line; /* 菜单左上角行坐标(单位为象素) */
int width; /* 菜单宽度(单位为字节) */
int high; /* 菜单高度(单位为象素) */
int arrow_ctrl; /* 可否用键盘控制菜单 */
int fixed; /* 菜单是否固定 */
int left; /* 菜单移动范围:左边界(字节) */
int top; /* 菜单移动范围:上边界(象素) */
int right; /* 菜单移动范围:右边界(字节) */
int bottom; /* 菜单移动范围:下边界(象素) */
unsigned quit_key1; /* 退出菜单所用键 */
unsigned quit_key2; /* 退出菜单所用键 */
unsigned press_key1; /* 选择菜单项目所用键 */
unsigned press_key2; /* 选择菜单项目所用键 */
unsigned forward1; /* 向前移动当前菜单条目所用键 */
unsigned forward2; /* 向前移动当前菜单条目所用键 */
unsigned backward1; /* 向后移动当前菜单条目所用键 */
unsigned backward2; /* 向后移动当前菜单条目所用键 */
BUTTON_TYPE *buttons; /* 指向按键表的指针 */
int button_count; /* 按键个数 */
int pop_up; /* 菜单是否已经弹出 */
int current; /* 当前菜单条目的序号 */
int saveimage; /* 是否存储菜单背景 */
char **block; /* 菜单背景存储指针 */
void (*disp_fun)(); /* 显示菜单轮廓图样函数(可为空) */
}BUTTON_MENU;
void _Cdecl _DrawButton(BUTTON_TYPE button,int col,int line,int chameleon,int op);
unsigned _Cdecl button_menu(BUTTON_MENU *b,unsigned h);
/*-------- 有关图标式菜单的菜单条目的结构类型定义 ---------*/
typedef struct /* 图标类型 */
{
int x; /* 图标左上角列坐标(单位为象素) */
int y; /* 图标左上角行坐标(单位为象素) */
int width; /* 图标宽(单位为象素) */
int high; /* 图标高(单位为象素) */
char *title; /* 条目标题 */
unsigned key; /* 返回值 */
void (*draw_icon)(); /* 图标绘制函数 */
unsigned (*fun)(); /* 选中本条目时执行的功能 */
}ICON_TYPE;
/*------------- 有关图标式菜单的结构类型定义 --------------*/
typedef struct /* 图标式菜单类型 */
{
int x; /* 条目标题的列坐标(单位为字节) */
int y; /* 条目标题的行坐标(单位为象素) */
int width; /* 条目标题的宽度(单位为字节) */
int arrow_ctrl; /* 可否用键盘控制菜单 */
unsigned forward1; /* 向前移动当前菜单条目所用键 */
unsigned forward2; /* 向前移动当前菜单条目所用键 */
unsigned backward1; /* 向后移动当前菜单条目所用键 */
unsigned backward2; /* 向后移动当前菜单条目所用键 */
unsigned press_key1; /* 选择当前菜单条目所用键 */
unsigned press_key2; /* 选择当前菜单条目所用键 */
int icon_count; /* 图标数量 */
ICON_TYPE *icons; /* 指向图标表的指针 */
int current; /* 当前菜单条目的序号 */
int mouse_x; /* 当前鼠标列坐标 */
int mouse_y; /* 当前鼠标行坐标 */
}ICON_MENU;
unsigned _Cdecl icon_menu(ICON_MENU *menu);
/*-----------------------------------------------------------
4.全屏幕数据录入函数
该族函数受以下全局变量的影响:
_Xtimes和_Ytimes -- 字符的横向和纵向放大倍数;
_EditColor和_EditBk -- 编辑时字符及编辑区背景颜色;
_TextColor和_Background -- 退出编辑后字符及编辑区颜色。
该族函数的参数col以字节为单位,line以象素为单位,width以
字符为单位。
-----------------------------------------------------------*/
unsigned _Cdecl getxya(int col,int line,int width,char *string,char *picture);
unsigned _Cdecl getxyb(int col,int line,int *value);
unsigned _Cdecl getxyc(int col,int line,int *value,char *set);
unsigned _Cdecl getxyd(int col,int line,struct date *d);
unsigned _Cdecl getxyf(int col,int line,int width,double *value,int dec,double limit1,double limit2);
unsigned _Cdecl getxyi(int col,int line,int width,int *value,int limit1,int limit2);
unsigned _Cdecl getxyl(int col,int line,int width,long *value,long limit1,long limit2);
unsigned _Cdecl getxyp(int col,int line,int width,char *s);
unsigned _Cdecl getxys(int col,int line,int width,char *string,int *slen);
unsigned _Cdecl getxyt(int col,int line,int width,int high,char *string);
/*-----------------------------------------------------------
5.时钟与定时器
-----------------------------------------------------------*/
typedef struct /* 定时器类型的定义 */
{
struct date d; /* 日期 */
struct time t; /* 时间 */
int tag; /* 闹钟激活方式 */
unsigned (*fun)(); /* 事件函数 */
}ALARM;
/* 定义闹钟激活方式 */
#define PER_SECOND 0 /* 每秒激活 */
#define PER_MINATE 1 /* 每分钟激活 */
#define PER_HOUR 2 /* 每小时激活 */
#define PER_DAY 3 /* 每日激活 */
#define PER_MONTH 4 /* 每月激活 */
#define PER_YEAR 5 /* 每年激活 */
#define ONCE_ONLY 6 /* 只在指定时间激活一次 */
extern ALARM *_Alarm[]; /* 定时器表 */
extern int _AlarmCount; /* 定时器个数 */
void _Cdecl set_clock (int col,int line,int xtimes,int ytimes,int color,int bk);
void _Cdecl run_clock (void);
void _Cdecl light_clock(void);
void _Cdecl close_clock(void);
int _Cdecl set_alarm (struct date date,struct time time,int type,unsigned (*fun)());
void _Cdecl del_alarm (int alarm_no);
/*-----------------------------------------------------------
6.字符串处理函数
-----------------------------------------------------------*/
char *_Cdecl space(int len);
char *_Cdecl trim (char *string);
char *_Cdecl ltrim(char *string);
char *_Cdecl skipspace(char *string);
/*-----------------------------------------------------------
7.表达式与计算器
-----------------------------------------------------------*/
/*------------------ 表达式函数的错误码 -------------------*/
#define NO_ERROR 0 /* 无语法错误 */
#define NULL_EXPRESSION 201 /* 空表达式 */
#define NONCOMPLETE_EXP 202 /* 表达式不完全 */
#define NO_RIGHT_BRACKET 203 /* 缺少右括号 */
#define HAVE_NOT_ITEM 204 /* 表达式缺项 */
#define NO_RIGHT_QUOTATION 205 /* 缺少右引号 */
#define CONTINUOUS_OPTION 207 /* 连续的运算符 */
#define ITEM_TYPE_WRONG 208 /* 运算对象类型错误 */
#define SQRT_OF_NEGATIVE 209 /* 求负数的平方根 */
#define LOG_OF_NEGATIVE 210 /* 求0和负数的对数 */
#define IS_NOT_FUNCTION 211 /* 函数名拼写错误 */
#define TOO_MUCH_OP 212 /* 运算符过多 */
#define WRONG_NUMERAL 213 /* 数值错误 */
extern int _ResultType;
extern char _ResultString[];
double _Cdecl expression(char *string);
double _Cdecl calcultor (int col,int line);