本帖最后由 湛只为无双 于 2016-1-14 15:42 编辑
首先给大家展示实际的效果图。这个是进入界面的截图:
当点击上面的三个LED方框时,能够更改LED灯的状态:
当点击下面的滑块的时候,会禁止上面的方框,并且以一定频率进行三个流水灯:
那么在这个里面所设计的STemWin界面就是这样的了:
①、首先先设定好默认的字库,字库的底层驱动请看我之前的一片帖子,里面有相关的介绍和移植,在这个帖子里我也会给出我的工程源码和HEX文件供大家参考。
FRAMEWIN_SetDefaultTextAlign(GUI_TA_VCENTER|GUI_TA_CENTER);
FRAMEWIN_SetDefaultFont(&GUI_FontHZ16);
BUTTON_SetDefaultFont(&GUI_FontHZ16);
DROPDOWN_SetDefaultFont(&GUI_FontHZ16);
TEXT_SetDefaultFont(&GUI_FontHZ16);
②、使用GUI_CreateDialogBox创建所需要的界面各个元素,函数的调用为:
其中_aDialogLEDCreate的常量定义为:
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的操作。
|
|