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)
根据需求选择相应的宏即可。