OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4560|回复: 1

emwin界面的SPINBOX,SWIPELIST的常见问题

[复制链接]

3

主题

7

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-12-30
在线时间
11 小时
发表于 2020-5-14 17:45:33 | 显示全部楼层 |阅读模式
   最近一段时间在搞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;




   内容比较乱,但都是我遇到的问题,希望可以帮到大家
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10540
金钱
10540
注册时间
2017-2-18
在线时间
1908 小时
发表于 2020-12-14 21:06:23 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 08:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表