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的处理。 实际显示效果如下:
|