【ucGUI如何在对话框的标题栏中新增自定义按钮】

ucGUI如何在对话框的标题栏中新增自定义按钮


本文章基于ucGUI3.98版本而言,因为公司不让升级版本,版本变动会带来很多麻烦,因此基于旧版本实现一些功能。

对话框中可以新增的按钮

对话框标题栏可以添加的按钮
可以添加的有最大化按钮,最小化按钮,以及关闭按钮,这些按钮触发事件都是gui内核管控的,我们没法直接修改,比如关闭按钮,点击后,直接退出对话框了,有的时候在关闭窗口的时候需要触发一些自定义事件,如果使用系统提供的关闭按钮就无法加入自己的代码。

在不能修改源码的前提下,我们为什么不自己自定义一个按钮呢。

在标题栏加入自定义按钮

正常当我们需要添加关闭按钮时,我们调用的时函数是:

WM_HWIN FRAMEWIN_AddCloseButton(FRAMEWIN_Handle hObj, int Flags, int Off) {
  WM_HWIN hButton;
  hButton = FRAMEWIN_AddButton(hObj, Flags, Off, GUI_ID_CLOSE);
  BUTTON_SetSelfDraw(hButton, 0, &_Draw);
  WM_SetCallback(hButton, _cbClose);
  return hButton;
}

#else
  void FRAMEWIN_ButtonClose_c(void) {} /* avoid empty object files */
#endif /* GUI_WINSUPPORT */

可以看到其实内部调用的是FRAMEWIN_AddButton()来添加一个按钮,调用BUTTON_SetSelfDraw()来画按钮的外观,调用WM_SetCallback()来设置按钮回调函数,有样学样,我们在需要创建窗体按钮所在文件中对这个函数进行实现。

/* 关闭按钮团绘制函数 */
static void _Draw(void) {
  GUI_RECT r;
  int i, Size;
  WM_GetInsideRect(&r);
  WM_ADDORG(r.x0, r.y0);
  WM_ADDORG(r.x1, r.y1);
  Size = r.x1 - r.x0 - 2;
  WM_ITERATE_START(&r); {
    for (i = 2; i < Size; i++) {
      LCD_DrawHLine(r.x0 + i,     r.y0 + i, r.x0 + i + 1);
      LCD_DrawHLine(r.x1 - i - 1, r.y0 + i, r.x1 - i);
    }
  } WM_ITERATE_END();
}

/* 添加对话框添加自定义按钮 */
WM_HWIN FRAMEWIN_AddMyOwnButton(FRAMEWIN_Handle hObj, int Flags, int Off) {
  WM_HWIN hButton;
  hButton = FRAMEWIN_AddButton(hObj, Flags, Off, GUI_ID_CLOSE);
  BUTTON_SetSelfDraw(hButton, 0, &_Draw);
  WM_SetCallback(hButton, _cbMyOwnButton);  // 【重要】设置按钮回调函数
  return hButton;
}

/* 自定义按钮回调函数 */
void _cbMyOwnButton(WM_MESSAGE *p_msg) {
  if (p_msg->Data.v == WM_NOTIFICATION_RELEASED) {  // 按键被按下
  	GUI_EndDialog(p_msg->hWinSrc, 0);  // 关闭自定义按钮所在对话框
  	// TODO: 实现自己的自定事件
  	
  }
  BUTTON_Callback(p_msg);  // 【重要】事件交给内核管控,一定要加
}

如此我们就成功自定义了一个对话框标题栏关闭按钮。
自定义按钮的位置,是靠做还是靠右,由WM_HWIN FRAMEWIN_AddMyOwnButton(FRAMEWIN_Handle hObj, int Flags, int Off) 中的Flags参数来控制,可选值有:

#define FRAMEWIN_BUTTON_RIGHT   (1<<0)
#define FRAMEWIN_BUTTON_LEFT    (1<<1)

根据需求选择相应的宏即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值