对 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 I324. #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 positionI16 xSize; // x sizeI16 ySize; // y sizeU16 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;
什么情况下会调用回调函数?
- 创建对话框后会调用回调函数进行初始化。 此时的 pMsg->MsgId的值为 WM_INIT_DIALOG
- 当屏幕有触摸信息时会调用回调函数。 此时的 pMsg->MsgId的值为 WM_NOTIFY_PARENT
- 定时器定时时间到以后会调用回调函数。 此时的 pMsg->MsgId的值为 WM_TIMER
- ……
调用的过程是什么样的?以处理按钮消息为例,当按钮按下会调用回调函数,在回调函数中会进行确定外界执行了什么动作。
- 首先是确定消息的类型:消息的类型分为三类 分别是系统定义的消息类型、指针输入设备(PID)消息类型、通知代码类型。
- 确定产生消息的原窗口。
- 根据原窗口消息中的数据值执行相应动作。
总结
以上内容是在学习中的一些浅薄的理解和认识 难免会产生一些理解上和认识上的错误。
对 emwin 窗口创建的认识相关推荐
- STM32——EMWIN窗口小工具(十三)
EMWIN 文章目录 EMWIN 前言 一.小工具基础知识 二. 如何使用小工具 1.重绘机制 2.小工具的使用 三.通用控件 API 函数 1.用于控件的 WM 函数 2.常用 API 函数 3._ ...
- STM32——EMWIN窗口管理(九)
EMWIN 文章目录 EMWIN 前言 一.窗口术语 二.窗口回调机制 1.不使用回调渲染 2.使用回调渲染 3.背景窗口重绘和回调 4.无效化 三.消息 1.消息结构 2.消息类型 总结 前言 窗口 ...
- 【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )
文章目录 一.导入头文件 二.桌面程序入口函数 三.注册窗口 四.创建窗口 五.显示窗口 六.完整代码示例 七.相关资源 基于 [OpenGL]一.Visual Studio 2019 创建 Wind ...
- 深入解析Windows窗口创建和消息分发
Windows GUI采用基于事件驱动的编程模型,事实上几乎所有的界面库都是这样做的.在纯粹的Window32 SDK编程时代,人们还可以搞懂整个Windows窗体创建和消息的流通过程,但是在现在各种 ...
- 【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”
本系列博文几乎没有难啃的"专业术语",尽量让读者能够看明白文章所述内容,是本系列博文的核心宗旨之一.(由于本人也是由于项目需要,所以才来查阅相关资料,文中出现的错误欢迎指出,共同进 ...
- Delphi非应用程序主窗口创建MDI
对Delphi很熟悉的人,都知道MDI窗口的创建方式,是将主窗口的formstyle设置成MDIForm,然后将各个要设置成MDI的窗口的FormStyle都设置成MDIChild,运行就可以看到效果 ...
- 解决MFC 窗口创建时 争夺焦点的问题
解决MFC 窗口创建时 争夺焦点的问题 参考文章: (1)解决MFC 窗口创建时 争夺焦点的问题 (2)https://www.cnblogs.com/h2052519/p/6377635.html ...
- Windows下游戏制作(1)---win32窗口创建(2)
写出一个窗口 之前我们简单的认识了一下win32主函数,下面我们来讨论一下如何用这个主函数作为起点来写出一个win32窗口程 序. int WINAPI WinMain( HINSTANCEhIn ...
- 【opencv】opencv窗口创建、大小调整等问题
opencv窗口创建.大小调整等问题 图像最开始大小可能为1280*720或者其他大小的: 使用cv::resizeWindow函数之后,不同的参数感觉窗口大小没有多少改变,看不出来: 使用cv::s ...
最新文章
- mysql limit优化_MySQL:教你学会如何做性能分析与查询优化
- C++对自定义结构体变量排序
- Eclipse下导入外部jar包的3种方式
- Java EE 8怎么了? (第2部分)
- 集合框架(一) ----------Map集合遍历的方法
- Inline Temp(内联临时变量)
- Android 驱动开发(14)---深入学习Linux Device Tree
- 轻松做性能测试,月入3万的主流测试工具大揭秘
- 解决maven中ojdbc14:11.2.0.1.0错误
- 思科模拟器(SDN控制器使用教程一)
- movielens 1m 的mysql_MovieLens电影数据分析
- _spellmod_leech_aura
- i512500h和r76800hs对比 i5 12500h和r7 6800hs选哪个好
- 解决-最新版Google谷歌浏览器谷歌浏览器Chrome一上传或者下载附件图片就未响应卡死
- 计算机考研跨审计好跨嘛,跨专业如何考研
- expected at least 1 bean which qualifies as autowire candidate for this ***错误的分析
- 106、监控系统交换机的带宽到底应该如何计算?
- 错题本——数据库系统工程师 2017
- NSIS 运行bat的方法汇总
- 【生活随想】重整分类目录说明
热门文章
- html给数字加货币单位,WPS如何批量给数字添加货币符号?
- Django和Flask区别
- 在xampp中访问html,怎么控制远程访问xampp
- widget中文技术文档
- 求职迷茫?看看这篇为你准备的求职指北吧!
- 硬盘突然变raw格式_磁盘变成RAW格式的完美解决方式
- 编码解码问题.decode(encoding='gbk', errors='ignore')
- js中当等于最小值是让代码不执行_28 个JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已...
- 编写c语言的开篇——Hello World
- 高中关于人工智能方面的课题_人工智能的课题有什么研究方向