ucGUI学习笔记之对话框
2015-10-03 09:31
549 查看
在emWin模板上学习了两个关于对话框的设计,已经接触到了对话框设计基本要用到的几种控件,现在献上我的拙见,如有误请指正!
创建对话框有两个基本要素:资源表和过程函数。所谓过程函数一般都是回调函数,资源表值得就是对话框中所包含的各种小工具的数据表。资源表一般都是一个结构体数组,这个结构体里包含的信息如下:
以下是由emWin定义的消息:
![](http://img.blog.csdn.net/20151004092845028?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20151004092927466?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20151004092954993?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20151004093018226?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
创建对话框有两个基本要素:资源表和过程函数。所谓过程函数一般都是回调函数,资源表值得就是对话框中所包含的各种小工具的数据表。资源表一般都是一个结构体数组,这个结构体里包含的信息如下:
struct GUI_WIDGET_CREATE_INFO_struct { GUI_WIDGET_CREATE_FUNC * pfCreateIndirect; const char * pName; // Text ... Not used on all widgets I16 Id; // ID ... should be unique in a dialog I16 x0; // x position I16 y0; // y position I16 xSize; // x size I16 ySize; // y size U16 Flags; // Widget specific create flags (opt.) I32 Para; // Widget specific parameter (opt.) U32 NumExtraBytes; // Number of extra bytes usable with <WIDGET>_SetUserData & <WIDGET>_GetUserData };
第一项就是创建小工具要用的函数名咯,第二项就是你给小工具起的名字,接下来无非就是位置大小信息,关于这个特殊标志Flag、特殊参数Para我还没接触到,最后一项是小工具可用的内存。比如文本框,要给他个合适大小来存储输入的信息。这个参数也可以用来确定控件的个数,比如单选按钮Radio。
当用户在不同控件上做不同动作时,对话框要体现出不同的变化,这种变化就要由过程函数来执行。对话框就是一个窗口,它接收消息的方式与系统中其他所有窗口一样。大多数消息由对话框的窗口回调程序自动处理,而其他消息则传递到建立对话框时所指定的回调程序,这便称为对话框过程函数。既然说到了消息,就得来谈谈对话框所接受的消息类型了。<span style="color:#ff0000;">发送到对话框过程函数的两种附加消息为:WM_INIT_DIALOG和WM_NOTIFY_PARENT。在显示对话框前,WM_INIT_DIALOG消息会立即发送到对话框过程函数。对话框过程函数通常使用该消息来初始化小工具,并执行其他任何会影响对话框外观的初始化任务。 WM_NOTIFY_PARENT消息则通过对话框的子窗口发送到对话框,通知任何事件的父窗口以确保同步化。</span>
<pre name="code" class="plain">static void _cbCallBack(WM_MESSAGE* pmsg){ switch(pmsg->id){ case WM_INIT_DIALOG: break; case WM_NOTIFY_PARENT: break; default: WM_DefaultProc(pmsg); }
有了资源表和过程函数,就可以创建对话框了:
<span style="font-family: Arial, Helvetica, sans-serif;">WM_HWIN GUI_CreateDialogBox(const GUI_WIDGET_CREATE_INFO * paWidget, int NumWidgets, WM_CALLBACK * cb, WM_HWIN hParent, int x0, int y0);//创建非阻塞式对话框</span>
int GUI_ExecCreatedDialog(WM_HWIN hDialog);//执行已创建的对话框
int GUI_ExecDialogBox(const GUI_WIDGET_CREATE_INFO * paWidget,int NumWidgets,WM_CALLBACK * cb,WM_HWIN hParent,int x0,int y0);//创建并执行对话框
void GUI_EndDialog(WM_HWIN hDialog, int r);//结束对话框,那个r值由GUI_ExecDialogBox()返回。关于这一点我真的不太明白是怎么回事,请大神赐教
对话框的创建需要各种各样的资源,就是小工具啦。下面是总结出的常用小工具(还可以设置皮肤哦):
<span style="font-family: Arial, Helvetica, sans-serif;"> 这里先简单介绍下窗口管理器WM的相关知识点,在用户手册里说得很晦涩难懂。<span style="color:#ff0000;">窗口管理器主要有三大功能:回调机制、无效化和渲染(重绘)。先说重绘,当我们的任何控件的属性发生变化时(也就是你对它有动作时),都应该通知控件所在的父窗口进行重绘操作,即把无效的窗口重新绘制,绘制成你想要变成的样子,一般重绘操作都有窗口创建时指定的回调函数完成。</span>初始化窗口管理器期间,会创建一个包含整个LCD 区域的窗口作为背景窗口。此窗口的句柄为WM_HBKWIN。WM不会自动重绘背景窗口的区域,因为没有默认的背景颜色。也就是说如果创建了另一个窗口然后将其删除,则删除的窗口仍然可见。那咋整里,我们就自己给他设置个背景色WM_SetBkColor()。所谓无效化就是先管理窗口的所有无效区域,在GUI_Exec()或GUI_Delay()中重绘,这样就避免了每次无效都重绘一次。</span>
emWin例程里的桌面窗口的重绘操作全在回调函数_cbBkWindows(WM_MESSAGE*pmsg)中完成。因为桌面窗口是所有窗口的父窗口,所以任何子窗口的属性变化都会引起桌面窗口的重绘。我在例程DIALOG_NestedModal.c(阻塞式对话框的嵌套使用)中的_cbBkWindows()中打断点发现,第一次初始化会进入断点,父对话框的OK/CANCLE按下会进入断点,子对话框的OK/CANCLE按下也会进入断点。
回调函数被调用时,它会收到以其pMsg参数指定的消息。此消息实际上是一个WM_MESSAGE结构体:
struct WM_MESSAGE { int MsgId; /* type of message */ WM_HWIN hWin; /* Destination window */ WM_HWIN hWinSrc; /* Source window */ union { const void * p; /* Some messages need more info ... */ int v; GUI_COLOR Color; } Data; };
以下是由emWin定义的消息:
相关文章推荐
- 128. Longest Consecutive Sequence (List, Queue)
- iOS的实时搜索:UISearchBar与UISearchController
- UI:修改模拟器类型、多线程理解
- UVALive 6432 Influence // 暴力dfs
- ZOJ 3820 Building Fire Stations
- Debian Stable (Jessie 8.1) 的normal.mod not found
- hdu 5493 Queue(线段树)
- unique_ptr
- 多个线程操作StringBuffer和StringBuilder
- 用g++ 编译 ffmpeg 编译出现 error: 'UINT64_C' was not declared in this scope 或 missing -D__STDC_CONSTANT_MACROS
- codeforces 466D Increase Sequence DP
- [LeetCode]Longest Consecutive Sequence
- String,StringBuffer与StringBuilder的区别
- iOS:UIView、UIControl、UIButton、UILabel简单的属性和方法常识
- iOS8之后UIAlertController
- LeetCode(52) N-Queens II
- LeetCode(52) N-Queens II
- Java finished with non-zero exit value 2 - Android Gradle
- UESTC 1307 WINDY数 (数位DP,基础)
- LeetCode(51) N-Queens