[ucgui] 对话框2——小窗口初始化与消息响应

简介:


 

>_<" 上一节已经说过,创建过得窗口虽然可见,但是它们是以 “空”的形式出现的。这是因为对话框过程函数尚未包含初始化单个元素的代码。小工具的初始值、由它们所引起的行为以及它们之间的交互作用都需要在对话框过程中进行定义。这里在过程函数的WM_INIT_DIALOG消息下实现对小窗口初始化,然后在WM_NOTIFY_PARENT消息下实现对小工具的响应~

复制代码
 1 /*********************************************************************
 2 *
 3 对话框可以基于阻塞(使用GUI_ExecDialogBox())或非阻塞(使用GUI_CreateDialogBox())
 4 方式创建。必须首先定义一个资源表,以指定在对话框中所要包括的所有小工具。下面的示例说明了创
 5 建资源表的方法:
 6 对话框中所要包括的任何小工具都必须使用<WIDGET>_CreateIndirect()函数来间接创建。
 7 */
 8 static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
 9     { FRAMEWIN_CreateIndirect, "Dialog", 0, 10, 10, 180, 230, FRAMEWIN_CF_MOVEABLE, 0 },
10     { BUTTON_CreateIndirect, "OK", GUI_ID_OK, 100, 5, 60, 20 },
11     { BUTTON_CreateIndirect, "Cancel", GUI_ID_CANCEL, 100, 30, 60, 20 },
12     { TEXT_CreateIndirect, "LText", 0, 10, 55, 48, 15, TEXT_CF_LEFT },
13     { TEXT_CreateIndirect, "RText", 0, 10, 80, 48, 15, TEXT_CF_RIGHT },
14     { EDIT_CreateIndirect, NULL, GUI_ID_EDIT0, 60, 55, 100, 15, 0, 50 },
15     { EDIT_CreateIndirect, NULL, GUI_ID_EDIT1, 60, 80, 100, 15, 0, 50 },
16     { TEXT_CreateIndirect, "Hex", 0, 10, 100, 48, 15, TEXT_CF_RIGHT },
17     { EDIT_CreateIndirect, NULL, GUI_ID_EDIT2, 60, 100, 100, 15, 0, 6 },
18     { TEXT_CreateIndirect, "Bin", 0, 10, 120, 48, 15, TEXT_CF_RIGHT },
19     { EDIT_CreateIndirect, NULL, GUI_ID_EDIT3, 60, 120, 100, 15 },
20     { LISTBOX_CreateIndirect, NULL, GUI_ID_LISTBOX0,10, 10, 48, 40 },
21     { CHECKBOX_CreateIndirect, NULL, GUI_ID_CHECK0, 10, 140, 0, 0 },
22     { CHECKBOX_CreateIndirect, NULL, GUI_ID_CHECK1, 30, 140, 0, 0 },
23     { SLIDER_CreateIndirect, NULL, GUI_ID_SLIDER0, 60, 140, 100, 20 },
24     { SLIDER_CreateIndirect, NULL, GUI_ID_SLIDER1, 10, 170, 150, 30 }
25 };
26 /*********************************************************************
27 *
28 对话框过程函数
29 */
30 static void _cbCallback(WM_MESSAGE * pMsg) {
31     int NCode, Id;
32     static const GUI_ConstString _apListBox[] = {  //ListBox contant
33             "English", "Deutsch", "Fran?ais", "Japanese", "Italiano", NULL
34     };
35     WM_HWIN hEdit0, hEdit1, hEdit2, hEdit3, hListBox;
36     WM_HWIN hWin = pMsg->hWin;
37     switch (pMsg->MsgId) {
38     /*用它们各自的初始值对小工具进行初始化。在对话框过程函数中,这是对WM_INIT_DIALOG
39     消息做出反应时的通常做法*/
40     case WM_INIT_DIALOG:
41         /* Get window handles for all widgets */
42         hEdit0 = WM_GetDialogItem(hWin, GUI_ID_EDIT0);
43         hEdit1 = WM_GetDialogItem(hWin, GUI_ID_EDIT1);
44         hEdit2 = WM_GetDialogItem(hWin, GUI_ID_EDIT2);
45         hEdit3 = WM_GetDialogItem(hWin, GUI_ID_EDIT3);
46         hListBox = WM_GetDialogItem(hWin, GUI_ID_LISTBOX0);
47         /* Initialize all widgets */
48         EDIT_SetText(hEdit0, "EDIT widget 0");
49         EDIT_SetText(hEdit1, "EDIT widget 1");
50         EDIT_SetTextAlign(hEdit1, GUI_TA_LEFT);
51         EDIT_SetHexMode(hEdit2, 0x1234, 0, 0xffff);
52         EDIT_SetBinMode(hEdit3, 0x1234, 0, 0xffff);
53         LISTBOX_SetText(hListBox, _apListBox);
54         WM_DisableWindow (WM_GetDialogItem(hWin, GUI_ID_CHECK1));
55         CHECKBOX_Check( WM_GetDialogItem(hWin, GUI_ID_CHECK0));
56         CHECKBOX_Check( WM_GetDialogItem(hWin, GUI_ID_CHECK1));
57         SLIDER_SetWidth( WM_GetDialogItem(hWin, GUI_ID_SLIDER0), 5);
58         SLIDER_SetValue( WM_GetDialogItem(hWin, GUI_ID_SLIDER1), 50);
59         break;
60     /*告知父窗口,其子窗口中发生了某些改变。上面是小工具的初始化,下面是过程中变化的处理*/
61     case WM_NOTIFY_PARENT:
62         Id = WM_GetId(pMsg->hWinSrc); /* Id of widget 获得小工具的ID*/
63         NCode = pMsg->Data.v; /* Notification code 通知消息代号*/
64         switch (NCode) {
65         case WM_NOTIFICATION_RELEASED:/* React only if released 此通知消息将在被点击的小工具已被释放时发送。*/
66             if (Id == GUI_ID_OK) { /* OK Button */
67                 GUI_EndDialog(hWin, 0);
68             }
69             if (Id == GUI_ID_CANCEL) { /* Cancel Button */
70                 GUI_EndDialog(hWin, 1);
71             }
72             break;
73         case WM_NOTIFICATION_SEL_CHANGED:/* Selection changed 此通知消息将在小工具选择已更改时发送。*/
74             FRAMEWIN_SetText(hWin, "Dialog - sel changed");
75             break;
76         default:
77             FRAMEWIN_SetText(hWin, "Dialog - notification received");
78         }
79         break;
80     default:
81     WM_DefaultProc(pMsg);
82     }
83 }
84 /*********************************************************************
85 *
86 * MainTask
87 */
88 void Fun(void) {
89     //对于该示例,对话框显示时会有下列代码行:
90     GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate),&_cbCallback, 0, 0, 0);
91 }
复制代码



相关文章
|
2月前
[MFC] A对话框调用B对话框
[MFC] A对话框调用B对话框
31 0
|
Windows
【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )(二)
【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )(二)
154 0
【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )(二)
|
C++ Windows
【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )(一)
【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )(一)
128 0

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    25
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    23
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    21
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    19
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    19
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19