消息框继续有反应, 如果没有在 OK 按钮中调用 GUI_EndDialog 关闭对话框, 则对话框与消息框都要能够
正常反应.
关于这个问题的解决, 我想还要进一步了解 UCGUI 窗口处理的细节.
三.寻找问题的解决办法.
在我们发现这个问题, 我们已经粗步分析了, 问题不是出在我们编写程序上, 而是 UCGUI 的内部, 那么要解
决这个问题, 我们就要进一步了解 UCGUI 的窗口体系.其实换一句话说, 在嵌入式应用中, 窗口的强大直接
决定到 GUI 系统的体积大小, 并不是所有的情况都要有这种支持, 也不一定说是 UCGUI 的 BUG, 当然我们
希望在下一版本不再有这个问题.
下面是详细分析:
1. 对话框
void MainTask(void) {
GUI_Init();
WM_SetDesktopColor(GUI_RED); /* Automacally update desktop window */
WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to **oid flicker */
GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
}
上面是我们创建对话框的程序, 是我们编写的代码, 具体看 GUI_ExecDialogBox()这个函数代码如下, 它主
要有以下两个作用:
[1].创建对话框中的所有子窗体.
[2].进入消息 LOOP, 收集并转发消息到对应窗体进行处理. 消息如 WM_TOUCH 及 WM_KEY, 这些消息被
分发到对话框中各子窗体中去处理,父窗体(对话框)之所以能够处理其上子控件的消息,全都是因为子控件
在传递消息, 父窗体中对子窗体的消息进行处理, 也可以不处理, 我们编程者要处理时, 则要清楚哪些消息
是可以处理的, 不然无*编写程序, 所以子窗体中的消息一直都在往父窗体中发送, 与父窗体有无处理无关系.
int GUI_ExecDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget,int NumWidgets,
WM_CALLBACK* cb, WM_HWIN hParent,int x0, int y0)
{
_cb = cb;
GUI_CreateDialogBox(paWidget, NumWidgets, _cbDialog, hParent, x0, y0);
while (_cb) {
if (!GUI_Exec())
GUI_X_ExecIdle();
}
return _r;
}
2. 消息框
其实消息框本身就是一个只含静态文框及 OK 按钮的对话框, 在对话框的 WM_NOTIFY_PARENT 消息中
弹出消息框:
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */
NCode = pMsg->Data.v; /* Notification code */
switch (NCode) {
case WM_NOTIFICATION_RELEASED: /* React only if released */
if (Id == GUI_ID_OK) { /* OK Button */
GUI_EndDialog(hWin, 0);