IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 对 emwin 窗口创建的认识 -> 正文阅读

[嵌入式]对 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. 根据原窗口消息中的数据值执行相应动作。

总结

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:44:59  更:2022-03-15 22:46:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:36:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码