这次在用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));
通过查看新建对话框函数的源代码之后有了一点发现
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)); } }
然后就传递消息没有问题了。呵呵,问题解决了,又多了一次经验,嘿嘿