新手上路
- 积分
- 47
- 金钱
- 47
- 注册时间
- 2019-12-30
- 在线时间
- 11 小时
|
最近一段时间在搞ST的图形界面库,以前从没有接触过,不可避免的走了很多的弯路。
如果你的卡发板是带触摸屏的,希望我的建议可以帮到你们。
1.接触到一个控件,很重要的一个是控件发生改变时的通知代码也称为消息。例如WM_NOTIFICATION_RELEASED这个消息,很多控件都是带有的,而且很多控件都的相关处理都是在这case WM_NOTIFICATION_RELEASED:下面做的处理。
这个小时的意思是你点击了控件,并且已经松开。当然,具体在哪里处理控件消息,还是要看自己的需求,有按键,鼠标输入的可能要另外处理。还有就是控件对应的API,这个是具体操作的函数接口,不过只需要熟悉常用的即可。
2.跑裸机EMWIN和UCOSS的em都可,但是建议用emwinv5.44以上的版本,个人觉得这个库还是有些Bug,低版本的emwin版本库会出现问题。
3.学会使用GUIBuilder,这个软件的版本也最好是最新的。创建窗口一般通过这个软件,以对话框的形式创建,生成代码会包含程序框架,可以减少很多的代码量,这个软件值得推荐
4. GUI_Delay()函数用于刷新界面,while()循环中一定要带这个函数,不然你的界面可能会显示不出来。
5. CHECKBOX,TEXT,EDIT,DROPDOWN,SWIPELIST,SPINBOX是我用的比较多的控件。CHECKBOX比较简单,在对应的case 消息处理中可以处理,检测一下CHECKBOX的状态,然后就可做逻辑处理了。TEXT控件比较简单,直接调用函数接口显示文本就可以了。如果要显示帧整数,可以通过sprintf函数定向输出到数组中,然后TEXT_SET()显示就行。EDIT的单独使用不算太难,可以看 说明文档。Dropdown删除项目实记得从最后一个删除。不要从0开始删除,不然会使后面的项目变为0。导致第一项目永远删除不了。我在中英切换的时候踩过这个坑。
重点讲解SWIPELIST和SPINBOX控件。SWIPELIST控件在emwimV早期的版本库中是没有这个控件的,但是这个控件的用处很大,可以做成手机类似的滑动功能框。这个可以看SEEGER的官方例程,知道如何创建。我一般是通过对话框资源列表的形式创建的。添加控CHECKBOX,SPINBOX,等控件到SWIPELIST中有相关的接口。这里说在
在SWIPELIST上控件的的消息处理问题,如果有过相关操作的网友,可能就会发现,在对应的控件通知消息里没有反应,不响应。问题其实出在父句柄上,此时的父句柄已经变化了SWIPELIST的句柄,而不再Pmsg->win了,所以这里要给SWIPELIST函数设置一个回调函数,在SWIPELIST的回调函数中去处理CHECKKBOX,EDIT,SPINBOX等控件的通知消息,以下是参考,希望可以帮到你。
/*********************************************************************
*
* _cbSwipe
*/
static void _cbSwipe(WM_MESSAGE * pMsg) {
GUI_COLOR aColor[] = { GUI_BLACK, GUI_GREEN };
int Id;
int NCode;
int State;
switch (pMsg->MsgId) {
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch (Id) {
case ID_CHECKBOX_0:
switch (NCode) {
case WM_NOTIFICATION_RELEASED:
printf("hello world!!\r\n");
break;
}
break;
}
break;
default:
SWIPELIST_Callback(pMsg);
break;
}
}
/*********************************************************************
*
* _cbDialog
*/
static void _cbDialog(WM_MESSAGE * pMsg) {
WM_HWIN hItem,hItem1;
int NCode;
int Id;
// USER START (Optionally insert additional variables)
// USER END
switch (pMsg->MsgId) {
case WM_INIT_DIALOG:
hItem = pMsg->hWin;
FRAMEWIN_SetBarColor(hItem,1,GUI_BLACK);
FRAMEWIN_SetTitleHeight(hItem, 40);
FRAMEWIN_SetTextColor(hItem, GUI_WHITE);
FRAMEWIN_SetText(hItem,UF8_SETTING);
FRAMEWIN_AddCloseButton(hItem,FRAMEWIN_BUTTON_RIGHT,0);
//
// Initialization of 'Checkbox'
//
hItem = WM_GetDialogItem(pMsg->hWin, ID_CHECKBOX_0);
CHECKBOX_SetText(hItem, "");
hItem = WM_GetDialogItem(pMsg->hWin, ID_SWIPELIST_0);
SWIPELIST_AddItem(hItem,paItemText[0] ,60);
hItem1 = WM_GetDialogItem(pMsg->hWin, ID_CHECKBOX_0);
SWIPELIST_ItemAttachWindow(hItem,0,hItem1,800,10);
// USER START (Optionally insert additional code for further widget initialization)
// USER END
WM_SetCallback(hItem, _cbSwipe);
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
最后一个控件,要将的是如何用SPINBOX控制浮点数的加减,首先要搞明白SPINBOX控件其实是拼接的控件,里面包含Edit控件。要加减浮点数
hItem2 = WM_GetDialogItem(pMsg->hWin,ID_SPINBOX_Blight_time);
SWIPELIST_ItemAttachWindow(hItem,8,hItem2,700,10);
hEdit = SPINBOX_GetEditHandle(hItem2);
EDIT_SetFloatMode(hEdit,20.0,20.0,40.0,1,0); //设置初始值是20.0
//EDIT_SetFloatValue(hEdit,20.0);
SPINBOX_SetEdge(hItem2, SPINBOX_EDGE_CENTER);
SPINBOX_SetButtonSize(hItem2, 40);
SPINBOX_SetFont(hItem2,GUI_FONT_32B_ASCII);
SPINBOX_SetStep(hItem2,5); //如果启用了上面的浮点数显示的话,这里加减0.5,如果没有启用浮点数就是加减5
大家可以根据需要设置加减。
对应消息处理:
case ID_SPINBOX_Blight_time: // Notifications sent by 'Spinbox'
switch(NCode) {
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:
break;
case WM_NOTIFICATION_MOVED_OUT:
break;
case WM_NOTIFICATION_VALUE_CHANGED:
hItem = WM_GetDialogItem(HWins,ID_SPINBOX_Blight_time);
hEdit = SPINBOX_GetEditHandle(hItem);
temp = EDIT_GetFloatValue(hEdit); //获取小数,整数直接用SPINBOX_GetValue()
printf("Blight_time:%.1f\r\n",temp);
break;
内容比较乱,但都是我遇到的问题,希望可以帮到大家
|
|