STM32——EMWIN对话框(十二)

EMWIN

前言

小工具可以创建并独立使用,因为它们本质上就是窗口,但是,通常需要使用对话框,对话框是一个包含一个或多个小工具的窗口。对话框通常是一个窗口,它在出现时会要求用户输入信息,它可能包含多个小工具,要求用户根据各种选择来提供信息,或者以消息框的形式,仅提供信息(比如向用户提供注意事项或警告)和一个“确定”按钮。

一、对话框基本原理

输入焦点
窗口管理器能记住用户使用触摸屏、鼠标、键盘或用其他方式最终所选择的窗口或窗口对象。该窗口会收到键盘输入消息,即具有输入焦点。追踪输入焦点的主要原因是为了确定键盘命令的发送目的地。具有输入焦点的窗口会接收由键盘所生成的事件。如果要将对话框内的输入焦点移至下一个焦点对话框项目,可以使用 GUI_KEY_TAB 键。如果要向后移动,则可以使用 GUI_KEY_BACKTAB。
阻塞式和非阻塞式对话框
对话框窗口可以分为阻塞式和非阻塞式,阻塞式对话框会阻塞执行的线程,默认情况下,它有输入焦点,用户必须先关闭它,线程才能继续执行。阻塞式对话框不会同时禁用所显示的其他对话框,换言之,阻塞式对话框并非模式对话框。如果对话框为阻塞式,则表示只有在对话框关闭后,所使用的函数(GUI_ExecDialogBox() 或 GUI_ExecCreatedDialog())才会返回值。而非阻塞式对话框则不会阻塞调用的线程——在它为可见时,可允许任务继续运行。创建对话框后,函数会立即返回值。
需要注意的是,切勿从回调函数中调用阻塞式函数,否则可能会导致应用程序故障!
对话框过程函数
对话框就是一个窗口,它接收消息的方式与系统中其他所有窗口一样。大多数消息由对话框的窗口回调程序自动处理,而其他消息则传递到建立对话框时所指定的回调程序,这便称为对话框过程函数。
对话框消息
发 送 到 对 话 框 过 程 函 数 的 两 种 附 加 消 息 为 : WM_INIT_DIALOG 和WM_NOTIFY_PARENT。在显示对话框前, WM_INIT_DIALOG 消息会立即发送到对话框过程函数,对话框过程函数通常使用该消息来初始化小工具,并执行其他任何会影响对话框外观的初始化任务。 WM_NOTIFY_PARENT 消息则通过对话框的子窗口发送到对话框,通知任何事件的父窗口以确保同步化。通过子窗口发送的事件取决于其类型,并针对每个类型的小工具单独记录。

二、创建对话框

创建对话框需要两个基本要素:资源表和对话框过程;前者定义所要包括的小工具,后者定义小工具的初始值及其行为。一旦具备这两个要素,则只需进行单个函数调用(GUI_CreateDialogBox() 或 GUI_ExecDialogBox())就能创建对话框。

1.对话框资源表

对话框可以基于阻塞(使用 GUI_ExecDialogBox() )或非阻塞(使用 GUI_CreateDialogBox() )方式创建。必须首先定义一个资源表,以指定在对话框中所要包括的所有小工具,一般我们使用 GUIBulider 设计界面的时候选择了对话框的话就会在最终生成的 C 文件中自动生成资源表
在这里插入图片描述
这是我们昨天创建生成.c文件的资源表

2.对话框回调函数

前面说过了对话框也是窗口的,创建对话框也是需要回调函数,通过回调函数来初始化对话框中其他小工具和定义这些小工具的行为,回调函数如下所示:

//对话框回调函数
static void _cbDialog(WM_MESSAGE * pMsg) 
{
    
    
switch (pMsg->MsgId) 
{
    
    
case WM_INIT_DIALOG:
//其他消息… defauyt:
WM_DefaultProc(pMsg);
} }

创建对话框后,所有资源表中的小工具都将可见。尽管这些小工具在上面的屏幕截图中可见,但它们是以 “空”的形式出现的。这是因为对话框过程函数尚未包含初始化单个元素的代码。小工具的初始值、由它们所引起的行为以及它们之间的交互作用都需要在对话框过程中进行定义。

