- static const GUI_WIDGET_CREATE_INFO _aDialogLEDCreate[] = {
- { FRAMEWIN_CreateIndirect, "LED控制界面设计", 0, 0, 0, 800,480,0,0},
- { CHECKBOX_CreateIndirect, "LED2", GUI_ID_CHECK0, 380,106,78, 16, 0,0},
- { CHECKBOX_CreateIndirect, "LED3", GUI_ID_CHECK1, 380,160,78, 16, 0,0},
- { CHECKBOX_CreateIndirect, "LED4", GUI_ID_CHECK2, 380,214,78, 16, 0,0},
- { SLIDER_CreateIndirect, NULL, GUI_ID_SLIDER0, 240,300,395,43, 0,0}
- };
固定的常量定义有了各个控件的相关说明。
③、在创建对话框的时候包含有对话框的回调函数,回调函数才是本次设计的重点,回调函数完成了对话框的初始化:
- /*****************************************************************
- ** FunctionName:void InitDialog(WM_MESSAGE * pMsg)
- ** Function: to initialize the Dialog items
- **
- ** call this function in _cbCallback --> WM_INIT_DIALOG
- *****************************************************************/
- static void InitDialog(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = pMsg->hWin;
- //
- //FRAMEWIN
- //
- FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
- //
- //GUI_ID_CHECK0
- //
- CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK0),"LED2");
- //
- //GUI_ID_CHECK1
- //
- CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK1),"LED3");
- //
- //GUI_ID_CHECK2
- //
- CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK2),"LED4");
- //
- //GUI_ID_SLIDER0
- //
- SLIDER_SetRange(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10,200);
- SLIDER_SetValue(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10);
- }
- /*********************************************************************
- *
- * Dialog callback routine
- */
- static void _cbLEDCallback(WM_MESSAGE * pMsg)
- {
- int NCode, Id;
- WM_HWIN hWin = pMsg->hWin;
- WM_HWIN hItem;
- int v,i;
- switch (pMsg->MsgId)
- {
- case WM_INIT_DIALOG:
- InitDialog(pMsg);
- break;
- case WM_NOTIFY_PARENT:
- Id = WM_GetId(pMsg->hWinSrc);
- NCode = pMsg->Data.v;
- switch (Id)
- {
- case GUI_ID_CHECK0:
- switch(NCode)
- {
- case WM_NOTIFICATION_RELEASED:
- LED2^=1;
- break;
- }
- break;
- case GUI_ID_CHECK1:
- switch(NCode)
- {
- case WM_NOTIFICATION_RELEASED:
- LED3^=1;
- break;
- }
- break;
- case GUI_ID_CHECK2:
- switch(NCode)
- {
- case WM_NOTIFICATION_RELEASED:
- LED4^=1;
- break;
- }
- break;
- case GUI_ID_SLIDER0:
- switch(NCode)
- {
- case WM_NOTIFICATION_RELEASED:
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SLIDER0);
- v = SLIDER_GetValue(hItem);
- WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0));
- WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1));
- WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2));
- WM_DisableWindow(hItem);
-
- i=10;
- while(i--)
- {
- LED2=0;
- GUI_Delay(v);
- LED2=1;
- LED3=0;
- GUI_Delay(v);
- LED3=1;
- LED4=0;
- GUI_Delay(v);
- LED4=1;
- }
-
- WM_EnableWindow(hItem);
- WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0));
- WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1));
- WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2));
- LED2=1;LED3=1;LED4=1;
- CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0),0);
- CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1),0);
- CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2),0);
- break;
- }
- break;
- }
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
重点需要看的是,对话框的初始化函数里面所声明的内容:
- //
- //FRAMEWIN
- //
- FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
- //
- //GUI_ID_CHECK0
- //
- CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK0),"LED2");
- //
- //GUI_ID_CHECK1
- //
- CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK1),"LED3");
- //
- //GUI_ID_CHECK2
- //
- CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK2),"LED4");
- //
- //GUI_ID_SLIDER0
- //
- SLIDER_SetRange(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10,200);
- SLIDER_SetValue(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10);
首先是对Framewin添加关闭按钮,并且设置关闭按钮在右侧,然后一次设置CHECKBOX的文本内容,最后设置滑块的范围和初始值的大小。
④、对话框对外界触发事件的响应过程:
当用户释放了CHECKBOX方框和滑块以后,要进行对应的响应工作。
其中第一个是对CHECKBOX的响应:当每次检测到用户对控件进行操作中,对CHECKBOX释放过程后,根据对应的不同控件完成LED的翻转操作,也就是实现了对LED灯的控制作用,这是最简单的STemWin应用。
- case GUI_ID_CHECK0:
- switch(NCode)
- {
- case WM_NOTIFICATION_RELEASED:
- LED2^=1;
- break;
- }
- break;
- case GUI_ID_CHECK1:
- switch(NCode)
- {
- case WM_NOTIFICATION_RELEASED:
- LED3^=1;
- break;
- }
- break;
- case GUI_ID_CHECK2:
- switch(NCode)
- {
- case WM_NOTIFICATION_RELEASED:
- LED4^=1;
- break;
- }
- break;
另外一个响应是对滑块释放的操作,在对滑块释放后,首先获取到滑块释放后的所对应的数值大小,然后禁用上面的三个CHECKBOX和滑块自身,然后根据GUI_Delay();操作延时,进行流水灯的闪烁,其中延时的大小是由滑块的数值所决定的。在流水灯循环10次以后,使能三个CHECKBOX控件和滑块控件,恢复LED状态为熄灭,并将CHECKBOX的状态设置为0。这样完成了一次自动化的操作,输入对STemWin控件的高级应用。
- case GUI_ID_SLIDER0:
- switch(NCode)
- {
- case WM_NOTIFICATION_RELEASED:
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SLIDER0);
- v = SLIDER_GetValue(hItem);
- WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0));
- WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1));
- WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2));
- WM_DisableWindow(hItem);
-
- i=10;
- while(i--)
- {
- LED2=0;
- GUI_Delay(v);
- LED2=1;
- LED3=0;
- GUI_Delay(v);
- LED3=1;
- LED4=0;
- GUI_Delay(v);
- LED4=1;
- }
-
- WM_EnableWindow(hItem);
- WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0));
- WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1));
- WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2));
- LED2=1;LED3=1;LED4=1;
- CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0),0);
- CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1),0);
- CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2),0);
- break;
- }
- break;
最后就完成了第一个很简单的设计,功能简单,便于坛友们进一步学习STemWin的操作。