首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

UCGUI窗体管理及消息处理机制分析(6)

UCGUI窗体管理及消息处理机制分析(6)

第一种办法:

Ø
将GUI_ExecDialogBox中的消息LOOP提出到 MainTask这个UCGUI应用当中,放在所有的对话框创建之后进行;并将在它当中增加一个创建对话框个数的变量用于统计当前已经创建的对话框数量,在Dialog.c当中有一个现成没作什么用的全局变量static int _r;可以改做此用.
Ø
将GUI_ExecDialogBox中建对话框时中调用GUI_CreateDialogBox所传的窗体消息回调函数改成用户自定义指定的,而非Dialog.c中中默认的_cbDialog,这个函数的作用就是调用用户指定的对话框窗体消息回调函数,所以可以在创建对话框中直接传用户指定的消息回调函数。
Ø
在GUI_EndDialog当中相应的将当前对话框个数减少,每关闭一个对话框减一.
Ø
在Dialog.c增加一个函数用于返回当前已经创建的对话框个数GUI_ExecDialogNum(),用于判断是否应该继续进行消息LOOP处理。


须要修改的几个函数修改成如下所示:



int GUI_ExecDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget,

int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent,


int x0, int y0)

{

GUI_CreateDialogBox(paWidget, NumWidgets, cb, hParent, x0, y0);


return ++_r;

}
void GUI_EndDialog(WM_HWIN hWin, int r) {

_cb = NULL;


_r--;


WM_DeleteWindow(hWin);

}
int GUI_ExecDialogNum()
{

return _r;

}
void MainTask(void)
{

GUI_Init();


WM_SetDesktopColor(GUI_RED);
WM_SetCreateFlags(WM_CF_MEMDEV);

GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);


while(GUI_ExecDialogNum()) {


if (!GUI_Exec())


GUI_X_ExecIdle();


}

}


第二种办法:


1、将原来的_cb修改成一个结构为new_cb的结构数组,首设定最多可创建10个对话框窗体:
typedef struct win_cb{

WM_CALLBACK* _cb;
//用户自定义消息回调函数..


WM_HWIN hwin;

//_cb消息函数对应的对话框窗口..


WM_HWIN hclient;
//_cb消息函数对应的对话框FrameWin窗口客户区...

}new_cb,*lpnew_cb;


//在_cb数组中当前可用元素位置.
static int dialog_pos = 0;
//最多可创建对话框窗体数目,其实可以改成支持无数个,但这里作简单处理
static int MAX_DIALOG = 10;
//检查是否还有独立窗体存在, 以决定是否退出消息LOOP...
int
checkHasDialog();

//获取当前可用于存放对话框的位置索引, 创建新对话框时调用.
int getDialogIndex(lpnew_cb lp_cb);
//对话框窗口数组,创建对话框后, 将其相关信息记载到该数组当中时,其成员//赋值必须注意几个问题,在下面具体代码中说明:
static new_cb _cb[10];



//新修改后的创建对话框的函数...
int GUI_ExecDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget,

int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent,


int x0, int y0)

{

dialog_pos = getDialogIndex(_cb);


if(dialog_pos != -1) _cb[dialog_pos]._cb = cb;


else return _r;


GUI_CreateDialogBox(paWidget,NumWidgets,_cbDialog,hParent,x0, y0);


return _r;

}


WM_HWIN GUI_CreateDialogBox(constGUI_WIDGET_CREATE_INFO* paWidget,int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent,int x0, int y0)
{
WM_HWIN hDialog = paWidget->pfCreateIndirect(paWidget,hParent,x0, y0,cb);
WM_HWIN hDialogClient = WM_GetClientWindow(hDialog);
//加到GUI_CreateDialogBox中的,其余不变...
_cb[dialog_pos].hwin = hDialog;
_cb[dialog_pos++].hclient = hDialogClient;

....
}
继承事业,薪火相传
返回列表