emwin,动起来,小小计算器

来源:互联网 发布:如何用手机注册淘宝号 编辑:程序博客网 时间:2024/04/30 10:46

界面制作如下:(有些丑,后面可以用皮肤,现在就将就的看着吧)


跟之前一样放一份ucguibuilder自动生成的代码上来,注意,我这边没有更改button的id,直接复制粘帖的控件,所以一样。等下自己更改就行了。

/*********************************************************************                      uCGUIBuilder                            ****                  Version:   4.0.0.0                          ****                     2012 / 04                               ****                   CpoyRight to: wyl                          ****              Email:ucguibuilder@163.com                        ****          This text was Created by uCGUIBuilder               ********************************************************************/#include <stddef.h>#include "GUI.h"#include "DIALOG.h"#include "WM.h"#include "BUTTON.h"#include "CHECKBOX.h"#include "DROPDOWN.h"#include "EDIT.h"#include "FRAMEWIN.h"#include "LISTBOX.h"#include "MULTIEDIT.h"#include "RADIO.h"#include "SLIDER.h"#include "TEXT.h"#include "PROGBAR.h"#include "SCROLLBAR.h"#include "LISTVIEW.h"//EventsFunctionList//EndofEventsFunctionList/***********************************************************************       static data************************************************************************/#define GUI_ID_BUTTON10   GUI_ID_USER+1/***********************************************************************       Dialog resource** This table conatins the info required to create the dialog.* It has been created by ucGUIbuilder.*/static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {    { FRAMEWIN_CreateIndirect,  "Caption",           0,                       0,  0,  320,240,FRAMEWIN_CF_MOVEABLE,0},    { EDIT_CreateIndirect,       NULL,               GUI_ID_EDIT0,            3,  3,  222,32, 0,0},    { BUTTON_CreateIndirect,    "7",                 GUI_ID_BUTTON0,          3,  41, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "4",                 GUI_ID_BUTTON1,          3,  86, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "1",                 GUI_ID_BUTTON2,          3,  135,70, 39, 0,0},    { BUTTON_CreateIndirect,    "0",                 GUI_ID_BUTTON3,          3,  183,70, 39, 0,0},    { BUTTON_CreateIndirect,    "8",                 GUI_ID_BUTTON0,          79, 41, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "5",                 GUI_ID_BUTTON1,          79, 86, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "2",                 GUI_ID_BUTTON2,          79, 135,70, 39, 0,0},    { BUTTON_CreateIndirect,    ".",                 GUI_ID_BUTTON3,          79, 183,70, 39, 0,0},    { BUTTON_CreateIndirect,    "9",                 GUI_ID_BUTTON0,          155,41, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "6",                 GUI_ID_BUTTON1,          155,86, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "3",                 GUI_ID_BUTTON2,          155,135,70, 39, 0,0},    { BUTTON_CreateIndirect,    "=",                 GUI_ID_BUTTON3,          155,183,70, 39, 0,0},    { BUTTON_CreateIndirect,    "+",                 GUI_ID_BUTTON0,          244,41, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "-",                 GUI_ID_BUTTON1,          244,86, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "*",                 GUI_ID_BUTTON2,          244,135,70, 39, 0,0},    { BUTTON_CreateIndirect,    "/",                 GUI_ID_BUTTON3,          244,183,70, 39, 0,0},    { BUTTON_CreateIndirect,    "CLR",               GUI_ID_BUTTON10,         244,3,  70, 32, 0,0}};/*******************************************************************      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)**      Function: to initialize the Dialog items**                                                      **      call this function in _cbCallback --> WM_PAINT*****************************************************************/void PaintDialog(WM_MESSAGE * pMsg){    WM_HWIN hWin = pMsg->hWin;}/*******************************************************************      FunctionName:void InitDialog(WM_MESSAGE * pMsg)**      Function: to initialize the Dialog items**                                                      **      call this function in _cbCallback --> WM_INIT_DIALOG*****************************************************************/void InitDialog(WM_MESSAGE * pMsg){    WM_HWIN hWin = pMsg->hWin;    //    //FRAMEWIN    //    FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);    FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);    FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);    //    //GUI_ID_EDIT0    //    EDIT_SetText(WM_GetDialogItem(hWin,GUI_ID_EDIT0),"EDIT0");}/***********************************************************************       Dialog callback routine*/static void _cbCallback(WM_MESSAGE * pMsg) {    int NCode, Id;    WM_HWIN hWin = pMsg->hWin;    switch (pMsg->MsgId)     {        case WM_PAINT:            PaintDialog(pMsg);            break;        case WM_INIT_DIALOG:            InitDialog(pMsg);            break;        case WM_KEY:            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)             {                case GUI_KEY_ESCAPE:                    GUI_EndDialog(hWin, 1);                    break;                case GUI_KEY_ENTER:                    GUI_EndDialog(hWin, 0);                    break;            }            break;        case WM_NOTIFY_PARENT:            Id = WM_GetId(pMsg->hWinSrc);             NCode = pMsg->Data.v;                    switch (Id)             {                case GUI_ID_OK:                    if(NCode==WM_NOTIFICATION_RELEASED)                        GUI_EndDialog(hWin, 0);                    break;                case GUI_ID_CANCEL:                    if(NCode==WM_NOTIFICATION_RELEASED)                        GUI_EndDialog(hWin, 0);                    break;            }            break;        default:            WM_DefaultProc(pMsg);    }}/***********************************************************************       MainTask************************************************************************/void MainTask(void) {     GUI_Init();    WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */    WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */    //PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);    //FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);    //PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);    //BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);    //CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);    //DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);    //SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);    //SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);    //HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);    //RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);while(1){        GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);}}
这份代码放到模拟器里是能够显示了,但是没有功能而已,所以接下来我们给他增加功能。同样去除不必要的代码,增加功能代码,代码如下:

