这次在用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));
}
}
然后就传递消息没有问题了。呵呵,问题解决了,又多了一次经验,嘿嘿
我要赚赏金