3.对话框初始化

在这里插入图片描述
使用工具创建也会自动生成初始值,同样可以用代码进行初始化

static void _cbCallback(WM_MESSAGE * pMsg) 
{
    
    
 WM_HWIN hEdit0;
 WM_HWIN hEdit1;
WM_HWIN hEdit2;
WM_HWIN hEdit3;
WM_HWIN hListBox;
 WM_HWIN hDropd0;
 WM_HWIN hDropd1;
 WM_HWIN hWin= pMsg->hWin;
 switch (pMsg->MsgId) 
{
    
    
 case WM_INIT_DIALOG: //WM_INIT_DIALOG 消息,初始化所有小控件
 hEdit0 = WM_GetDialogItem(hWin, GUI_ID_EDIT0);
 hEdit1 = WM_GetDialogItem(hWin, GUI_ID_EDIT1);
 hEdit2 = WM_GetDialogItem(hWin, GUI_ID_EDIT2);
 hEdit3 = WM_GetDialogItem(hWin, GUI_ID_EDIT3);
 hListBox = WM_GetDialogItem(hWin, GUI_ID_LISTBOX0);
 hDropd0 = WM_GetDialogItem(hWin, GUI_ID_DROPDOWN0);
 hDropd1 = WM_GetDialogItem(hWin, GUI_ID_DROPDOWN1);
 //初始化所有小控件
 EDIT_SetText(hEdit0, "EDIT widget 0");
 EDIT_SetText(hEdit1, "EDIT widget 1");
 EDIT_SetTextAlign(hEdit1, GUI_TA_LEFT);
 EDIT_SetHexMode(hEdit2, 0x1234, 0, 0xffffff);
 EDIT_SetBinMode(hEdit3, 0x1234, 0, 0xffff);
 LISTBOX_SetText(hListBox, _apListBox);
 WM_DisableWindow (WM_GetDialogItem(hWin, GUI_ID_CHECK1));
 CHECKBOX_Check( WM_GetDialogItem(hWin, GUI_ID_CHECK0));
 CHECKBOX_Check( WM_GetDialogItem(hWin, GUI_ID_CHECK1));
 SLIDER_SetWidth( WM_GetDialogItem(hWin, GUI_ID_SLIDER0), 5);
 SLIDER_SetValue( WM_GetDialogItem(hWin, GUI_ID_SLIDER1), 50);
 SCROLLBAR_CreateAttached(hListBox, SCROLLBAR_CF_VERTICAL);
 DROPDOWN_AddString(hDropd0, "Item 0");
 DROPDOWN_AddString(hDropd0, "Item 1");
 DROPDOWN_AddString(hDropd0, "Item 2");
 DROPDOWN_AddString(hDropd1, "Item 0");
 DROPDOWN_AddString(hDropd1, "Item 1");
 DROPDOWN_AddString(hDropd1, "Item 2");
 DROPDOWN_AddString(hDropd1, "Item 3");
 DROPDOWN_AddString(hDropd1, "Item 4");
 break;
 default:
 WM_DefaultProc(pMsg);
 } 
 }

三、定义小工具功能

一旦对话框得到初始化,则剩下的所有工作便是向对话框过程函数添加代码,这样可定义小工具为,从而使其能充分操作。
在这里插入图片描述
这是昨天创建的对话框,已经给我们预留好了填入的位置

