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
原创粉丝点击