www.pudn.com > cwin.rar > CAL.C
/*-----------------------------------------------------------
程序模块 cal.c : 计算器
-----------------------------------------------------------*/
#include
#include
#include
#include
/*-- 函数名 - 功能键定义 ------------------*/
#define SIN KEY_F2
#define COS KEY_F3
#define TAN KEY_F4
#define ATG KEY_F5
#define LN KEY_F6
#define LG KEY_F7
#define EXP KEY_F8
#define POW KEY_F9
#define SQR KEY_F10
#define ABS KEY_Shift_F2
#define MAX KEY_Shift_F3
#define MIN KEY_Shift_F4
#define INT KEY_Shift_F5
#define RND KEY_Shift_F6
#define MOD KEY_Shift_F7
#define HEX KEY_Shift_F8
#define PI KEY_Shift_F9
/*-- 计算器所用汉字和符号的字模点阵 -------*/
static unsigned char _CalFonts[]=
{
0,0,31,240,16,16,16,16,0,32,0,32,0,64,0,128,0,128,1,0,1,0,1,0,2,0,2,0,2,0,0,0,
0,0,7,192,8,32,16,16,16,16,16,16,8,32,7,192,8,32,16,16,16,16,16,16,16,16,8,32,7,192,0,0,
0,0,7,128,8,64,16,32,16,32,16,32,16,32,8,96,7,160,0,32,0,64,0,64,0,128,1,0,6,0,0,0,
0,0,0,0,1,0,1,0,1,0,1,0,1,0,63,248,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,8,0,56,0,255,254,56,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,15,224,16,16,32,8,32,0,32,0,32,0,32,0,32,0,32,8,16,16,15,224,0,0,0,0,0,0,0,0,
0,0,1,128,1,128,2,128,2,128,4,128,4,128,8,128,8,128,16,128,16,128,63,240,0,128,0,128,3,224,0,0,
0,0,31,224,16,0,16,0,16,0,16,0,23,128,24,64,16,32,0,32,0,32,0,64,0,64,3,128,28,0,0,0,
0,0,1,128,2,0,4,0,8,0,8,0,16,0,23,128,24,64,16,32,16,32,16,32,16,32,8,64,7,128,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,12,0,16,0,32,0,64,0,64,0,128,0,128,0,128,0,128,0,128,0,128,0,64,0,64,0,32,0,16,0,12,
0,0,0,0,0,0,31,248,36,64,4,64,4,64,4,64,4,64,4,64,8,80,16,32,0,0,0,0,0,0,0,0,
0,0,1,0,3,0,5,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,7,192,0,0,
0,0,7,128,8,64,16,32,16,32,0,32,0,32,0,64,0,128,1,0,2,0,4,0,8,16,16,16,31,240,0,0,
0,0,7,224,8,16,0,16,0,32,0,64,1,192,0,32,0,16,0,16,0,16,0,16,0,32,0,192,15,0,0,0,
0,0,0,0,0,0,16,16,8,32,4,64,2,128,1,0,2,128,4,64,8,32,16,16,0,0,0,0,0,0,0,0,
96,0,16,0,8,0,4,0,4,0,2,0,2,0,2,0,2,0,2,0,2,0,4,0,4,0,8,0,16,0,96,0,
0,0,112,28,32,8,32,8,32,8,32,8,63,248,32,8,32,8,32,8,32,8,112,28,0,0,0,0,0,0,0,0,
0,0,7,192,8,32,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8,32,7,192,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,48,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,48,0,16,0,32,0,0,0,
0,0,0,0,0,4,0,8,0,16,0,32,0,64,0,128,1,0,2,0,4,0,8,0,16,0,32,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,63,248,0,0,0,0,63,248,0,0,0,0,0,0,0,0,0,0,0,0,
8,64,73,64,42,64,8,132,255,254,25,8,44,136,74,136,16,136,254,144,34,80,34,32,20,80,24,136,37,14,66,4,
16,4,19,254,18,4,18,4,255,252,18,32,22,36,27,254,50,32,210,32,19,252,21,4,21,4,21,4,89,252,33,4,
2,16,65,32,48,0,23,252,128,0,97,32,34,24,12,8,16,0,39,248,229,40,37,40,37,40,37,40,63,254,32,0,
1,0,1,0,33,8,33,8,33,8,33,8,63,248,33,8,1,0,65,4,65,4,65,4,65,4,65,4,127,252,64,4,
1,0,1,8,127,252,1,0,1,16,63,248,1,0,1,4,255,254,3,16,4,160,12,64,52,48,196,142,5,4,6,0,
0,128,64,128,32,128,32,128,0,136,15,252,224,128,33,0,33,64,34,32,34,16,36,24,40,8,80,0,143,254,0,0,
0,128,0,160,0,144,0,132,255,254,0,128,0,128,62,128,8,128,8,64,8,64,8,32,15,34,112,18,32,10,0,4,
0,128,16,128,12,128,4,128,0,132,255,254,1,4,1,4,2,4,2,132,4,100,8,36,16,4,32,4,64,40,0,16,
2,0,1,0,127,254,64,2,132,68,12,48,16,24,32,8,0,0,63,248,1,0,1,0,1,0,1,4,255,254,0,0,
32,64,32,64,36,64,62,72,81,252,144,72,16,72,254,72,16,72,85,254,84,64,84,160,84,160,125,16,70,14,4,4,
0,4,3,254,252,32,16,64,17,252,17,4,17,36,17,36,17,36,17,36,29,36,241,36,65,36,0,88,0,132,3,2,
1,0,1,0,1,0,9,32,9,16,17,12,17,4,33,16,65,16,1,32,1,64,0,128,1,0,2,0,12,0,112,0,
2,0,2,0,2,4,255,254,4,0,4,0,8,0,8,8,31,252,40,8,72,8,136,8,8,8,8,8,15,248,8,8,
16,8,16,60,19,192,16,64,252,64,16,68,23,254,24,64,48,64,208,64,19,248,18,8,18,8,18,8,83,248,34,8,
0,16,31,248,16,16,16,16,16,16,31,240,0,4,255,254,4,0,8,0,31,240,0,16,0,16,0,16,0,160,0,64,
1,8,127,136,1,8,1,8,1,8,63,8,32,8,32,8,65,8,127,136,1,8,1,8,1,8,17,8,10,8,4,8,
0,16,67,248,48,0,16,0,0,8,7,252,240,128,16,128,17,0,17,32,18,16,23,248,16,8,40,0,71,254,0,0,
32,128,62,252,73,32,159,240,16,16,31,240,16,16,31,240,16,16,31,240,8,32,255,254,8,32,8,32,16,32,32,32,
16,64,18,68,31,126,40,160,69,16,136,16,8,16,23,254,48,16,81,16,144,144,16,144,16,16,16,16,16,80,16,32,
0,128,64,136,47,252,33,0,1,64,2,64,231,248,32,64,32,64,32,72,47,252,32,64,32,64,80,64,143,254,0,0,
16,64,16,64,35,248,32,64,72,64,251,252,17,36,32,168,66,32,249,36,7,254,0,64,28,96,224,144,65,12,2,4,
1,0,17,16,9,32,1,8,127,252,1,0,5,64,9,48,17,16,1,0,255,254,2,128,4,64,8,32,16,28,96,8,
0,4,127,132,18,36,18,36,18,36,255,164,18,36,18,36,18,4,35,20,65,8,127,252,1,0,1,4,255,254,0,0,
16,144,16,144,16,144,29,252,32,144,32,144,123,254,144,0,17,248,125,8,17,8,17,248,21,8,25,8,17,248,1,8,
4,0,4,64,15,224,16,64,32,128,95,240,16,16,17,16,17,16,17,16,17,16,17,16,2,192,4,48,24,24,96,8,
0,8,127,252,1,0,17,16,9,16,9,32,9,32,1,4,255,254,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
4,0,3,0,1,0,0,4,255,254,4,0,4,16,7,248,4,16,4,16,4,16,8,16,8,16,16,16,32,160,64,64,
16,8,17,252,17,8,17,8,253,248,17,8,57,8,53,248,85,68,81,72,145,48,17,32,17,16,17,78,17,132,17,0,
1,0,1,32,1,16,127,252,1,0,33,8,25,24,9,160,1,64,5,32,9,16,17,14,97,4,1,0,5,0,2,0,
0,16,0,16,0,16,252,16,5,254,4,16,72,16,41,16,16,144,16,144,40,16,36,16,68,16,128,16,0,80,0,32,
0,0,31,240,0,32,0,64,65,132,81,20,73,52,69,68,65,4,69,68,73,52,81,20,69,4,66,4,127,252,64,4,
2,0,2,16,7,248,4,16,12,32,18,64,1,128,6,0,24,0,224,8,15,252,8,8,8,8,8,8,15,248,8,8,
0,8,67,252,50,8,18,8,3,248,0,0,224,8,39,252,32,64,32,68,47,254,32,160,40,160,49,16,34,14,4,4,
0,16,64,16,32,16,23,252,0,16,0,16,241,16,16,144,16,144,16,16,16,16,16,80,16,32,40,0,71,254,0,0,
2,0,2,32,7,240,8,32,24,64,37,128,2,128,12,136,113,252,2,8,12,16,50,32,1,64,1,128,14,0,112,0,
8,64,8,68,15,254,16,64,16,64,51,248,82,8,147,248,18,8,19,248,18,8,19,248,18,8,18,8,31,254,16,0
};
/*-- 计算器用小字库 -----------------------*/
HZK _CalXZK =
{
2,16,
"789+←C456-(π123×)H0.,/=数据溢出表达式为空缺项少右括号引运算符连续类型错负平方根求对函名误过多值",
3,48,NULL,0L,0,_CalFonts
};
/*-- 内部函数说明 -----------------------------------------*/
static void _Cdecl _DisplayCal(BUTTON_MENU *c);
static void _SetCalcultor(BUTTON_MENU *c,int col,int line);
/*-------- 内部函数 _SetCalcultor : 初始化计算器 ----------*/
static void _SetCalcultor(BUTTON_MENU *c,int col,int line)
{
int i;
c->col = col;
c->line = line;
c->width = 40;
c->high = 130;
c->fixed = NO;
c->arrow_ctrl = NO;
c->pop_up = 0;
c->quit_key1 = KEY_ESC;
c->quit_key2 = RIGHT_BUTTON;
c->press_key1 = ' ';
c->press_key2 = ' ';
c->forward1 = KEY_Down;
c->forward2 = KEY_Right;
c->backward1 = KEY_Up;
c->backward2 = KEY_Left;
c->disp_fun = _DisplayCal;
c->buttons = (BUTTON_TYPE *)malloc(40*sizeof(BUTTON_TYPE));
c->button_count = 40;
c->current = 0;
c->left = 0;
c->top = 0;
c->right = 639;
c->bottom = 419;
c->saveimage = YES;
c->buttons[0].x = 12;
c->buttons[0].y = 33;
c->buttons[0].w = 23;
c->buttons[0].h = 22;
c->buttons[0].butncolor = GRAY_BAR;
c->buttons[0].name = "7";
c->buttons[0].key = '7';
c->buttons[0].pressed = '7';
c->buttons[1].x = 36;
c->buttons[1].y = 33;
c->buttons[1].w = 23;
c->buttons[1].h = 22;
c->buttons[1].butncolor = GRAY_BAR;
c->buttons[1].name = "8";
c->buttons[1].key = '8';
c->buttons[1].pressed = '8';
c->buttons[2].x = 60;
c->buttons[2].y = 33;
c->buttons[2].w = 23;
c->buttons[2].h = 22;
c->buttons[2].butncolor = GRAY_BAR;
c->buttons[2].name = "9";
c->buttons[2].key = '9';
c->buttons[2].pressed = '9';
c->buttons[3].x = 84;
c->buttons[3].y = 33;
c->buttons[3].w = 23;
c->buttons[3].h = 22;
c->buttons[3].butncolor = GRAY_BAR;
c->buttons[3].name = "+";
c->buttons[3].key = '+';
c->buttons[3].pressed = '+';
c->buttons[4].x = 108;
c->buttons[4].y = 33;
c->buttons[4].w = 23;
c->buttons[4].h = 22;
c->buttons[4].butncolor = GRAY_BAR;
c->buttons[4].name = "←";
c->buttons[4].key = Backspace;
c->buttons[4].pressed = Backspace;
c->buttons[5].x = 148;
c->buttons[5].y = 33;
c->buttons[5].w = 31;
c->buttons[5].h = 22;
c->buttons[5].butncolor = CYAN_BAR;
c->buttons[5].name = "sin";
c->buttons[5].key = SIN;
c->buttons[5].pressed = SIN;
c->buttons[6].x = 180;
c->buttons[6].y = 33;
c->buttons[6].w = 31;
c->buttons[6].h = 22;
c->buttons[6].butncolor = CYAN_BAR;
c->buttons[6].name = "ln";
c->buttons[6].key = LN;
c->buttons[6].pressed = LN;
c->buttons[7].x = 212;
c->buttons[7].y = 33;
c->buttons[7].w = 31;
c->buttons[7].h = 22;
c->buttons[7].butncolor = CYAN_BAR;
c->buttons[7].name = "sqr";
c->buttons[7].key = SQR;
c->buttons[7].pressed = SQR;
c->buttons[8].x = 244;
c->buttons[8].y = 33;
c->buttons[8].w = 31;
c->buttons[8].h = 22;
c->buttons[8].butncolor = CYAN_BAR;
c->buttons[8].name = "int";
c->buttons[8].key = INT;
c->buttons[8].pressed = INT;
c->buttons[9].x = 284;
c->buttons[9].y = 33;
c->buttons[9].w = 23;
c->buttons[9].h = 22;
c->buttons[9].butncolor = RED_BAR;
c->buttons[9].name = "C";
c->buttons[9].key = KEY_ENTER;
c->buttons[9].pressed = KEY_ENTER;
c->buttons[10].x = 12;
c->buttons[10].y = 56;
c->buttons[10].w = 23;
c->buttons[10].h = 22;
c->buttons[10].butncolor = GRAY_BAR;
c->buttons[10].name = "4";
c->buttons[10].key = '4';
c->buttons[10].pressed = '4';
c->buttons[11].x = 36;
c->buttons[11].y = 56;
c->buttons[11].w = 23;
c->buttons[11].h = 22;
c->buttons[11].butncolor = GRAY_BAR;
c->buttons[11].name = "5";
c->buttons[11].key = '5';
c->buttons[11].pressed = '5';
c->buttons[12].x = 60;
c->buttons[12].y = 56;
c->buttons[12].w = 23;
c->buttons[12].h = 22;
c->buttons[12].butncolor = GRAY_BAR;
c->buttons[12].name = "6";
c->buttons[12].key = '6';
c->buttons[12].pressed = '6';
c->buttons[13].x = 84;
c->buttons[13].y = 56;
c->buttons[13].w = 23;
c->buttons[13].h = 22;
c->buttons[13].butncolor = GRAY_BAR;
c->buttons[13].name = "-";
c->buttons[13].key = '-';
c->buttons[13].pressed = '-';
c->buttons[14].x = 108;
c->buttons[14].y = 56;
c->buttons[14].w = 23;
c->buttons[14].h = 22;
c->buttons[14].butncolor = GRAY_BAR;
c->buttons[14].name = "(";
c->buttons[14].key = '(';
c->buttons[14].pressed = '(';
c->buttons[15].x = 148;
c->buttons[15].y = 56;
c->buttons[15].w = 31;
c->buttons[15].h = 22;
c->buttons[15].butncolor = CYAN_BAR;
c->buttons[15].name = "cos";
c->buttons[15].key = COS;
c->buttons[15].pressed = COS;
c->buttons[16].x = 180;
c->buttons[16].y = 56;
c->buttons[16].w = 31;
c->buttons[16].h = 22;
c->buttons[16].butncolor = CYAN_BAR;
c->buttons[16].name = "lg";
c->buttons[16].key = LG;
c->buttons[16].pressed = LG;
c->buttons[17].x = 212;
c->buttons[17].y = 56;
c->buttons[17].w = 31;
c->buttons[17].h = 22;
c->buttons[17].butncolor = CYAN_BAR;
c->buttons[17].name = "abs";
c->buttons[17].key = ABS;
c->buttons[17].pressed = ABS;
c->buttons[18].x = 244;
c->buttons[18].y = 56;
c->buttons[18].w = 31;
c->buttons[18].h = 22;
c->buttons[18].butncolor = CYAN_BAR;
c->buttons[18].name = "rnd";
c->buttons[18].key = RND;
c->buttons[18].pressed = RND;
c->buttons[19].x = 284;
c->buttons[19].y = 56;
c->buttons[19].w = 23;
c->buttons[19].h = 22;
c->buttons[19].butncolor = GRAY_BAR;
c->buttons[19].name = "π";
c->buttons[19].key = PI;
c->buttons[19].pressed = PI;
c->buttons[20].x = 12;
c->buttons[20].y = 79;
c->buttons[20].w = 23;
c->buttons[20].h = 22;
c->buttons[20].butncolor = GRAY_BAR;
c->buttons[20].name = "1";
c->buttons[20].key = '1';
c->buttons[20].pressed = '1';
c->buttons[21].x = 36;
c->buttons[21].y = 79;
c->buttons[21].w = 23;
c->buttons[21].h = 22;
c->buttons[21].butncolor = GRAY_BAR;
c->buttons[21].name = "2";
c->buttons[21].key = '2';
c->buttons[21].pressed = '2';
c->buttons[22].x = 60;
c->buttons[22].y = 79;
c->buttons[22].w = 23;
c->buttons[22].h = 22;
c->buttons[22].butncolor = GRAY_BAR;
c->buttons[22].name = "3";
c->buttons[22].key = '3';
c->buttons[22].pressed = '3';
c->buttons[23].x = 84;
c->buttons[23].y = 79;
c->buttons[23].w = 23;
c->buttons[23].h = 22;
c->buttons[23].butncolor = GRAY_BAR;
c->buttons[23].name = "×";
c->buttons[23].key = '*';
c->buttons[23].pressed = '*';
c->buttons[24].x = 108;
c->buttons[24].y = 79;
c->buttons[24].w = 23;
c->buttons[24].h = 22;
c->buttons[24].butncolor = GRAY_BAR;
c->buttons[24].name = ")";
c->buttons[24].key = ')';
c->buttons[24].pressed = ')';
c->buttons[25].x = 148;
c->buttons[25].y = 79;
c->buttons[25].w = 31;
c->buttons[25].h = 22;
c->buttons[25].butncolor = CYAN_BAR;
c->buttons[25].name = "tan";
c->buttons[25].key = TAN;
c->buttons[25].pressed = TAN;
c->buttons[26].x = 180;
c->buttons[26].y = 79;
c->buttons[26].w = 31;
c->buttons[26].h = 22;
c->buttons[26].butncolor = CYAN_BAR;
c->buttons[26].name = "exp";
c->buttons[26].key = EXP;
c->buttons[26].pressed = EXP;
c->buttons[27].x = 212;
c->buttons[27].y = 79;
c->buttons[27].w = 31;
c->buttons[27].h = 22;
c->buttons[27].butncolor = CYAN_BAR;
c->buttons[27].name = "max";
c->buttons[27].key = MAX;
c->buttons[27].pressed = MAX;
c->buttons[28].x = 244;
c->buttons[28].y = 79;
c->buttons[28].w = 31;
c->buttons[28].h = 22;
c->buttons[28].butncolor = CYAN_BAR;
c->buttons[28].name = "mod";
c->buttons[28].key = MOD;
c->buttons[28].pressed = MOD;
c->buttons[29].x = 284;
c->buttons[29].y = 79;
c->buttons[29].w = 23;
c->buttons[29].h = 22;
c->buttons[29].butncolor = GRAY_BAR;
c->buttons[29].name = "H";
c->buttons[29].key = 'h';
c->buttons[29].pressed = 'h';
c->buttons[30].x = 12;
c->buttons[30].y = 102;
c->buttons[30].w = 23;
c->buttons[30].h = 22;
c->buttons[30].butncolor = GRAY_BAR;
c->buttons[30].name = "0";
c->buttons[30].key = '0';
c->buttons[30].pressed = '0';
c->buttons[31].x = 36;
c->buttons[31].y = 102;
c->buttons[31].w = 23;
c->buttons[31].h = 22;
c->buttons[31].butncolor = GRAY_BAR;
c->buttons[31].name = ".";
c->buttons[31].key = '.';
c->buttons[31].pressed = '.';
c->buttons[32].x = 60;
c->buttons[32].y = 102;
c->buttons[32].w = 23;
c->buttons[32].h = 22;
c->buttons[32].butncolor = GRAY_BAR;
c->buttons[32].name = ",";
c->buttons[32].key = ',';
c->buttons[32].pressed = ',';
c->buttons[33].x = 84;
c->buttons[33].y = 102;
c->buttons[33].w = 23;
c->buttons[33].h = 22;
c->buttons[33].butncolor = GRAY_BAR;
c->buttons[33].name = "/";
c->buttons[33].key = '/';
c->buttons[33].pressed = '/';
c->buttons[34].x = 108;
c->buttons[34].y = 102;
c->buttons[34].w = 23;
c->buttons[34].h = 22;
c->buttons[34].butncolor = GRAY_BAR;
c->buttons[34].name = "=";
c->buttons[34].key = '=';
c->buttons[34].pressed = '=';
c->buttons[35].x = 148;
c->buttons[35].y = 102;
c->buttons[35].w = 31;
c->buttons[35].h = 22;
c->buttons[35].butncolor = CYAN_BAR;
c->buttons[35].name = "atg";
c->buttons[35].key = ATG;
c->buttons[35].pressed = ATG;
c->buttons[36].x = 180;
c->buttons[36].y = 102;
c->buttons[36].w = 31;
c->buttons[36].h = 22;
c->buttons[36].butncolor = CYAN_BAR;
c->buttons[36].name = "pow";
c->buttons[36].key = POW;
c->buttons[36].pressed = POW;
c->buttons[37].x = 212;
c->buttons[37].y = 102;
c->buttons[37].w = 31;
c->buttons[37].h = 22;
c->buttons[37].butncolor = CYAN_BAR;
c->buttons[37].name = "min";
c->buttons[37].key = MIN;
c->buttons[37].pressed = MIN;
c->buttons[38].x = 244;
c->buttons[38].y = 102;
c->buttons[38].w = 31;
c->buttons[38].h = 22;
c->buttons[38].butncolor = CYAN_BAR;
c->buttons[38].name = "hex";
c->buttons[38].key = HEX;
c->buttons[38].pressed = HEX;
c->buttons[39].x = 276;
c->buttons[39].y = 102;
c->buttons[39].w = 31;
c->buttons[39].h = 22;
c->buttons[39].butncolor = RED_BAR;
c->buttons[39].name = "ESC";
c->buttons[39].key = KEY_ESC;
c->buttons[39].pressed = KEY_ESC;
for(i=0;ibutton_count;i++)
{
c->buttons[i].fun = NULL;
c->buttons[i].high = 1;
c->buttons[i].lock = NO;
c->buttons[i].fonttimes = 257;
c->buttons[i].pushcolor = c->buttons[i].butncolor;
}
}
/*------- 内部函数 _DisplayCal : 显示计算器 ---------------*/
static void _Cdecl _DisplayCal(BUTTON_MENU *c)
{
_Bar (c->col*8,c->line,c->width*8,c->high,LIGHTGRAY,0xffff0000);
draw_rectangle(c->col*8,c->line,c->width*8,c->high,BLACK,0xff);
_Hole(c->col*8+1,c->line+1,c->width*8-2,c->high-2,WHITE,DARKGRAY,3);
_Bar ((c->col+ 2)*8-2,c->line+8,195,CHAR_HIGH,LIGHTBLUE,0xffff0000);
_Bar ((c->col+27)*8-2,c->line+8, 91,CHAR_HIGH,LIGHTBLUE,0xffff0000);
_Hole((c->col+ 2)*8-2,c->line+7,195,CHAR_HIGH+2,DARKGRAY,WHITE,1);
_Hole((c->col+27)*8-2,c->line+7, 91,CHAR_HIGH+2,DARKGRAY,WHITE,1);
}
/*-----------------------------------------------------------
函数 calcultor : 计算器
-----------------------------------------------------------*/
double _Cdecl calcultor(col,line)
int col; /* 计算器左上角的列坐标(以字节为单位) */
int line; /* 计算器左上角的行坐标(以象素为单位) */
{
BUTTON_MENU c; /* 用作计算器的按键式菜单 */
double result = 0.0; /* 计算结果 */
char exp[25]; /* 输入的表达式字符串 */
char string[21]; /* 结果或错误提示字符串 */
HZK *old_HZK = _CurrentHZK; /* 原来的汉字库指针 */
int disp_pos = 0; /* 显示位置指针 */
int exp_pos = 0; /* 表达式字符串的工作指针 */
int i;
unsigned key;
/*-- 将汉字库置为计算器专用小字库 -----*/
_CurrentHZK = &_CalXZK;
/*-- 初始化用作计算器的按键式菜单变量 -*/
_SetCalcultor(&c,col,line);
/*-- 显示计算器 -----------------------*/
button_menu(&c,0);
/*-- 主循环 : 处理菜单按键信息 --------*/
while(1)
{
/*-- 从计算器菜单接收一个键码 -----*/
key = button_menu(&c,geth());
/*-- 如果是退出键则退出计算器 -----*/
if(key==c.quit_key1 || key==c.quit_key2)
break;
/*-- 如果是等号键则计算表达式 -----*/
else if(key=='=')
{
/*-- 计算表达式 ---------------*/
exp[exp_pos] = 0;
key = 0;
result = expression(exp);
/*-- 处理错误信息 -------------*/
switch(_ErrorNo)
{
case NO_ERROR: /* 没有错误则将拷贝结果 */
if(_ResultType=='N')
{
sprintf(string,"%11.7g",expression(exp));
if(strlen(string)>11)
strcpy(string,"数据溢出!");
}
else
strcpy(string,_ResultString);
break;
case NULL_EXPRESSION:
strcpy(string,"表达式为空!");
break;
case NONCOMPLETE_EXP:
strcpy(string,"表达式缺项!");
break;
case NO_RIGHT_BRACKET:
strcpy(string,"缺少右括号!");
break;
case HAVE_NOT_ITEM:
strcpy(string,"表达式缺项!");
break;
case NO_RIGHT_QUOTATION:
strcpy(string,"缺少右引号!");
break;
case CONTINUOUS_OPTION:
strcpy(string,"运算符连续!");
break;
case ITEM_TYPE_WRONG:
strcpy(string,"数据类型错!");
break;
case SQRT_OF_NEGATIVE:
strcpy(string,"负数平方根!");
break;
case LOG_OF_NEGATIVE:
strcpy(string,"0负求对数!");
break;
case IS_NOT_FUNCTION:
strcpy(string,"函数名错误!");
break;
case TOO_MUCH_OP:
strcpy(string,"运算符过多!");
break;
case WRONG_NUMERAL:
strcpy(string,"错误数值!");
break;
}
/*-- 显示计算结果或错误提示信息 ---------------*/
putxys(c.col+27,c.line+8,WHITE,LIGHTBLUE,string);
}
/*-- 如果是清除键则清除表达式及其显示 -------------*/
else if(key==KEY_ENTER)
{
_Block(c.col+ 2,c.line+8,23,CHAR_HIGH,LIGHTBLUE);
_Block(c.col+27,c.line+8,11,CHAR_HIGH,LIGHTBLUE);
exp_pos=disp_pos=0;
}
/*-- 如果是退格键则删除光标前的字符 ---------------*/
else if(key==Backspace && disp_pos)
{
_Block(c.col+2+(--disp_pos),c.line+8,1,CHAR_HIGH,LIGHTBLUE);
--exp_pos;
}
/*-- 处理表达式过长 -------------------------------*/
if(disp_pos>=23)
{
putch(Beep);
continue;
}
/*-- 如果输入键为ASCII码则加入表达式 --------------*/
if(isprint(key))
{
outxyc(c.col+2+disp_pos++,c.line+8,WHITE,key);
exp[exp_pos++] = key;
}
/*-- 如果是函数功能键则将相应的函数名加入表达式 ---*/
else if(key>=SIN && key <=SQR || key>=ABS && key<=PI)
{
switch(key)
{
case SIN:
ungetstr("sin(");
break;
case COS:
ungetstr("cos(");
break;
case TAN:
ungetstr("tan(");
break;
case ATG:
ungetstr("atan(");
break;
case LN:
ungetstr("ln(");
break;
case LG:
ungetstr("lg(");
break;
case EXP:
ungetstr("exp(");
break;
case POW:
ungetstr("pow(");
break;
case SQR:
ungetstr("sqrt(");
break;
case ABS:
ungetstr("abs(");
break;
case MAX:
ungetstr("max(");
break;
case MIN:
ungetstr("min(");
break;
case INT:
ungetstr("int(");
break;
case RND:
ungetstr("round(");
break;
case MOD:
ungetstr("mod(");
break;
case HEX:
ungetstr("hex(");
break;
case PI:
ungetstr("3.141593");
break;
}
}
}
/*-- 恢复原来的汉字库指针 -----------------------------*/
_CurrentHZK = old_HZK;
/*-- 返回计算结果 -------------------------------------*/
return result;
}