ucGUI学习笔记之对话框
来源:互联网 发布:配音软件手机软件 编辑:程序博客网 时间:2024/05/16 08:43
在emWin模板上学习了两个关于对话框的设计,已经接触到了对话框设计基本要用到的几种控件,现在献上我的拙见,如有误请指正!
创建对话框有两个基本要素:资源表和过程函数。所谓过程函数一般都是回调函数,资源表值得就是对话框中所包含的各种小工具的数据表。资源表一般都是一个结构体数组,这个结构体里包含的信息如下:
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定义的消息:
0 0
- ucGUI学习笔记之对话框
- uCGUI学习笔记之显示文本
- uCGUI学习笔记之显示文本
- ucGUI学习笔记1
- uCGUI 学习笔记
- ucgui学习笔记01简介
- QT学习笔记之对话框
- MFC学习笔记之-对话框
- MFC学习笔记之对话框
- UCGUI学习之路(1)前言
- UCGUI学习之路(2)移植
- UCGUI学习之路(4)显示位图
- UCGUI学习之路(5)MemDev
- android学习笔记之二Dailog(对话框)
- android学习笔记之二Dailog(对话框)
- Java学习笔记(AWT 之 对话框)
- PyQt4 学习笔记5之对话框
- android 学习笔记之20160307自定义对话框
- DirectX11 点光
- poj2689
- ios 开发学习 :多线程之GCD的使用指南
- 【设计前沿】设计心理学
- 1031. Hello World for U (20)
- ucGUI学习笔记之对话框
- 马哥运维笔记----3
- mysql大数据高并发处理
- First Bad Version【278】
- HDU 2955 Robberies(01背包问题)
- 访问数据库时如何解决并发问题
- JS学习笔记
- 杂类未分类
- Cocos2d-x移植到Android平台之Android-stuido