Widget.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:10k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : BUTTON.c
  16. Purpose     : emWin GSC button widget
  17. ---------------------------END-OF-HEADER------------------------------
  18. */
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include "WIDGET.h"
  22. #include "GUIDebug.h"
  23. #include "GUI.h"
  24. #include "GUI_Protected.h"
  25. #include "WM_Intern.h"
  26. #if GUI_WINSUPPORT
  27. /*********************************************************************
  28. *
  29. *       Private config defaults
  30. *
  31. **********************************************************************
  32. */
  33. /*********************************************************************
  34. *
  35. *       Object definition
  36. *
  37. **********************************************************************
  38. */
  39. /*********************************************************************
  40. *
  41. *       Static data
  42. *
  43. **********************************************************************
  44. */
  45. const WIDGET_EFFECT* _pEffectDefault = &WIDGET_Effect_3D;
  46. /*********************************************************************
  47. *
  48. *       Macros for internal use
  49. *
  50. **********************************************************************
  51. */
  52. #define WIDGET_H2P(hWin)        ((WIDGET*)WM_HMEM2Ptr(hWin))
  53. /*********************************************************************
  54. *
  55. *       Static routines
  56. *
  57. **********************************************************************
  58. */
  59. static void _RotateRect90(WIDGET* pWidget, GUI_RECT* pDest, const GUI_RECT* pRect) {
  60.   int XSize;
  61.   XSize = pWidget->Win.Rect.x1 - pWidget->Win.Rect.x0;
  62.   pDest->x0 = XSize - pRect->y1;
  63.   pDest->x1 = XSize - pRect->y0;
  64.   pDest->y0 = pRect->x0;
  65.   pDest->y1 = pRect->x1;
  66. }
  67. /*********************************************************************
  68. *
  69. *       Public routines
  70. *
  71. **********************************************************************
  72. */
  73. /*********************************************************************
  74. *
  75. *       WIDGET__GetClientRect
  76.   Returns the logical client rectangle, which means the normal
  77.   client rectangle for widgets with their standard orientation
  78.   and the rotated one for rotated widgets.
  79. */
  80. void WIDGET__GetClientRect(WIDGET* pWidget, GUI_RECT* pRect) {
  81.   if (pWidget->State & WIDGET_STATE_VERTICAL) {
  82.     GUI_RECT Rect;
  83.     WM_GetClientRect(&Rect);
  84.     pRect->x0 = Rect.y0;
  85.     pRect->x1 = Rect.y1;
  86.     pRect->y0 = Rect.x0;
  87.     pRect->y1 = Rect.x1;
  88.   } else {
  89.     WM_GetClientRect(pRect);
  90.   }
  91. }
  92. GUI_COLOR WIDGET__GetBkColor(WM_HWIN hObj) {
  93.   GUI_COLOR BkColor = WM_GetBkColor(WM_GetParent(hObj));
  94.   if (BkColor == GUI_INVALID_COLOR) {
  95.     BkColor = DIALOG_GetBkColor();
  96.   }
  97.   return BkColor;
  98. }
  99. /*********************************************************************
  100. *
  101. *       WIDGET__GetInsideRect
  102. */
  103. void WIDGET__GetInsideRect(WIDGET* pWidget, GUI_RECT* pRect) {
  104.   WM__GetClientRectWin(&pWidget->Win, pRect);
  105.   GUI__ReduceRect(pRect, pRect, pWidget->pEffect->EffectSize);
  106. }
  107. int WIDGET__GetXSize(const WIDGET* pWidget) {
  108.   int r;
  109.   if (pWidget->State & WIDGET_STATE_VERTICAL) {
  110.     r = pWidget->Win.Rect.y1 - pWidget->Win.Rect.y0;
  111.   } else {
  112.     r = pWidget->Win.Rect.x1 - pWidget->Win.Rect.x0;
  113.   }
  114.   return r + 1;
  115. }
  116. int WIDGET__GetYSize(const WIDGET* pWidget) {
  117.   int r;
  118.   if (pWidget->State & WIDGET_STATE_VERTICAL) {
  119.     r = pWidget->Win.Rect.x1 - pWidget->Win.Rect.x0;
  120.   } else {
  121.     r = pWidget->Win.Rect.y1 - pWidget->Win.Rect.y0;
  122.   }
  123.   return r + 1;
  124. }
  125. /*******************************************************************
  126. *
  127. *       WIDGET__GetWindowSizeX
  128.   Return width (or height in case of rotation) of window in pixels
  129. */
  130. int WIDGET__GetWindowSizeX(WM_HWIN hWin) {
  131.   WIDGET* pWidget = WIDGET_H2P(hWin);
  132.   if (pWidget->State & WIDGET_STATE_VERTICAL) {
  133.     return WM_GetWindowSizeY(hWin);
  134.   } else {
  135.     return WM_GetWindowSizeX(hWin);
  136.   }
  137. }
  138. /*********************************************************************
  139. *
  140. *       WIDGET_SetState
  141. */
  142. void WIDGET_SetState(WM_HWIN hObj, int State) {
  143.   WIDGET* pWidget = WIDGET_H2P(hObj);
  144.   if (State != pWidget->State) {
  145.     pWidget->State = State;
  146.     WM_Invalidate(hObj);
  147.   }
  148. }
  149. /*********************************************************************
  150. *
  151. *       WIDGET__IsEnabled
  152.   Returns:
  153.     1 if Widget is enabled
  154.     0 else
  155. */
  156. int WIDGET__IsEnabled(WIDGET* pWidget) {
  157.   return pWidget->State & WIDGET_STATE_ENABLED ? 1 : 0;
  158. }
  159. /*********************************************************************
  160. *
  161. *       WIDGET_OrState
  162. */
  163. void WIDGET_OrState(WM_HWIN hObj, int State) {
  164.   WIDGET* pWidget = WIDGET_H2P(hObj);
  165.   if (State != (pWidget->State & State)) {
  166.     pWidget->State |= State;
  167.     WM_Invalidate(hObj);
  168.   }
  169. }
  170. /*********************************************************************
  171. *
  172. *       WIDGET_AndState
  173.   Purpose:
  174.     Clear flags in the State element of the widget.
  175.     The bits to be cleared are set.
  176.   Example:
  177.     ...(..., 3);   // Clears bit 0, 1 int the state member 
  178. */
  179. void WIDGET_AndState(WM_HWIN hObj, int Mask) {
  180.   U16 StateNew;
  181.   WIDGET* pWidget = WIDGET_H2P(hObj);
  182.   StateNew = pWidget->State & (~Mask);
  183.   if (pWidget->State != StateNew) {
  184.     pWidget->State = StateNew;
  185.     WM_Invalidate(hObj);
  186.   }
  187. }
  188. /*********************************************************************
  189. *
  190. *       WIDGET_SetInactive
  191. */
  192. void WIDGET_Disable(WM_HWIN hObj) {
  193.   WIDGET* pWidget;
  194.   if (hObj) {
  195.     WM_LOCK();
  196.     pWidget = WIDGET_H2P(hObj);
  197.     if (pWidget->State & WIDGET_STATE_ENABLED) {
  198.       pWidget->State &= ~WIDGET_STATE_ENABLED;
  199.       WM_Invalidate(hObj);
  200.     }
  201.     WM_UNLOCK();
  202.   }
  203. }
  204. /*********************************************************************
  205. *
  206. *       WIDGET_Enable
  207. */
  208. void WIDGET_Enable(WM_HWIN hObj) {
  209.   WIDGET* pWidget;
  210.   if (hObj) {
  211.     WM_LOCK();
  212.     pWidget = WIDGET_H2P(hObj);
  213.     if ((pWidget->State & WIDGET_STATE_ENABLED) == 0) {
  214.       pWidget->State |= WIDGET_STATE_ENABLED;
  215.       WM_Invalidate(hObj);
  216.     }
  217.     WM_UNLOCK();
  218.   }
  219. }
  220. void WIDGET__Init(WIDGET* pWidget, U16 State) {
  221.   pWidget->pEffect       = _pEffectDefault;
  222.   pWidget->State         = State;
  223. }
  224. /*********************************************************************
  225. *
  226. *       WIDGET_HandleActive
  227. */
  228. int WIDGET_HandleActive(WM_HWIN hObj, WM_MESSAGE* pMsg) {
  229.   WM_MESSAGE Msg;
  230.   WIDGET* pWidget = WIDGET_H2P(hObj);
  231.   switch (pMsg->MsgId) {
  232.     case WM_GET_ID:
  233.       pMsg->Data.v = pWidget->Id;
  234.       return 0;                        /* Message handled -> Return */
  235.     case WM_SET_FOCUS:
  236.       if (pMsg->Data.v == 1) {
  237.         WIDGET_SetState(hObj, pWidget->State |  WIDGET_STATE_FOCUS);
  238.       } else {
  239.         WIDGET_SetState(hObj, pWidget->State & ~WIDGET_STATE_FOCUS);
  240.       }
  241.       Msg.MsgId = WM_NOTIFY_CHILD_HAS_FOCUS;
  242.       Msg.Data.v = pMsg->Data.v;
  243.       WM_SendToParent(hObj, &Msg);
  244.       return 0;
  245.     case WM_GET_HAS_FOCUS:
  246.       pMsg->Data.v = pWidget->State & WIDGET_STATE_FOCUS;
  247.       return 0;                         /* Message handled */
  248.     case WM_SET_ENABLE:
  249.       if (pMsg->Data.v) {
  250.         WIDGET_OrState(hObj, WIDGET_STATE_ENABLED);
  251.       } else {
  252.         WIDGET_AndState(hObj, WIDGET_STATE_ENABLED);
  253.       }
  254.     case WM_GET_ACCEPT_FOCUS:
  255.       pMsg->Data.v = (pWidget->State & WIDGET_STATE_FOCUSSABLE) ? 1 : 0;               /* Can handle focus */
  256.       return 0;                         /* Message handled */
  257.      case WM_GET_INSIDE_RECT:
  258.       WIDGET__GetInsideRect(pWidget, (GUI_RECT*)pMsg->Data.p);
  259.       return 0;                         /* Message handled */
  260.   }
  261.   return 1;                           /* Message NOT handled */
  262. }
  263. void WIDGET__SetScrollState(WM_HWIN hWin, const WM_SCROLL_STATE* pVState, const WM_SCROLL_STATE* pHState) {
  264.   WM_HWIN hScroll;
  265.   /* vertical scrollbar */
  266.   hScroll = WM_GetDialogItem(hWin, GUI_ID_VSCROLL);
  267.     WM_SetScrollState(hScroll, pVState);
  268.   /* horizontal scrollbar */
  269.   hScroll = WM_GetDialogItem(hWin, GUI_ID_HSCROLL);
  270.     WM_SetScrollState(hScroll, pHState);
  271. }
  272. void WIDGET__DrawFocusRect(WIDGET* pWidget, const GUI_RECT* pRect, int Dist) {
  273.   GUI_RECT Rect;
  274.   if (pWidget->State & WIDGET_STATE_VERTICAL) {
  275.     _RotateRect90(pWidget, &Rect, pRect);
  276.     pRect = &Rect;
  277.   }
  278.   GUI_DrawFocusRect(pRect, Dist);
  279. }
  280. void WIDGET__DrawVLine(WIDGET* pWidget, int x, int y0, int y1) {
  281.   if (pWidget->State & WIDGET_STATE_VERTICAL) {
  282.     GUI_RECT r0, r1;
  283.     r0.x0 = x;
  284.     r0.x1 = x;
  285.     r0.y0 = y0;
  286.     r0.y1 = y1;
  287.     _RotateRect90(pWidget, &r1, &r0);
  288.     GUI_DrawHLine(r1.y0, r1.x0, r1.x1);
  289.   } else {
  290.     GUI_DrawVLine(x, y0, y1);
  291.   }
  292. }
  293. /*********************************************************************
  294. *
  295. *       WIDGET_FillRectEx
  296. */
  297. void WIDGET__FillRectEx(WIDGET* pWidget, const GUI_RECT* pRect) {
  298.   if (pWidget->State & WIDGET_STATE_VERTICAL) {
  299.     GUI_RECT r;
  300.     _RotateRect90(pWidget, &r, pRect);
  301.     pRect = &r;
  302.   }
  303.   GUI_FillRectEx(pRect);
  304. }
  305. /*********************************************************************
  306. *
  307. *       WIDGET__EFFECT_ ...
  308. */
  309. void WIDGET__EFFECT_DrawDownRect(WIDGET* pWidget, GUI_RECT* pRect) {
  310.   GUI_RECT Rect;
  311.   if (pRect == NULL) {
  312.     WM_GetClientRect(&Rect);
  313.     pRect = &Rect;
  314.   }
  315.   if (pWidget->State & WIDGET_STATE_VERTICAL) {
  316.     _RotateRect90(pWidget, &Rect, pRect);
  317.     pRect = &Rect;
  318.   }
  319.   pWidget->pEffect->pfDrawDownRect(pRect);
  320. }
  321. void WIDGET__EFFECT_DrawDown(WIDGET* pWidget) {
  322.   WIDGET__EFFECT_DrawDownRect(pWidget, NULL);
  323. }
  324. void WIDGET__EFFECT_DrawUpRect(WIDGET* pWidget, GUI_RECT* pRect) {
  325.   GUI_RECT Rect;
  326.   if (pWidget->State & WIDGET_STATE_VERTICAL) {
  327.     _RotateRect90(pWidget, &Rect, pRect);
  328.     pRect = &Rect;
  329.   }
  330.   pWidget->pEffect->pfDrawUpRect(pRect);
  331. }
  332. void WIDGET_SetDefaultEffect(const WIDGET_EFFECT* pEffect) {
  333.   _pEffectDefault = pEffect;
  334. }
  335. #else                            /* Avoid problems with empty object modules */
  336.   void WIDGET_C(void) {}
  337. #endif /* GUI_WINSUPPORT */