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