最近写个界面要用到UCGUI的模态对话框,而且必须要阻塞,原本以为很简单:单击窗口中的某个OK按钮,会弹出一个MESSAGE消息框,如果不关闭此消息框,是不能操作其它窗口的,而且进程也会被阻塞在此。于是我就在某个窗口的消息里加了创建消息框的操作(有必要提一下:我没有使用触摸,全部使用按键操作,所有窗口上的按钮控件可以使用按键的TAB键来切换):
case WM_NOTIFY_PARENT:
if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) {
Id = WM_GetId(pMsg->hWinSrc);
if(Id == GUI_ID_OK)
GUI_MessageBox("Error Message", "Error", GUI_MESSAGEBOX_CF_MODAL);
WM_SetFocus(hpWin);
}
break;
编译。。。。下载。。。。。按键操作触发。。。。。。如我所愿,FRAMEWIN框架的消息框可以正常弹出。。。。。。。但是接下来就不能操作了,可以清楚的看到焦点已经聚焦到了消息框的“OK”按钮上,我猛戳键盘上的“确定按钮”想把它关掉,但毫无反应,此时的消息框就像一潭死水。。。。。。死机了??不可能呀,应为时间还在走。。。。。“多对话框问题”??貌似UCGUI3.98已经没这个问题了??
搞了一上午,还是没搞定。。。。。。算了,自己写个对话框弹出来看看。。。。。。。。不用FRAMEWIN框框,就用普通的窗口,简单点。。。。如下:
/*********************************************************************
*
* MessageBox消息框回掉
*/
static void cbMessageBox(WM_MESSAGE * pMsg) {
int Id, NCode;
GUI_RECT r;
switch (pMsg->MsgId) {
case WM_PAINT:
GUI_SetBkColor(GUI_WHITE);
GUI_SetColor(GUI_BLACK);
WM_GetClientRect(&r);
GUI_ClearRectEx(&r);
break;
case WM_KEY:
switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {
case KB_Left: WM_SetFocusOnPrevChild(pMsg->hWin);break;//左键前移
case KB_Right: WM_SetFocusOnNextChild(pMsg->hWin);break;//右键后移
}
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch(NCode){
case WM_NOTIFICATION_RELEASED:
if(Id == GUI_ID_OK)
GUI_EndDialog(pMsg->hWin,0);
break;
}
break;
default:
WM_DefaultProc(pMsg);
}
}
/*********************************************************************
*
* 创建MESSAGEBOX
*/
void ShowMessageBox(WM_HWIN hParent, //父窗口
WM_CALLBACK* Callback, //回掉
const char * pText, //消息框内容
)
{
WM_HWIN hClient;
WM_HWIN hWin;
WM_HWIN hBut;
//创建WIN
hWin = WM_CreateWindowAsChild(10, 10, 100, 60, hParent, WM_CF_SHOW,Callback, 0 );
hClient = WM_GetClientWindow(hWin);
TEXT_CreateEx(10, 5, 80, 30, hClient, WM_CF_SHOW, GUI_TA_HCENTER, 0, pText);
hBut = BUTTON_CreateEx(5, 30, 30, 18, hClient, WM_CF_SHOW, 0, GUI_ID_CANCEL);
BUTTON_SetText(hBut, "No");
hBut = BUTTON_CreateEx(50, 30, 30, 18, hClient, WM_CF_SHOW, 0, GUI_ID_OK);
BUTTON_SetText(hBut, "Yes");
WM_SetFocusOnNextChild(hWin);//定位焦点
WM_MakeModal(hWin);//模态
GUI_ExecCreatedDialog(hWin); //阻塞窗口(加上这句,消息框无法接受键盘消息,去掉这句就正常)
}
然后调用 ShowMessageBox(0, cbMessageBox, "Error Message");消息框也可以正常弹出来。。。。但键盘一样不起作用。。。。。
快崩溃了。。。。。。。耐着性子继续折腾。。。。。。。。把 GUI_ExecCreatedDialog(hWin); //阻塞窗口
这句去掉,再试。。。。。。哎。。。。这回行了。。。。。去掉了阻塞窗口属性后,消息框可以接收键盘消息了,可以按键盘的确定按钮关闭消息框了,
虽然消息框可以通过键盘控制了,但它却不是阻塞的了。。。。。这不是我想要的结果。
那位高人出来帮忙指点指点???GUI这东西想要搞的出彩点,确实不是那么简单。。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>