ucGUI 几个重要例程Demo
按钮的定制
#include <stddef.h> #include <string.h> #include "WM.h" #include "FRAMEWIN.h" #include "BUTTON.h" #include "BUTTON_Private.h" #include "GUI_Protected.h" /********************************************************************* * * Static data * ********************************************************************** */ static WM_CALLBACK * _pcbCallback; static int _Color; static int _Font; static int _Pressed; static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = { { FRAMEWIN_CreateIndirect, "Round button sample", 0, 50, 60, 200, 120, FRAMEWIN_CF_MOVEABLE }, { BUTTON_CreateIndirect, "Button", GUI_ID_BUTTON0, 100, 10, 80, 80 }, { BUTTON_CreateIndirect, "Callback", GUI_ID_BUTTON1, 10, 10, 60, 20 }, { BUTTON_CreateIndirect, "Font", GUI_ID_BUTTON2, 10, 30, 60, 20 }, { BUTTON_CreateIndirect, "Color", GUI_ID_BUTTON3, 10, 50, 60, 20 }, { BUTTON_CreateIndirect, "Cancel", GUI_ID_CANCEL, 10, 70, 60, 20 } }; /********************************************************************* * * Static functions * ********************************************************************** */ /********************************************************************* * * _OnPaint * * Purpose: Paints the owner drawn button */ static void _OnPaint(BUTTON_Handle hObj) { int Index; char ac[50]; GUI_RECT Rect; BUTTON_Obj * pObj; pObj = BUTTON_H2P(hObj); Index = (WIDGET_GetState(hObj) & BUTTON_STATE_PRESSED) ? 1 : 0; WM_GetClientRect(&Rect); /* Draw filled ellipse with button background color */ GUI_SetColor(BUTTON_GetBkColor(hObj, Index)); GUI_FillEllipse(Rect.x1 / 2, Rect.y1 / 2, Rect.x1 / 2, Rect.y1 / 2); /* Draw black shape */ GUI_SetColor(GUI_BLACK); GUI_DrawEllipse(Rect.x1 / 2, Rect.y1 / 2, Rect.x1 / 2, Rect.y1 / 2); /* Draw button text with widget attributes */ GUI_SetColor(BUTTON_GetTextColor(hObj, Index)); GUI_SetBkColor(BUTTON_GetBkColor(hObj, Index)); GUI_SetFont(BUTTON_GetFont(hObj)); BUTTON_GetText(hObj, ac, sizeof(ac)); if (_Pressed) { strcpy(ac + strlen(ac), "\npressed"); } GUI_DispStringInRect(ac, &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER); } /********************************************************************* * * _cbButton * * Purpose: * 1. Calls the owner draw function if the WM_PAINT message has been send * 2. Calls the original callback for further messages * 3. After processing the messages the function evaluates the pressed-state * if the WM_TOUCH message has been send */ static void _cbButton(WM_MESSAGE *pMsg) { switch (pMsg->MsgId) { case WM_PAINT: _OnPaint(pMsg->hWin); break; default: _pcbCallback(pMsg); /* The original callback */ break; } if (pMsg->MsgId == WM_TOUCH) { if (BUTTON_IsPressed(pMsg->hWin)) { if (!_Pressed) { _Pressed = 1; } } else { _Pressed = 0; } } } /********************************************************************* * * _cbDialog * * Purpose: Dialog callback routine */ static void _cbDialog(WM_MESSAGE *pMsg) { int NCode, Id; WM_HWIN hDlg; BUTTON_Handle hButton; hDlg = pMsg->hWin; switch (pMsg->MsgId) { case WM_PAINT: WM_DefaultProc(pMsg); /* Handle dialog items */ /* After drawing the dialog items add some user drawn items to the window */ GUI_SetPenSize(10); GUI_SetColor(GUI_GREEN); GUI_DrawLine( 95, 5, 185, 95); GUI_SetColor(GUI_RED); GUI_DrawLine( 95, 95, 185, 5); break; case WM_INIT_DIALOG: hButton = WM_GetDialogItem(hDlg, GUI_ID_BUTTON0); WM_SetHasTrans(hButton); /* Set transparency flag for button */ break; case WM_KEY: switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) { case GUI_KEY_ESCAPE: GUI_EndDialog(hDlg, 1); break; case GUI_KEY_ENTER: GUI_EndDialog(hDlg, 0); break; } break; case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */ NCode = pMsg->Data.v; /* Notification code */ switch (NCode) { case WM_NOTIFICATION_RELEASED: /* React only if released */ hButton = WM_GetDialogItem(hDlg, GUI_ID_BUTTON0); if (Id == GUI_ID_BUTTON1) { /* Toggle callback */ if (_pcbCallback) { WM_SetCallback(hButton, _pcbCallback); _pcbCallback = 0; } else { _pcbCallback = WM_SetCallback(hButton, _cbButton); } WM_InvalidateWindow(hButton); } if (Id == GUI_ID_BUTTON2) { /* Toggle font */ if (_Font) { BUTTON_SetFont(hButton, &GUI_Font13_1); } else { BUTTON_SetFont(hButton, &GUI_Font8x16); } _Font ^= 1; } if (Id == GUI_ID_BUTTON3) { /* Toggle color */ if (_Color) { BUTTON_SetBkColor(hButton, 0, 0xaaaaaa); BUTTON_SetBkColor(hButton, 1, GUI_WHITE); BUTTON_SetTextColor(hButton, 0, GUI_BLACK); BUTTON_SetTextColor(hButton, 1, GUI_BLACK); } else { BUTTON_SetBkColor(hButton, 0, GUI_BLUE); BUTTON_SetBkColor(hButton, 1, GUI_RED); BUTTON_SetTextColor(hButton, 0, GUI_WHITE); BUTTON_SetTextColor(hButton, 1, GUI_YELLOW); } _Color ^= 1; } if (Id == GUI_ID_OK) { /* OK Button */ GUI_EndDialog(hDlg, 0); } if (Id == GUI_ID_CANCEL) { /* Cancel Button */ GUI_EndDialog(hDlg, 1); } break; } break; default: WM_DefaultProc(pMsg); } } /********************************************************************* * * MainTask * ********************************************************************** */ void MainTask(void) { GUI_Init(); /* Use memory devices for all windows */ WM_SetCreateFlags(WM_CF_MEMDEV); WM_EnableMemdev(WM_HBKWIN); WM_SetDesktopColor(GUI_GREEN); while(1) { _Font = 0; _Color = 0; _pcbCallback = 0; GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbDialog, 0, 0, 0); GUI_Delay(1000); } }
对话框
代码:
static void _cbBkWindow(WM_MESSAGE* pMsg) { switch (pMsg->MsgId) { case WM_PAINT: GUI_SetBkColor(GUI_RED); GUI_Clear(); GUI_SetColor(GUI_WHITE); GUI_SetFont(&GUI_Font24_ASCII); GUI_DispStringHCenterAt("DIALOG_MessageBox - Sample", 160, 5); break; default: WM_DefaultProc(pMsg); } } /******************************************************************* * * MainTask * Demonstrates a message box * ******************************************************************** */ void MainTask(void) { GUI_Init(); WM_SetCallback(WM_HBKWIN, &_cbBkWindow); /* Create message box and wait until it is closed */ while (1) { GUI_MessageBox("This text is shown\nin a message box", "Caption/Title", GUI_MESSAGEBOX_CF_MOVEABLE); GUI_Delay(750); /* Wait for a short moment ... */ GUI_MessageBox("New message !", "Caption/Title", GUI_MESSAGEBOX_CF_MOVEABLE); GUI_Delay(750); } }
回调函数(窗口创建)
代码:
#include "GUI.h" #include "WM.h" /******************************************************************* * * static code * ******************************************************************** */ /******************************************************************* * * _cbBkWindow */ static void _cbBkWindow(WM_MESSAGE* pMsg) { switch (pMsg->MsgId) { case WM_PAINT: GUI_ClearRect(0, 50, 319, 239); default: WM_DefaultProc(pMsg); } } /******************************************************************* * * _cbWindow */ static void _cbWindow(WM_MESSAGE* pMsg) { GUI_RECT Rect; switch (pMsg->MsgId) { case WM_PAINT: WM_GetInsideRect(&Rect); GUI_SetBkColor(GUI_RED); GUI_SetColor(GUI_YELLOW); GUI_ClearRectEx(&Rect); GUI_DrawRectEx(&Rect); GUI_SetColor(GUI_BLACK); GUI_SetFont(&GUI_Font8x16); GUI_DispStringHCenterAt("Foreground window", 75, 40); break; default: WM_DefaultProc(pMsg); } } /******************************************************************* * * _MoveWindow */ static void _MoveWindow(const char* pText) { WM_HWIN hWnd; int i; /* Create foreground window */ hWnd = WM_CreateWindow(10, 50, 150, 100, WM_CF_SHOW, _cbWindow, 0); GUI_Delay(500); /* Move foreground window */ for (i = 0; i < 40; i++) { WM_MoveWindow(hWnd, 2, 2); GUI_Delay(10); } /* Show text before deleting window if we have one */ if (pText) { GUI_DispStringAt(pText, 5, 50); GUI_Delay(2500); } /* Delete foreground window */ WM_DeleteWindow(hWnd); WM_Invalidate(WM_HBKWIN); GUI_Exec(); } /******************************************************************* * * _DemoRedraw */ static void _DemoRedraw(void) { WM_CALLBACK* _cbOldBk; GUI_SetBkColor(GUI_BLACK); GUI_Clear(); GUI_SetColor(GUI_WHITE); GUI_SetFont(&GUI_Font24_ASCII); GUI_DispStringHCenterAt("WM_Redraw - Sample", 160, 5); GUI_SetFont(&GUI_Font8x16); while(1) { /* Move a window over background */ _MoveWindow("Background has not been redrawn"); /* Clear background */ GUI_ClearRect(0, 50, 319, 239); GUI_Delay(1000); /* Set callback for background window */ _cbOldBk = WM_SetCallback(WM_HBKWIN, _cbBkWindow); /* Move a window over background */ _MoveWindow("Background has been redrawn"); /* Delete callback for Background window */ WM_SetCallback(WM_HBKWIN, _cbOldBk); } } /******************************************************************* * * MainTask * * Demonstrates redrawing * ******************************************************************** */ void MainTask(void) { GUI_Init(); _DemoRedraw(); }
时间: 2024-11-06 01:11:55