UCGUI消息框无法接收键盘消息,求指点。。。

2019-12-12 18:17发布

最近写个界面要用到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这东西想要搞的出彩点,确实不是那么简单。。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。