2.Emwin的数字键盘输入到Edit窗口更新以及到另一个页面Text控件的值并且同步改变。

Emwin的数字键盘输入到Edit窗口更新以及到另一个页面Text控件的值同步改变。

要求如下,数字小键盘输入数字后,通过数字键盘上的ok键把输入值更新到设置界面的Edit控件并显示输入值。设置界面上有个确定按键,如果不按下确定按键,已经输入好的Edit的值将不会同步更新到显示界面上的Text控件。

  1. 只修改Edit输入控件上的值,未按下确认时,不更新到Text控件,如图:
    在这里插入图片描述

  2. 按下ok后更新到Edit 瓶这个控件
    在这里插入图片描述

  3. 此时未按下“确认”,显示界面的总瓶数未更新:
    在这里插入图片描述

  4. 按下确认后 显示界面的Text控件已更新为上面的输入值 150瓶和300ml
    在这里插入图片描述
    以上是已解决问题的结果

  5. 这是发生的问题

因为我的是两个Edit输入框和两个Text控件分别对应改变,即,在设置界面改变Edit控件后,按下确认,显示界面的Text的值才会更新,现遇到的问题如下,如果把改变Text的值触发放到数字键盘上的OK键时,Text的值可以正常改变,但是当把触发Text的值改变选项放到确认上的时候,却发现显示出的值是野值或者不显示,如图:
在这里插入图片描述
后来仔细看了一下代码 发现是Edit的值更新完了之后就用menset这个函数把内存初始化了。里面的值都被初始化了。所以再按下确认的时候,数字键盘输入的值已经没了,就没有办法更新到TEXT控件上了

char Edit_buff[10];//数字键盘储存字符串
char bottle_buff[10];//储存瓶子总数的字符串
char capacity_buff[10];//储存设定流量的字符串