static void _cbCallback(WM_MESSAGE * pMsg) 
{
    
    
 WM_HWIN hEdit0;
 WM_HWIN hEdit1;
 WM_HWIN hEdit2;
 WM_HWIN hEdit3;
 WM_HWIN hListBox;
 WM_HWIN hDropd0;
 WM_HWIN hDropd1;
 WM_HWIN hWin; 
 hWin = pMsg->hWin;
 switch (pMsg->MsgId) 
{
    
    
 case WM_INIT_DIALOG: //WM_INT_DIALOG 消息,用于初始化小工具
 hEdit0 = WM_GetDialogItem(hWin, GUI_ID_EDIT0);
 hEdit1 = WM_GetDialogItem(hWin, GUI_ID_EDIT1);
 hEdit2 = WM_GetDialogItem(hWin, GUI_ID_EDIT2);
 hEdit3 = WM_GetDialogItem(hWin, GUI_ID_EDIT3);
 hListBox = WM_GetDialogItem(hWin, GUI_ID_LISTBOX0);
 hDropd0 = WM_GetDialogItem(hWin, GUI_ID_DROPDOWN0);
 hDropd1 = WM_GetDialogItem(hWin, GUI_ID_DROPDOWN1);
 //初始化小工具
 EDIT_SetText(hEdit0, "EDIT widget 0");
 EDIT_SetText(hEdit1, "EDIT widget 1");
 EDIT_SetTextAlign(hEdit1, GUI_TA_LEFT);
 EDIT_SetHexMode(hEdit2, 0x1234, 0, 0xffffff);
 EDIT_SetBinMode(hEdit3, 0x1234, 0, 0xffff);
 LISTBOX_SetText(hListBox, _apListBox);
 WM_DisableWindow (WM_GetDialogItem(hWin, GUI_ID_CHECK1));
 CHECKBOX_Check( WM_GetDialogItem(hWin, GUI_ID_CHECK0));
 CHECKBOX_Check( WM_GetDialogItem(hWin, GUI_ID_CHECK1));
 SLIDER_SetWidth( WM_GetDialogItem(hWin, GUI_ID_SLIDER0), 5);
 SLIDER_SetValue( WM_GetDialogItem(hWin, GUI_ID_SLIDER1), 50);
 SCROLLBAR_CreateAttached(hListBox, SCROLLBAR_CF_VERTICAL);
 DROPDOWN_AddString(hDropd0, "Item 0");
 DROPDOWN_AddString(hDropd0, "Item 1");
 DROPDOWN_AddString(hDropd0, "Item 2");
 DROPDOWN_AddString(hDropd1, "Item 0");
 DROPDOWN_AddString(hDropd1, "Item 1");
 DROPDOWN_AddString(hDropd1, "Item 2");
 DROPDOWN_AddString(hDropd1, "Item 3");
 DROPDOWN_AddString(hDropd1, "Item 4");
 break;
 case WM_KEY:
 switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) 
{
    
    
 case GUI_KEY_ESCAPE:
 GUI_EndDialog(hWin, 1);
 break;
 case GUI_KEY_ENTER:
 GUI_EndDialog(hWin, 0);
 break;
 }
 break;
 case WM_NOTIFY_PARENT: (1)
 Id= WM_GetId(pMsg->hWinSrc); //获取小控件 ID 号 (2)
 NCode = pMsg->Data.v; //消息类型 (3)
 switch (NCode) 
{
    
    
 case WM_NOTIFICATION_RELEASED: //按键被释放 (4)
 if (Id == GUI_ID_OK) //OK 按键 (5)
{
    
     
 GUI_EndDialog(hWin, 0);
 }
 if (Id == GUI_ID_CANCEL) //CANCEL 按键 (6)
{
    
     
 GUI_EndDialog(hWin, 1);
 }
 break;
 }
 break;
 default:
 WM_DefaultProc(pMsg);
 } }

(1)、WM_NOTIFY_PARTEN 消息,当子控件发生改变的时候就会向父控件发送此消息。
(2)、获取小控件的 ID 号
(3)、获取小控件发来的消息类型。
(4)、消息类型为 WM_NOTIFICATION_RELEASED,即当按键被释放以后就会发送此消息。
(5)、控件 ID 为 GUI_ID_OK,也就是 OK 按键被释放了
(6)、空间 ID 为 GUI_ID_CANCEL,也就是 CANCEL 按键被释放了。

四、对话框API函数

GUI_CreateDialogBox() 创建非阻塞式对话框。
GUI_ExecCreatedDialog() 执行已创建的对话框。
GUI_ExecDialogBox() 创建并执行对话框。
GUI_EndDialog() 结束对话框。

1. GUI_CreateDialogBox()

在这里插入图片描述

2. GUI_ExecCreatedDialog()

在这里插入图片描述

3.GUI_ExecDialogBox()

描述
创建并执行对话框
在这里插入图片描述

4.GUI_EndDialog()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_51963216/article/details/124033038
今日推荐