这次学emwin也是模棱两可,个人有点想往嵌入式GUI方面学习,不知道前景好不好,学了一点之后就想简单的实现一些功能,主要目标值做一个可以在STM32F4开发板上运行的简单菜单界面。
这个是初步实现的页面
虽然感觉不怎么行,但我现在还就是这个水平(哈哈哈哈),个人自我感觉良好,可能审美不行,图片有点丑。。。。
做好页面之后就是实现各个功能了,目前就做了计算器和时钟。不过我主要做的是页面设置,计算表达式的功能就有点实现不了了,数据结构这门课没学好。。下面是我借鉴的这位兄弟的代码的链接。
c语言实现简单的计算机
我能把这个简单的功能做好,还是站在别人的肩膀上做的,看来还是有很多需要学习的。
下面是计算器实现的效果图
嗯,你没看错,很简洁明了,没有其他的什么,它就是一个计算器的页面。他的计算规则是这样的,
把你想要的计算的表达式一并写上,只有点击 “=” 按钮才能得出答案。不过这上面的键的功能并没有全部实现,求余符号“%”还有位运算“《”和“》”以及“+/-”符号的功能没有实现。至于这个计算器还有没有其他BUG还有待调试。
下面是主要代码
#include "DIALOG.h"
#include "WM.h"
#include "GUI.h"
#include "BUTTON.h"
#include "TEXT.h"
#include <stdio.h>
#include <string.h>
#include "counter1.h"
#include <stdlib.h>
/* ------------------------------------自定义消息----------------------------------*/
#define ID_BUTTON_10 (GUI_ID_USER + 0x20)
#define ID_BUTTON_11 (GUI_ID_USER + 0x21)
#define ID_BUTTON_12 (GUI_ID_USER + 0x22)
#define ID_BUTTON_13 (GUI_ID_USER + 0x23)
#define ID_BUTTON_14 (GUI_ID_USER + 0x24)
#define ID_BUTTON_15 (GUI_ID_USER + 0x25)
#define ID_BUTTON_16 (GUI_ID_USER + 0x26)
#define ID_BUTTON_17 (GUI_ID_USER + 0x27)
#define ID_BUTTON_18 (GUI_ID_USER + 0x28)
#define ID_BUTTON_19 (GUI_ID_USER + 0x29)
#define ID_BUTTON_20 (GUI_ID_USER + 0x2A)
#define ID_BUTTON_21 (GUI_ID_USER + 0x2B)
#define ID_BUTTON_22 (GUI_ID_USER + 0x2C)
#define ID_BUTTON_23 (GUI_ID_USER + 0x2D)
#define ID_BUTTON_24 (GUI_ID_USER + 0x2E)
#define ID_BUTTON_25 (GUI_ID_USER + 0x2F)
#define ID_BUTTON_26 (GUI_ID_USER + 0x30)
#define ID_BUTTON_27 (GUI_ID_USER + 0x31)
#define ID_BUTTON_28 (GUI_ID_USER + 0x32)
#define ID_BUTTON_29 (GUI_ID_USER + 0x33)
#define ID_BUTTON_30 (GUI_ID_USER + 0x34)
#define ID_BUTTON_31 (GUI_ID_USER + 0x35)
#define ID_BUTTON_32 (GUI_ID_USER + 0x36)
#define ID_BUTTON_33 (GUI_ID_USER + 0x37)
#define ID_BUTTON_34 (GUI_ID_USER + 0x38)
#define ID_FRAMEWIN_1 (GUI_ID_USER + 0x39)
#define ID_EDIT_0 (GUI_ID_USER + 0x3A)
#define ID_TEXT_5 (GUI_ID_USER + 0x3B)
/*---------------------------------------------------------对话框创建-----------------------------------*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ WINDOW_CreateIndirect, "Window", ID_FRAMEWIN_1, 0, 0, 420, 320, 0, 0, 0 },
{ EDIT_CreateIndirect, "Edit", ID_EDIT_0, 20, 35, 360, 40, 0, 100, 0 },
{ TEXT_CreateIndirect, "Text1", ID_TEXT_5, 160, 0, 66, 22, 0, 0x64, 0 },
{ BUTTON_CreateIndirect, "7", ID_BUTTON_10, 20, 100, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "8", ID_BUTTON_11, 80, 100, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "9", ID_BUTTON_12, 140, 100, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "<<", ID_BUTTON_13, 200, 100, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "C", ID_BUTTON_14, 260, 100, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "", ID_BUTTON_15, 320, 100, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "4", ID_BUTTON_16, 20, 150, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "5", ID_BUTTON_17, 80, 150, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "6", ID_BUTTON_18, 140, 150, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, ">>", ID_BUTTON_19, 200, 150, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "%", ID_BUTTON_20, 260, 150, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "-", ID_BUTTON_21, 320, 150, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "1", ID_BUTTON_27, 20, 200, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "2", ID_BUTTON_22, 80, 200, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "3", ID_BUTTON_23, 140, 200, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "(", ID_BUTTON_24, 200, 200, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "/", ID_BUTTON_25, 260, 200, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "+", ID_BUTTON_26, 320, 200, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "+/-", ID_BUTTON_28, 20, 250, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "0", ID_BUTTON_29, 80, 250, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, ".", ID_BUTTON_30, 140, 250, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, ")", ID_BUTTON_31, 200, 250, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "*", ID_BUTTON_32, 260, 250, 60, 50, 0, 0, 0 },
{ BUTTON_CreateIndirect, "=", ID_BUTTON_33, 320, 250, 60, 50, 0, 0, 0 }
};
/*----------------------------------------------------功能函数模块-----------------------------------*/
char pbuffer1[20]; //全局定义字符数组,最终显示在EDIT 中的内容
static int i = 0; //定义字符数组下表位置
void showtext(WM_HWIN hItem1, char pas)//EDIT显示函数
{
pbuffer1[i] = pas;
EDIT_SetText(WM_GetDialogItem(hItem1, ID_EDIT_0), pbuffer1);
if (i == 18)i = 0;
else i++;
}
static int getanswer(WM_HWIN hItem1,char* str) //把计算的值显示在EDIT上
{
for(int i=0;i<20;i++)
if (str[i] == NULL)
{
str[i] = '#';
break;
}
double q;
char st[20];
q = geta(str);
int x;
x = (double)q;
itoa(x, st, 10);
EDIT_SetText(WM_GetDialogItem(hItem1, ID_EDIT_0), st);
}
static void counterCE(void) //清空字符数组的值
{
for (int j = 0; j < 20; j++)
if (pbuffer1[j] != NULL)
pbuffer1[j] = NULL;
i = 0; //下表重新设置为0
}
/*---------------------------------------------------------对话框的回调函数---------------------------*/
static void _cbBkButton(WM_MESSAGE* pMsg) {
WM_HWIN hItem1;
int Id, NCode;
char pbuffer[2]; //放置按钮上的文本
switch (pMsg->MsgId) {
case WM_PAINT:
break;
case WM_INIT_DIALOG:
hItem1 = WM_GetDialogItem(pMsg->hWin, ID_TEXT_5); //初始化TEXT1
TEXT_SetTextColor(hItem1,GUI_BLACK);
TEXT_SetTextAlign(hItem1, GUI_TA_HCENTER | GUI_TA_TOP);
TEXT_SetFont(hItem1, GUI_FONT_20_1);
TEXT_SetText(hItem1, "counter");
hItem1 = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0); //初始化EDIT
EDIT_SetTextAlign(hItem1,GUI_TA_BOTTOM | GUI_TA_RIGHT);
EDIT_SetFont(hItem1, GUI_FONT_20_ASCII);
EDIT_SetText(hItem1,"0");
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch (Id)
{
case ID_BUTTON_10 :
case ID_BUTTON_11:
case ID_BUTTON_12:
case ID_BUTTON_16:
case ID_BUTTON_17:
case ID_BUTTON_18:
case ID_BUTTON_22 :
case ID_BUTTON_27 :
case ID_BUTTON_23 :
case ID_BUTTON_29 :
case ID_BUTTON_30 :
case ID_BUTTON_20:
case ID_BUTTON_21:
case ID_BUTTON_25:
case ID_BUTTON_26:
case ID_BUTTON_24:
case ID_BUTTON_32:
case ID_BUTTON_31:
switch (NCode)
{
case WM_NOTIFICATION_CLICKED://数字,运算符被点击
hItem1 = WM_GetDialogItem(pMsg->hWin, Id);
BUTTON_GetText(hItem1, pbuffer, 2);
showtext(pMsg->hWin,pbuffer[0]); //记录按钮上的文本
break;
case WM_NOTIFICATION_RELEASED:
break;
}
break;
case ID_BUTTON_15:
case ID_BUTTON_14:
switch (NCode)
{
case WM_NOTIFICATION_CLICKED://C键和空白键被按
counterCE();
hItem1 = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
EDIT_SetTextAlign(hItem1, GUI_TA_BOTTOM | GUI_TA_RIGHT);
EDIT_SetFont(hItem1, GUI_FONT_20_ASCII);
EDIT_SetText(hItem1, "0");
break;
}
break;
case ID_BUTTON_33:
switch (NCode)
{
case WM_NOTIFICATION_CLICKED: //"=" 按钮被按
getanswer(pMsg->hWin,pbuffer1);
counterCE();
break;
case WM_NOTIFICATION_RELEASED:
break;
}
break;
}
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
//主函数
void MainTask(void) {
WM_SetCreateFlags(WM_CF_MEMDEV);
GUI_Init();
WM_HWIN TextDialoghWin;
TextDialoghWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbBkButton, WM_HBKWIN, 0, 0);
while (1)
{
GUI_Delay(100);
}
}
链接:https://pan.baidu.com/s/1z5y4OGT_aZVKV0wEzYVJPA
提取码:9nyd
这是整个计算器实现的代码。