//以上三个定义在代码最开始的地方 
		case ID_BUTTON_5C: // Notifications sent by 'OK'
			switch (NCode) {
			case WM_NOTIFICATION_CLICKED:

				Write_edit(Edit_buff);				//把数字键盘上的数值写入到Edit上	
				memset(Edit_buff, '\0', sizeof Edit_buff);//用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’
				EDIT_SetText(WM_GetDialogItem(pMsg->hWin, ID_EDIT_50), "");//把数字键盘的Edit设为空白
				
				//WM_HideWindow(layer[5]);
				GUI_EndDialog(pMsg->hWin, 0);//结束数字小键盘
				// USER END
				break;

memset后面的注释是我百度查了这个函数的作用后加上去的
在这里插入图片描述
因为已经把Edit_buff初始化了,所以在更新到Text的时候就没有正常显示。然后现在增加一个变量char 数组,在按下数字键盘上的ok的时候同时通过memcpy函数把之前Edit里面的一个数组存放的值复制到另外一个char数组上,

/*********************************************************************************************************
*	函 数 名: Write_edit
*	功能说明: 更改edti框的值
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void Write_edit(char * edit_buff)
{
	if (Edit_buff[0] != '\0')
		edit_buff = Edit_buff;
	if (EDIT_botttle == hItem_slave)
	{
		strcpy(bottle_buff, Edit_buff);//如果点击了总瓶数Edit框,则把Eidt的值赋值给bottle_buff数组
	}
	else if (EDIT_capacity == hItem_slave)
	{
		strcpy(capacity_buff, Edit_buff);如果点击了灌装量Edit框,则把Eidt的值赋值给capacity_buff数组
	}
	EDIT_SetText(hItem_slave, edit_buff);//把数字键盘的值更新到当前点击的Edit框
}

同时再初始化第一个数组,然后通过Write_text函数更新到Text控件上,

	case WM_NOTIFY_PARENT:
		Id = WM_GetId(pMsg->hWinSrc);
		NCode = pMsg->Data.v;
		switch (Id) {
		case ID_BUTTON_B0: // Notifications sent by '确认'
			switch (NCode) {
			case WM_NOTIFICATION_CLICKED:
				Write_Bottletext(bottle_buff);
				Write_Capacitytext(capacity_buff);
				// USER START (Optionally insert code for reacting on notification message)
				// USER END
				break;

两个Write_text函数代码如下

/*********************************************************************************************************
*	函 数 名: Write_xxxtext
*	功能说明: 更改text文本框的值
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void Write_Bottletext(char * Bottle_buff)//把bottle_buff数组的里字符串更新到Text上显示出来,显示设定总瓶数
{
		if (bottle_buff[0]!= '\0')
			Bottle_buff = bottle_buff;
		programmax = atoi(bottle_buff);//把bottle_buff数组的里字符串转换成int数值并在
		bottle_value = programmax;
		TEXT_SetText(hItem_bottle, Bottle_buff);
		
}

void Write_Capacitytext(char * Capacity_buff)//把capacity_buff数组里的字符串更新到Text上显示出来,显示灌装容量
{
		if (capacity_buff[0] != '\0')
			Capacity_buff = capacity_buff;
		capacity1 = atoi(Capacity_buff);//把capacity_buff数组里的字符串转换成int数值并曲线显示
		TEXT_SetText(hItem_capacity, Capacity_buff);
}

然后可以显示按下确认后,把已经更新到Edit上的值更改到Text上,但是融实业出现一个新的问题,因为我是两个Edit输入框对应两个Text控件,现在是不论我改变哪一个Edit的输入值,按下确认键后,两个Text的值都改变如图:
这个是设置界面Edit框
设置界面Edit框☝

在这里插入图片描述
显示界面Text控件显示☝

到这里这个问题就解决了,这些问题都是我做项目最近遇到的,然后解决之后自己总结写上来给大家参考的,我的emwin只学了几个月,就学了到了这些。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来给你写一个基于STM32emWin的三层页面应用。 首先,你需要准备以下硬件和软件: 硬件: - STM32开发板 - 显示屏 - 连接线 软件: - Keil MDK - emWin图形库 接下来,我们按照以下步骤来实现: 第一步:创建工程并添加emWin库文件 - 打开Keil MDK,创建一个新工程。 - 在工程中添加emWin的库文件,包括GUI库和LCD驱动库。 第二步:添加头文件 - 在源文件中添加以下头文件: ```c #include "GUI.h" // emWin GUI库 #include "DIALOG.h" // emWin 对话框库 ``` 第三步:初始化emWin库 - 在main函数中,添加以下代码: ```c // 初始化emWinGUI_Init(); ``` 第四步:创建窗口 - 创建三个窗口,分别为主页面、第二层页面和第三层页面: ```c WM_HWIN hWinMainPage; // 主页面句柄 WM_HWIN hWinSecondPage; // 第二层页面句柄 WM_HWIN hWinThirdPage; // 第三层页面句柄 // 创建主页面 hWinMainPage = GUI_CreateDialogBox(_aDialogCreateMainPage, GUI_COUNTOF(_aDialogCreateMainPage), &_cbDialogMainPage, WM_HBKWIN, 0, 0); // 创建第二层页面 hWinSecondPage = GUI_CreateDialogBox(_aDialogCreateSecondPage, GUI_COUNTOF(_aDialogCreateSecondPage), &_cbDialogSecondPage, WM_HBKWIN, 0, 0); // 创建第三层页面 hWinThirdPage = GUI_CreateDialogBox(_aDialogCreateThirdPage, GUI_COUNTOF(_aDialogCreateThirdPage), &_cbDialogThirdPage, WM_HBKWIN, 0, 0); ``` 第五步:显示主页面 - 显示主页面,并在主页面中添加显示时间的控件。 ```c // 显示主页面 WM_ShowWindow(hWinMainPage); // 在主页面添加显示时间的控件 GUI_AddBinDec(hWinMainPage, 200, 100, 60, 20, GUI_ID_TIME, 0); ``` 第六步:添加按键回调函数 - 在回调函数中实现按键的返回功能。 ```c // 按键回调函数 void _cbDialogMainPage(WM_MESSAGE * pMsg) { switch (pMsg->MsgId) { case WM_INIT_DIALOG: break; case WM_NOTIFY_PARENT: switch (pMsg->Data.v) { case WM_NOTIFICATION_CLICKED: break; case WM_NOTIFICATION_RELEASED: if (pMsg->hWinSrc == BUTTON_Return) { // 返回按钮 // 隐藏当前窗口,显示主页面 WM_HideWindow(hWinSecondPage); WM_HideWindow(hWinThirdPage); WM_ShowWindow(hWinMainPage); } break; } break; default: WM_DefaultProc(pMsg); break; } } ``` 第七步:主函数 - 在主函数中添加以下代码: ```c int main(void) { // 硬件初始化... // 初始化emWinGUI_Init(); // 创建窗口... // 显示主页面 WM_ShowWindow(hWinMainPage); // 主循环 while (1) { GUI_Delay(1000); // 延时1秒 } } ``` 好了,以上就是一个基于STM32emWin的三层页面应用的实现。你可以根据自己的需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值