对 emwin 窗口创建的认识

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

初学emwin记录一些在学习过程中的认识及理解对GUI_CreateDialogBox()函数认识及理解。


参考资料:
正点原子论坛: http://www.openedv.com/forum.php
安富莱电子论坛: https://www.armbbs.cn/forum.php?gid=1
野火电子论坛: https://www.firebbs.cn/
使用硬件平台:正点原子阿波罗开发板 h743

1.函数介绍

函数原形 :WM_HWIN GUI_CreateDialogBox (const GUI_WIDGET_CREATE_INFO * paWidget, int NumWidgets, WM_CALLBACK * cb, WM_HWIN hParent, int x0, int y0);
该函数在创建时需要6个参数,这些参数是需要我们按照规定的结构进行添加的,

函数返回类型: WM_HWIN

函数名: GUI_CreateDialogBox

参数1: const GUI_WIDGET_CREATE_INFO * paWidget —//定义对话框中所要包含的小工具的资源表的指针。
参数2: int NumWidgets---------------------------//对话框中所包含的小工具的总数。
参数3: WM_CALLBACK * cb--------------------//应用程序特定回调函数(对话框过程函数)的指针
参数4: WM_HWIN hParent-----------------------//父窗口的句柄(О表示没有父窗口)。
参数5: int x0------------------------------------------//对话框相对于父窗口的×轴位置
参数6: int y0-----------------------------------------//对话框相对于父窗口的丫轴位置.

2.返回类型

函数类型定义如下,经过层层追踪,最后确定为一个有符号长整型

	 // WM_HWIN的定义路径如下
 1. #define 	WM_HWIN  	 GUI_HWIN     
 2. typedef     GUI_HMEM     GUI_HWIN;
 3. #define     GUI_HMEM     I32
 4. #define 	I32   		 signed long

3. 函数名

1.函数的功能为 创建非阻塞式对话框。

参数1----------------资源表

//对话框资源列表 示例
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0,   0, 480, 	272, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "模式1", ID_BUTTON_0, 15, 10, 80, 180, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "效果1", ID_BUTTON_1, 100, 10, 80, 89, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "功率1", ID_BUTTON_2, 100, 103, 80, 89, 0, 0x0, 0 },
};

资源表是一个结构体数组,包含有函数指针和整形的成员,成员类型如下 类型可以如下查找

首先找到 定义类型

typedef struct   GUI_WIDGET_CREATE_INFO_struct   GUI_WIDGET_CREATE_INFO;

然后跳入GUI_WIDGET_CREATE_INFO_struct结构体 就可以看到成员的类型了。

struct GUI_WIDGET_CREATE_INFO_struct {
	  GUI_WIDGET_CREATE_FUNC * pfCreateIndirect;
	  const char             * pName;            //创建函数 //文本…不是所有小部件都使用
	  I16                      Id;               //ID…在对话框中应该是唯一的 
	  I16                      x0;               //x position  
	  I16                      y0;               // y position
	  I16                      xSize;            // x size
	  I16                      ySize;            // y size
	  U16                      Flags;            //y size //小部件特定的创建标志(opt.) 
	  I32                      Para;             //小部件特定参数(opt.)   
	  U32                      NumExtraBytes;    // 可用的额外字节数<WIDGET>_SetUserData & <WIDGET>_GetUserData
};

资源表中的第1个成员是一个函数指针,一般是根据需求选择相应的函数名。创建窗口时会将函数所在地址传递给一个指针。

资源表中的 第2个成员 Id是需要我们自己定义的 从GUI_ID_USER 开始向后加一个数进行偏移,每个ID值不能重复,用户的ID是从0x800开始的 在文件中有以下定义。
#define GUI_ID_USER 0x800

#define GUI_ID_USER       0x800

我们使用时在GUI_ID_USER后面加上一个数,以此来防止ID重复。

#define ID_BUTTON_0 	(GUI_ID_USER + 30)			//模式1
#define ID_BUTTON_1 	(GUI_ID_USER + 31)			//效果1
#define ID_BUTTON_2 	(GUI_ID_USER + 32)			//功率1
#define ID_BUTTON_3 	(GUI_ID_USER + 33)			//模式2
#define ID_BUTTON_4 	(GUI_ID_USER + 34)			//效果2
#define ID_BUTTON_5 	(GUI_ID_USER + 35)			//功率2

资源表中的 第3和第4 成员的值决定了窗口的起始位置。
资源表中的 第5和第6 成员的值决定了窗口长和宽的大小。

资源表创建好以后,我们会将这个结构体数组当成一个参数 传递给创建对话框的函数。之后也还会将回调函数当成一个参数传递给创建对话框的函数。

参数3------------对话框回调函数

回调函数是根据消息的类型来执行相应的操作 。

//对话框窗口回调函数    不是用来创建对话框里面的小工具,而是用来初始化小工具里面的参数的  小工具的创建在之前已经完成了
static void _cbDialog(WM_MESSAGE * pMsg) 
{
 WM_HWIN hItem;
  int     NCode;
  int     Id;

  switch (pMsg->MsgId) {      //通过消息的类型来执行相应的操作
  case WM_INIT_DIALOG:			//创建对话框后立即发送到对话框窗口。
  		……
  		break;
  case WM_NOTIFY_PARENT:		//告知父窗口,其子窗口中发生了某些改变。
  	  	……
  		break;	
  ……	……									
  default:
		WM_DefaultProc(pMsg);
		break;

什么情况下会调用回调函数?

  1. 创建对话框后会调用回调函数进行初始化。 此时的 pMsg->MsgId的值为 WM_INIT_DIALOG
  2. 当屏幕有触摸信息时会调用回调函数。 此时的 pMsg->MsgId的值为 WM_NOTIFY_PARENT
  3. 定时器定时时间到以后会调用回调函数。 此时的 pMsg->MsgId的值为 WM_TIMER
  4. ……

调用的过程是什么样的?以处理按钮消息为例,当按钮按下会调用回调函数,在回调函数中会进行确定外界执行了什么动作。

  1. 首先是确定消息的类型:消息的类型分为三类 分别是系统定义的消息类型、指针输入设备(PID)消息类型、通知代码类型。
  2. 确定产生消息的原窗口。
  3. 根据原窗口消息中的数据值执行相应动作。

总结

以上内容是在学习中的一些浅薄的理解和认识 难免会产生一些理解上和认识上的错误。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值