完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
转stemwin教程
本期教程讲解STemWin支持的框架窗口控件。 44. 1 框架窗口控件介绍 44. 2 官方WIDGET_FrameWin实例 44. 3 总结 44.1 框架窗口控件介绍 框架窗口为您的应用提供一个PC应用程序的窗口外观。这些窗口由周围框架、标题栏和用户区组成。标题栏的颜色改变以显示窗口是否激活,如下图所示: |
|
相关推荐
|
|
44.1.1 框架窗口的结构
下图显示了框架窗口的详细结构和外观: 44.1.1 框架窗口的结构 下图显示了框架窗口的详细结构和外观: |
|
|
|
|
|
框架窗口实际上由2种窗口组成;主窗口和子窗口。子窗口称为客户端窗口。处理回调函数时意识到此点非常重要:存在具有2种不同回调函数的2种窗口。创建子窗口时,这些子窗口通常作为客户端窗口的子窗口而创建;它们的父窗口因此是客户端窗口。
|
|
|
|
|
|
44.2 官方WIDGET_FrameWin实例
官方的这个实例简单的演示了FrameWin的部分功能,这个例子在模拟器中的位置: |
|
|
|
|
|
源代码如下:
复制代码 #include #include #include "GUI.h" #include "FRAMEWIN.h" /********************************************************************* * * Defines * ********************************************************************** */ #define SPEED 1200 #define MSG_CHANGE_MAIN_TEXT (WM_USER + 0) (1) /********************************************************************* * * Static data * ********************************************************************** */ static FRAMEWIN_Handle _hFrame; static WM_CALLBACK* _pcbOldFrame; static char _acMainText[100]; static int _LockClose = 1; /******************************************************************* * * Static code * ******************************************************************** */ /******************************************************************* * * _ChangeMainText * * Sends a message to the background window and invalidate it, so * the callback of the background window display the new text. */ static void _ChangeMainText(char* pStr, int Delay) {(2) WM_MESSAGE Message; Message.MsgId = MSG_CHANGE_MAIN_TEXT; Message.Data.p = pStr; GUI_Delay(Delay); WM_SendMessage(WM_HBKWIN, &Message); WM_InvalidateWindow(WM_HBKWIN); GUI_Delay(Delay/3); } /******************************************************************* * * _cbChild */ static void _cbChild(WM_MESSAGE * pMsg) {(3) WM_HWIN hWin = (FRAMEWIN_Handle)(pMsg->hWin); switch (pMsg->MsgId) { case WM_PAINT: // // Handle the paint message // GUI_SetBkColor(GUI_WHITE); GUI_SetColor(GUI_BLACK); GUI_SetFont(&GUI_FontComic24B_ASCII); GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER); GUI_Clear(); GUI_DispStringHCenterAt("Client window", WM_GetWindowSizeX(hWin) / 2, WM_GetWindowSizeY(hWin) / 2); break; default: WM_DefaultProc(pMsg); } } /******************************************************************* * * _cbFrame */ static void _cbFrame(WM_MESSAGE * pMsg) { (4) switch (pMsg->MsgId) { case WM_NOTIFY_PARENT: if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) { int Id = WM_GetId(pMsg->hWinSrc); // Id of widget if (Id == GUI_ID_CLOSE) { if (_LockClose) { return; } _hFrame = 0; } } break; } if (_pcbOldFrame) { (*_pcbOldFrame)(pMsg); } } /******************************************************************* * * _cbBkWindow * * Function description * This callback is necessary to redraw the background when * frame window is moved */ static void _cbBkWindow(WM_MESSAGE * pMsg) {(5) switch (pMsg->MsgId) { case MSG_CHANGE_MAIN_TEXT: strcpy(_acMainText, (char const *)pMsg->Data.p); WM_InvalidateWindow(pMsg->hWin); break; case WM_PAINT: GUI_SetBkColor(GUI_BLACK); GUI_Clear(); GUI_SetColor(GUI_WHITE); GUI_SetFont(&GUI_Font24_ASCII); GUI_DispStringHCenterAt("WIDGET_FrameWin - Sample", 160, 5); GUI_SetFont(&GUI_Font8x16); GUI_DispStringHCenterAt(_acMainText, 160, 40); GUI_SetFont(&GUI_Font6x8); GUI_DispStringHCenterAt("The function FRAMEWIN_Create creates both then" "frame window and the client window.", 160, 190); break; default: WM_DefaultProc(pMsg); } } /******************************************************************* * * _DemoFramewin * * Function description * Creates the frame window and sets the callback for frame, child * and background window */ static void _DemoFramewin(void) {(6) int i; char acInfoText[] = "-- sec to play with window"; WM_HWIN hChild; WM_SetCallback(WM_HBKWIN, _cbBkWindow); // // Create and configure frame window // _ChangeMainText("FRAMEWIN_Create", SPEED); _hFrame = FRAMEWIN_Create("Frame window", 0, WM_CF_SHOW, 50, 75, 220, 100);(7) _pcbOldFrame = WM_SetCallback(_hFrame, _cbFrame);(8) hChild = WM_GetClientWindow(_hFrame);(9) WM_SetCallback(hChild, _cbChild);(10) FRAMEWIN_SetMoveable(_hFrame, 1);(11) // // Create buttons // FRAMEWIN_AddCloseButton(_hFrame, FRAMEWIN_BUTTON_LEFT, 0);(12) FRAMEWIN_AddMaxButton(_hFrame, FRAMEWIN_BUTTON_RIGHT, 0); FRAMEWIN_AddMinButton(_hFrame, FRAMEWIN_BUTTON_RIGHT, 2); // // Modify frame window attributes // _ChangeMainText("FRAMEWIN_SetActive", SPEED); FRAMEWIN_SetActive(_hFrame, 1);(13) _ChangeMainText("FRAMEWIN_SetFont", SPEED); FRAMEWIN_SetFont(_hFrame, &GUI_Font16B_ASCII); (14) FRAMEWIN_SetTitleHeight(_hFrame, 20); _ChangeMainText("FRAMEWIN_SetTextColor", SPEED); FRAMEWIN_SetTextColor(_hFrame, GUI_YELLOW); (15) _ChangeMainText("FRAMEWIN_SetTextAlign", SPEED); FRAMEWIN_SetTextAlign(_hFrame, GUI_TA_HCENTER);(16) _ChangeMainText("FRAMEWIN_Minimize", SPEED); FRAMEWIN_Minimize(_hFrame);(17) _ChangeMainText("FRAMEWIN_Maximize", SPEED); FRAMEWIN_Maximize(_hFrame); (18) _ChangeMainText("FRAMEWIN_Restore", SPEED); FRAMEWIN_Restore(_hFrame);(19) _ChangeMainText("FRAMEWIN_SetTitleVis", SPEED); for (i = 0; i < 5; i++) { FRAMEWIN_SetTitleVis(_hFrame, 0); (20) GUI_Delay(200); FRAMEWIN_SetTitleVis(_hFrame, 1); GUI_Delay(200); } // // Time to play with frame window // _LockClose = 0; for (i = 250; (i > 0) && _hFrame; i--) { acInfoText[0] = '0' + ((i + 9) / 100); acInfoText[1] = '0' + (((i + 9) / 10) % 10); _ChangeMainText(acInfoText, 0); GUI_Delay(100); } if (_hFrame) { _ChangeMainText("FRAMEWIN_Delete", SPEED); FRAMEWIN_Delete(_hFrame);(21) } else { _ChangeMainText("", 50); } } /********************************************************************* * * Public code * ********************************************************************** */ /********************************************************************* * * MainTask */ void MainTask(void) { GUI_Init(); WM_EnableMemdev(WM_HBKWIN); (22) while(1) { _DemoFramewin(); } } |
|
|
|
|
|
1. 自定义的一个回调消息类型。
2. 用于给桌面窗口发送自定义的回调函数消息类型。发送后将桌面窗口变得无效,然后系统就会去执行桌面窗口回调函数中的WM_PAINT消息。 3. 框架窗口中客户窗口的回调函数。 4. 框架窗口的回调函数。 5. 桌面窗口的回调函数。 6. 框架窗口中部分API函数的演示函数。 7. 创建框架窗口。 8. 设置框架窗口的回调函数。 9. 得到框架窗口中客户端窗口句柄。 10. 设置客户端窗口的回调函数。 11. 设置框架窗口可移动。 12. 为框架窗口添加最小化,最大化和关闭按钮。 13. 激活框架窗口。 14. 设置框架窗口中标题的字体。 15. 设置框架窗口中标题的颜色。 16. 设置框架窗口中标题文本的对齐。 17. 最小化框架窗口。 18. 最大化框架窗口。 19. 恢复最小化或最大化的框架窗口。 20. 设置框架窗口的标题可见。 21. 删除框架窗口。 22. 使能桌面窗口的内存设备。 |
|
|
|
|
|
这个例子中变量_LockClose的作用也很重要,它的主要作用就是在演示框架窗口时锁住关闭按钮,防止在演示的时候,用户点击了关闭按钮。大家也特别注意框架窗口回调函数_cbFrame的处理。
实际显示效果如下: |
|
|
|
|
|
44.3 总结
本期教程主要是跟大家讲解了框架窗口的使用,希望大家可以把本期教程中讲的这个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的框架窗口API,其它的API大家都可以试试。 |
|
|
|
|
|
322 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-通用文件I/O模型之close
339 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第十五章 按键中断实验
327 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第十一章 FPIOA管理器实验
823 浏览 0 评论
730 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11454 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-13 15:12 , Processed in 0.710049 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号