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只学了几个月,就学了到了这些。

猜你喜欢

转载自blog.csdn.net/qq_41930631/article/details/113538324