/*********************************************************************                      uCGUIBuilder                            ****                  Version:   4.0.0.0                          ****                     2012 / 04                               ****                   CpoyRight to: wyl                          ****              Email:ucguibuilder@163.com                        ****          This text was Created by uCGUIBuilder               ********************************************************************/#include <stddef.h>#include <stdio.h>#include "GUI.h"#include "DIALOG.h"#include "WM.h"#include "BUTTON.h"#include "EDIT.h"#include "FRAMEWIN.h"/*用户自定义ID,保证需要使用的控件有不同的ID*/#define GUI_ID_BUTTON_POINT     (GUI_ID_USER+1)#define GUI_ID_BUTTON_ENTER     (GUI_ID_USER+2)#define GUI_ID_BUTTON_CLR       (GUI_ID_USER+3)#define GUI_ID_BUTTON_ADD       (GUI_ID_USER+4)#define GUI_ID_BUTTON_SUB       (GUI_ID_USER+5)#define GUI_ID_BUTTON_MULT      (GUI_ID_USER+6)#define GUI_ID_BUTTON_DIV       (GUI_ID_USER+7)/*加减乘除的四个宏*/#define O_ADD   (0)#define O_SUB   (1)#define O_MULT  (2)#define O_DIV   (3)static float a,b,c;//计算器的三个操作数static int Operation;//计算器的操作符/*计算器的资源链表*/static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] ={    { FRAMEWIN_CreateIndirect,  "Caption",           0,                       0,  0,  320,240,0,0},    { EDIT_CreateIndirect,       NULL,               GUI_ID_EDIT0,            3,  3,  222,32, 0,0},    { BUTTON_CreateIndirect,    "0",                 GUI_ID_BUTTON0,          3,  183,70, 39, 0,0},    { BUTTON_CreateIndirect,    "1",                 GUI_ID_BUTTON1,          3,  135,70, 39, 0,0},    { BUTTON_CreateIndirect,    "2",                 GUI_ID_BUTTON2,          79, 135,70, 39, 0,0},    { BUTTON_CreateIndirect,    "3",                 GUI_ID_BUTTON3,          155,135,70, 39, 0,0},    { BUTTON_CreateIndirect,    "4",                 GUI_ID_BUTTON4,          3,  86, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "5",                 GUI_ID_BUTTON5,          79, 86, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "6",                 GUI_ID_BUTTON6,          155,86, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "7",                 GUI_ID_BUTTON7,          3,  41, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "8",                 GUI_ID_BUTTON8,          79, 41, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "9",                 GUI_ID_BUTTON9,          155,41, 70, 39, 0,0},    { BUTTON_CreateIndirect,    ".",                 GUI_ID_BUTTON_POINT,          79, 183,70, 39, 0,0},    { BUTTON_CreateIndirect,    "+",                 GUI_ID_BUTTON_ADD,          244,41, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "-",                 GUI_ID_BUTTON_SUB,          244,86, 70, 39, 0,0},    { BUTTON_CreateIndirect,    "*",                 GUI_ID_BUTTON_MULT,          244,135,70, 39, 0,0},    { BUTTON_CreateIndirect,    "/",                 GUI_ID_BUTTON_DIV,          244,183,70, 39, 0,0},    { BUTTON_CreateIndirect,    "=",                 GUI_ID_BUTTON_ENTER,          155,183,70, 39, 0,0},    { BUTTON_CreateIndirect,    "CLR",               GUI_ID_BUTTON_CLR,         244,3,  70, 32, 0,0}};/*计算器的绘制函数*/void PaintDialog(WM_MESSAGE * pMsg){    WM_HWIN hWin = pMsg->hWin;}/*计算器的初始化函数*/void InitDialog(WM_MESSAGE * pMsg){    WM_HWIN hWin = pMsg->hWin;    //FRAMEWIN    FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);    FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);    FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);    //EDIT    EDIT_SetMaxLen(WM_GetDialogItem(hWin, GUI_ID_EDIT0), 30);//设定EDIT的长度    EDIT_SetFont(WM_GetDialogItem(hWin, GUI_ID_EDIT0), &GUI_Font24_ASCII);//把字体改到和编辑框大小一致}/*计算器的回调函数*/static void _cbCallback(WM_MESSAGE * pMsg){    int NCode, Id;    WM_HWIN hWin = pMsg->hWin;    WM_HWIN hEdit = WM_GetDialogItem(hWin, GUI_ID_EDIT0);    char str[30] = "";        switch (pMsg->MsgId)    {        case WM_PAINT:            PaintDialog(pMsg);//绘制计算器            break;        case WM_INIT_DIALOG:            InitDialog(pMsg);//初始化计算器            break;        case WM_NOTIFY_PARENT:            Id = WM_GetId(pMsg->hWinSrc);            NCode = pMsg->Data.v;            if (NCode == WM_NOTIFICATION_RELEASED)//如果按钮已被释放;如果缺省这句会执行3次(即BUTTON的3个通知代码)            {                switch (Id)                {                    case GUI_ID_BUTTON0:                    case GUI_ID_BUTTON1:                    case GUI_ID_BUTTON2:                    case GUI_ID_BUTTON3:                    case GUI_ID_BUTTON4:                    case GUI_ID_BUTTON5:                    case GUI_ID_BUTTON6:                    case GUI_ID_BUTTON7:                    case GUI_ID_BUTTON8:                    case GUI_ID_BUTTON9:                        EDIT_AddKey(hEdit, Id-GUI_ID_BUTTON0+'0');                        break;                    case GUI_ID_BUTTON_POINT:                        EDIT_AddKey(hEdit, '.');                        break;                    case GUI_ID_BUTTON_CLR:                        EDIT_SetText(hEdit, "");                        break;                    case GUI_ID_BUTTON_ADD:                    case GUI_ID_BUTTON_SUB:                    case GUI_ID_BUTTON_MULT:                    case GUI_ID_BUTTON_DIV:                        Operation = Id-GUI_ID_BUTTON_ADD;                        EDIT_GetText(hEdit, str, 30);                        sscanf(str,"%f",&a);                        EDIT_SetText(hEdit,"");                        break;                    case GUI_ID_BUTTON_ENTER:                    {                        EDIT_GetText(hEdit, str, 30);                        sscanf(str,"%f",&b);                        EDIT_SetText(hEdit,"");                        switch (Operation)                        {                            case O_ADD:                                c = a + b;sprintf(str,"%f",c);                                break;                            case O_SUB:                                c = a - b;sprintf(str,"%f",c);                                break;                            case O_MULT:                                c = a * b;sprintf(str,"%f",c);                                break;                            case O_DIV://保证被除数不等于0if(b != 0){c = a / b;sprintf(str,"%f",c);}else{sprintf(str,"%s","ERROR");}                                break;                        }                        EDIT_SetText(hEdit, str);                    }                    break;                }            }            break;        default:            WM_DefaultProc(pMsg);    }}/*GUI初始化*/void MainTask(void){    GUI_Init();    WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */    WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */    while (1)    {        GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);    }}
这份代码,就只支持2元操作,可能还有其他问题。就先这样吧,以后再做,添加其他功能等。



0 0
原创粉丝点击