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

前言

初学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;

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

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

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

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

总结

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

对 emwin 窗口创建的认识相关推荐

  1. STM32——EMWIN窗口小工具(十三)

    EMWIN 文章目录 EMWIN 前言 一.小工具基础知识 二. 如何使用小工具 1.重绘机制 2.小工具的使用 三.通用控件 API 函数 1.用于控件的 WM 函数 2.常用 API 函数 3._ ...

  2. STM32——EMWIN窗口管理(九)

    EMWIN 文章目录 EMWIN 前言 一.窗口术语 二.窗口回调机制 1.不使用回调渲染 2.使用回调渲染 3.背景窗口重绘和回调 4.无效化 三.消息 1.消息结构 2.消息类型 总结 前言 窗口 ...

  3. 【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )

    文章目录 一.导入头文件 二.桌面程序入口函数 三.注册窗口 四.创建窗口 五.显示窗口 六.完整代码示例 七.相关资源 基于 [OpenGL]一.Visual Studio 2019 创建 Wind ...

  4. 深入解析Windows窗口创建和消息分发

    Windows GUI采用基于事件驱动的编程模型,事实上几乎所有的界面库都是这样做的.在纯粹的Window32 SDK编程时代,人们还可以搞懂整个Windows窗体创建和消息的流通过程,但是在现在各种 ...

  5. 【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”

    本系列博文几乎没有难啃的"专业术语",尽量让读者能够看明白文章所述内容,是本系列博文的核心宗旨之一.(由于本人也是由于项目需要,所以才来查阅相关资料,文中出现的错误欢迎指出,共同进 ...

  6. Delphi非应用程序主窗口创建MDI

    对Delphi很熟悉的人,都知道MDI窗口的创建方式,是将主窗口的formstyle设置成MDIForm,然后将各个要设置成MDI的窗口的FormStyle都设置成MDIChild,运行就可以看到效果 ...

  7. 解决MFC 窗口创建时 争夺焦点的问题

    解决MFC 窗口创建时 争夺焦点的问题 参考文章: (1)解决MFC 窗口创建时 争夺焦点的问题 (2)https://www.cnblogs.com/h2052519/p/6377635.html ...

  8. Windows下游戏制作(1)---win32窗口创建(2)

    写出一个窗口 之前我们简单的认识了一下win32主函数,下面我们来讨论一下如何用这个主函数作为起点来写出一个win32窗口程 序. int WINAPI WinMain(   HINSTANCEhIn ...

  9. 【opencv】opencv窗口创建、大小调整等问题

    opencv窗口创建.大小调整等问题 图像最开始大小可能为1280*720或者其他大小的: 使用cv::resizeWindow函数之后,不同的参数感觉窗口大小没有多少改变,看不出来: 使用cv::s ...

最新文章

  1. mysql limit优化_MySQL:教你学会如何做性能分析与查询优化
  2. C++对自定义结构体变量排序
  3. Eclipse下导入外部jar包的3种方式
  4. Java EE 8怎么了? (第2部分)
  5. 集合框架(一) ----------Map集合遍历的方法
  6. Inline Temp(内联临时变量)
  7. Android 驱动开发(14)---深入学习Linux Device Tree
  8. 轻松做性能测试,月入3万的主流测试工具大揭秘
  9. 解决maven中ojdbc14:11.2.0.1.0错误
  10. 思科模拟器(SDN控制器使用教程一)
  11. movielens 1m 的mysql_MovieLens电影数据分析
  12. _spellmod_leech_aura
  13. i512500h和r76800hs对比 i5 12500h和r7 6800hs选哪个好
  14. 解决-最新版Google谷歌浏览器谷歌浏览器Chrome一上传或者下载附件图片就未响应卡死
  15. 计算机考研跨审计好跨嘛,跨专业如何考研
  16. expected at least 1 bean which qualifies as autowire candidate for this ***错误的分析
  17. 106、监控系统交换机的带宽到底应该如何计算?
  18. 错题本——数据库系统工程师 2017
  19. NSIS 运行bat的方法汇总
  20. 【生活随想】重整分类目录说明

热门文章

  1. html给数字加货币单位,WPS如何批量给数字添加货币符号?
  2. Django和Flask区别
  3. 在xampp中访问html,怎么控制远程访问xampp
  4. widget中文技术文档
  5. 求职迷茫?看看这篇为你准备的求职指北吧!
  6. 硬盘突然变raw格式_磁盘变成RAW格式的完美解决方式
  7. 编码解码问题.decode(encoding='gbk', errors='ignore')
  8. js中当等于最小值是让代码不执行_28 个JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已...
  9. 编写c语言的开篇——Hello World
  10. 高中关于人工智能方面的课题_人工智能的课题有什么研究方向