这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 分享一次ucgui的调试经历

共16条 1/2 1 2 跳转至

分享一次ucgui的调试经历

高工
2014-04-02 12:10:12     打赏

      这次在用ucgui做界面切换的时候,决定不给每个菜单界面都创建一个对话框,和网友讨论的过程中,得出两种方法,一位网友说的是STM32的存储空间足够,可以先把自己所要用到的控件全部建立好,然后根据需要去设置控件是显示还是隐藏。另一位网友认为这样有点浪费内存,采用的方法是,先建立好一个对话框,然后根据自己的需要去删除和新建控件。

     之后我就选择了第二种方法,在菜单的切换中去删除和新建控件。可能是自己太菜了,第一次删除控件和新建控件就出了问题。

   问题是这样的:我先创建一个对话框作为欢迎界面(两个TEXT控件和一个BUTTON控件)


 hWinMenu = GUI_CreateDialogBox(_aDialogCreate,GUI_COUNTOF(_aDialogCreate),_cbWelcome,0,0,0); 



 我的想法是,点击按钮后删掉按钮控件和两个TEXT控件。然后再新建4个按钮控件。


  
hButton[0] = BUTTON_CreateAsChild(30,26,115,70,hWinMenu ,GUI_ID_BUTTON1,WM_CF_SHOW);
hButton[1] = BUTTON_CreateAsChild(30,124,115,70,hWinMenu,GUI_ID_BUTTON2,WM_CF_SHOW);
hButton[2] = BUTTON_CreateAsChild(188,26,115,70,hWinMenu,GUI_ID_BUTTON3,WM_CF_SHOW);
hButton[3] = BUTTON_CreateAsChild(188,124,115,70,hWinMenu,GUI_ID_BUTTON4,WM_CF_SHOW);
BUTTON_SetBitmapEx(hButton[0],0,&bmqd,30,10);
BUTTON_SetBitmapEx(hButton[1],0,&bmpf,30,10);
BUTTON_SetBitmapEx(hButton[2],0,&bmsz,30,10);
BUTTON_SetBitmapEx(hButton[3],0,&bmdc,30,10);  
BUTTON_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_BUTTON0));
TEXT_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_TEXT0));	
TEXT_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_TEXT1));			


这样写了之后的结果是,原先的控件被删除了,我所需要的4个按钮新建成功。但是此时出现了一个问题,我仿真的时候发现,我按下新建的按钮时,按键颜色虽然有变化但是回调函数里并没有收到按钮传递给父窗口的按钮按下的消息。这样我就很纳闷的总是想不出是为什么。


通过查看新建对话框函数的源代码之后有了一点发现

hWinMenu=GUI_CreateDialogBox(_aDialogCreate,GUI_COUNTOF(_aDialogCreate),_cbWelcome,0,0,0);  

我是想查看一下hWinMenu是不是我之后新建按钮所需要的父窗口句柄。


WM_HWIN GUI_CreateDialogBox(const GUI_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);     /* Create parent window */
  WM_HWIN hDialogClient = WM_GetClientWindow(hDialog);
  WIDGET_OrState(hDialog, paWidget->Flags);
  WM_ShowWindow(hDialog);
  WM_ShowWindow(hDialogClient);
  while (--NumWidgets > 0) {
    WM_HWIN hChild;
    paWidget++;
    hChild = paWidget->pfCreateIndirect(paWidget, hDialogClient, 0, 0, 0);     /* Create child window */
    WM_ShowWindow(hChild);
  }
  WM_SetFocusOnNextChild(hDialog);     /* Set the focus to the first child */
  WM_SendMessageNoPara(hDialogClient, WM_INIT_DIALOG);
  return hDialog;
}


可以看出在这个函数里,还获取了一个hDialogClient客户区的句柄,这时候就觉得自己之前想错了,我新建的按钮是以子窗口形式建立的,最后为什么传递不了消息呢,这就应该是我所填写的父窗口句柄搞错了。最后我把代码改成了这样:

void  mainMenu()
{
		BUTTON_Handle hButton[4];
	  WM_HWIN hWinClient = WM_GetClientWindow(hWinMenu);
	  if(menuStruct[menuIndex].MenuStat == 0)
		{
				optStat();    
 			  hButton[0] = BUTTON_CreateAsChild(30,26,115,70,hWinClient ,GUI_ID_BUTTON1,WM_CF_SHOW);
 			  hButton[1] = BUTTON_CreateAsChild(30,124,115,70,hWinClient,GUI_ID_BUTTON2,WM_CF_SHOW);
 			  hButton[2] = BUTTON_CreateAsChild(188,26,115,70,hWinClient,GUI_ID_BUTTON3,WM_CF_SHOW);
 			  hButton[3] = BUTTON_CreateAsChild(188,124,115,70,hWinClient,GUI_ID_BUTTON4,WM_CF_SHOW);
			  BUTTON_SetBitmapEx(hButton[0],0,&bmqd,30,10);
        BUTTON_SetBitmapEx(hButton[1],0,&bmpf,30,10);
			  BUTTON_SetBitmapEx(hButton[2],0,&bmsz,30,10);
			  BUTTON_SetBitmapEx(hButton[3],0,&bmdc,30,10);    
			  BUTTON_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_BUTTON0));
				TEXT_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_TEXT0));	
				TEXT_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_TEXT1));			
    }
}

 

然后就传递消息没有问题了。呵呵,问题解决了,又多了一次经验,嘿嘿





关键词: ucgui     调试     经历     控件    

高工
2014-04-02 12:12:33     打赏
2楼
Good,学习了

院士
2014-04-02 13:19:39     打赏
3楼

专家
2014-04-02 13:27:54     打赏
4楼

院士
2014-04-02 22:51:45     打赏
5楼
好文章  加分 精华处理

专家
2014-04-03 09:10:30     打赏
6楼
多谢分享。

高工
2014-04-03 16:57:36     打赏
7楼
互相交流,网友的力量是无穷的,呵呵

高工
2014-04-03 16:58:10     打赏
8楼
赏点积分呀

高工
2014-04-03 17:00:38     打赏
9楼
多谢支持

高工
2014-04-03 17:01:45     打赏
10楼
分享总是快乐的,呵呵

共16条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]