使用PC仿真进行实验。
使用GUIbuilder生成界面文件源码C文件。运行后显示如下
加入了几个比较简单的控件(资料中也叫小工具)。
生成文件的默认入口为CreateFramewin(void);函数,调用它运行设计好的界面(如果界面不显示或者黑屏参考上一篇文章)
WM_HWIN CreateFramewin(void) {
WM_HWIN hWin;
hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
return hWin;
}
此函数引用了GUI_CreateDialogBox函数,函数定义如下,
依次查看形参
_aDialogCreate:此参数为各个空间的信息
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 240, 320, 0, 0x0, 0 },
{ BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 106, 12, 40, 20, 0, 0x0, 0 },
{ EDIT_CreateIndirect, "Edit", ID_EDIT_0, 7, 11, 80, 20, 0, 0x64, 0 },
{ TEXT_CreateIndirect, "Text", ID_TEXT_0, 12, 49, 180, 20, 0, 0x0, 0 },
{ PROGBAR_CreateIndirect, "Progbar", ID_PROGBAR_0, 11, 275, 202, 20, 0, 0x0, 0 },
{ SLIDER_CreateIndirect, "Slider", ID_SLIDER_0, 14, 236, 196, 20, 0, 0x0, 0 },
{ BUTTON_CreateIndirect, "Button", ID_BUTTON_1, 160, 11, 40, 20, 0, 0x0, 0 },
// USER START (Optionally insert additional widgets)
// USER END
};
GUI_COUNTOF(_aDialogCreate):此参数为控件数量,#define GUI_COUNTOF(a) (sizeof(a) / sizeof(a[0]))
_cbDialog:此参数为回调函数,处理每个控件的消息。(删掉了注释)
static void _cbDialog(WM_MESSAGE * pMsg) {
WM_HWIN hItem;
int NCode;
int Id;
switch (pMsg->MsgId) { //第一层
case WM_INIT_DIALOG:
hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0); //返回对话框项目 (小工具)的窗口句柄。
EDIT_SetText(hItem, "123");
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc); //返回指定小工具窗口的 ID
NCode = pMsg->Data.v;
switch(Id) { //第二层
case ID_BUTTON_0: // Notifications sent by 'Button'
switch(NCode) {
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:
break;
}
break;
case ID_EDIT_0: // Notifications sent by 'Edit'
switch(NCode) { //第三层
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:
break;
case WM_NOTIFICATION_VALUE_CHANGED:
break;
}
break;
case ID_SLIDER_0: // Notifications sent by 'Slider'
switch(NCode) { //第三层
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:
break;
case WM_NOTIFICATION_VALUE_CHANGED:
break;
}
break;
case ID_BUTTON_1: // Notifications sent by 'Button'
switch(NCode) { //第三层
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:
break;
}
break;
}
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
WM_HBKWIN:父窗口的句柄 ,WM_HBKWIN为桌面窗口。如果为0 表示没有父窗口
最后两个是创建的Dialog相对父窗口的位置。
_cbDialog:作为创建对话框的形参,_cbDialog();函数有什么作用呢。
函数中有3层switch,最顶层的switch(设定它为第1层)有两个分支:WM_INIT_DIALOG和WM_NOTIFY_PARENT
第1层:
WM_INIT_DIALOG 消息会立即发送到对话框过程函数。
WM_NOTIFY_PARENT 消息则通过对话框的子窗口发送到对话框,通知任何事件的父窗口以确保同步化。
第2层
在WM_NOTIFY_PARENT 消息下包含了第二层switch,这一层的中作用是对目标控件的选择。
可以看到这一层switch分支都是控件的ID
第3层
在每一种控件下都会有一层switch,每个控件的不同则分支也不同。比如button,ID为ID_BUTTON_0的按键两个其分支如下:
case ID_BUTTON_0: // Notifications sent by 'Button'
switch(NCode) {
case WM_NOTIFICATION_CLICKED: //按键被按下时的操作逻辑
// USER START (Optionally insert code for reacting on notification message)
// USER END
break;
case WM_NOTIFICATION_RELEASED: //按键被释放时的操作逻辑
// USER START (Optionally insert code for reacting on notification message)
// USER END
break;
// USER START (Optionally insert additional code for further notification handling)
// USER END
}
break;
WM_NOTIFICATION_CLICKED和WM_NOTIFICATION_RELEASED,这两个消息是由button控件发送的,回调函数通过这个消息进行需要的处理。
其他控件的模式与之类似,具体内容可参考EmWin手册。