Slider.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        : SLIDER.c
  16. Purpose     : SLIDER for new emWin GSC widgets
  17. ---------------------------END-OF-HEADER------------------------------
  18. */
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include "GUI_Private.H"
  22. #include "SLIDER.h"
  23. #include "Widget.h"
  24. #if GUI_WINSUPPORT
  25. /*********************************************************************
  26. *
  27. *       Private config defaults
  28. *
  29. **********************************************************************
  30. */
  31. /* Support for 3D effects */
  32. #ifndef SLIDER_USE_3D
  33.   #define SLIDER_USE_3D 1
  34. #endif
  35. /* Define colors */
  36. #ifndef SLIDER_BKCOLOR0_DEFAULT
  37.   #define SLIDER_BKCOLOR0_DEFAULT 0xc0c0c0
  38. #endif
  39. #ifndef SLIDER_BKCOLOR1_DEFAULT
  40.   #define SLIDER_BKCOLOR1_DEFAULT GUI_WHITE
  41. #endif
  42. #ifndef SLIDER_COLOR0_DEFAULT
  43.   #define SLIDER_COLOR0_DEFAULT 0xc0c0c0
  44. #endif
  45. #ifndef SLIDER_COLOR1_DEFAULT
  46.   #define SLIDER_COLOR1_DEFAULT GUI_BLACK
  47. #endif
  48. /*********************************************************************
  49. *
  50. *       Object definition
  51. *
  52. **********************************************************************
  53. */
  54. typedef struct {
  55.   WIDGET Widget;
  56.   GUI_COLOR aBkColor[2];
  57.   GUI_COLOR aColor[2];
  58.   int Min, Max, v;
  59.   int Flags;
  60.   int NumSections;
  61.   I16 Width;
  62.   #if GUI_DEBUG_LEVEL >1
  63.     int DebugId;
  64.   #endif  
  65. } SLIDER_Obj;
  66. /*********************************************************************
  67. *
  68. *       Static data
  69. *
  70. **********************************************************************
  71. */
  72. /* None */
  73. /*********************************************************************
  74. *
  75. *       Macros for internal use
  76. *
  77. **********************************************************************
  78. */
  79. #define SLIDER_ID 0x4544   /* Magic numer, should be unique if possible */
  80. #define SLIDER_H2P(h) (SLIDER_Obj*) WM_H2P(h)
  81. #ifdef _DEBUG
  82.   #define SLIDER_ASSERT_IS_VALID_PTR(p) DEBUG_ERROROUT_IF(p->DebugId != SLIDER_ID, "xxx.c: Wrong handle type or Object not init'ed")
  83.   #define SLIDER_INIT_ID(p)   p->DebugId = SLIDER_ID
  84.   #define SLIDER_DEINIT_ID(p) p->DebugId = SLIDER_ID+1
  85. #else
  86.   #define SLIDER_ASSERT_IS_VALID_PTR(p)
  87.   #define SLIDER_INIT_ID(p)
  88.   #define SLIDER_DEINIT_ID(p)
  89. #endif
  90. /*********************************************************************
  91. *
  92. *       Static routines
  93. *
  94. **********************************************************************
  95. */
  96. /*********************************************************************
  97. *
  98. *       _Paint
  99. */
  100. static void _Paint(SLIDER_Obj* pObj/*, GUI_RECT*pRect*/) {
  101.   int i;
  102.   int xsize;
  103.   int x0;
  104.   GUI_RECT r, rFocus, rSlider, rSlot;
  105.   WIDGET__GetClientRect(&pObj->Widget, &rFocus);
  106.   GUI__ReduceRect(&r, &rFocus, 1);
  107.   xsize = r.x1 - r.x0  + 1 - pObj->Width /*- 2*xSizeEffect*/;
  108.   x0 = r.x0 + pObj->Width / 2;
  109.   GUI_SetBkColor(pObj->aBkColor[0]);
  110.   GUI_Clear();
  111.   /* Calculate Slider position */
  112.   rSlider = r;
  113.   rSlider.y0 = 5;
  114.   rSlider.x0 = x0 + xsize * (pObj->v - pObj->Min) / (pObj->Max - pObj->Min) - pObj->Width/2;
  115.   rSlider.x1  = rSlider.x0 + pObj->Width;
  116.   /* Calculate Slot position */
  117.   rSlot.x0 = x0;
  118.   rSlot.x1 = x0 + xsize;
  119.   rSlot.y0 = (rSlider.y0 + rSlider.y1) /2 -1;
  120.   rSlot.y1 = rSlot.y0 +3;
  121.   WIDGET__EFFECT_DrawDownRect(&pObj->Widget, &rSlot);        /* Draw slot */
  122.   /* Draw the ticks */
  123.   GUI_SetColor(GUI_BLACK);
  124.   for (i = 0; i <= pObj->NumSections; i++) {
  125.     int x = x0 + xsize * i / pObj->NumSections;
  126.     WIDGET__DrawVLine(&pObj->Widget, x, 1, 3);
  127.   }
  128.   /* Draw the slider itself */
  129.   GUI_SetColor(pObj->aColor[0]);
  130.   WIDGET__FillRectEx(&pObj->Widget, &rSlider);
  131.   GUI_SetColor(GUI_BLACK);
  132.   WIDGET__EFFECT_DrawUpRect(&pObj->Widget, &rSlider);
  133.   /* Draw focus */
  134.   if (pObj->Widget.State & WIDGET_STATE_FOCUS) {
  135.     GUI_SetColor(GUI_BLACK);
  136.     WIDGET__DrawFocusRect(&pObj->Widget, &rFocus, 0);
  137.   }
  138. }
  139. /*********************************************************************
  140. *
  141. *       _OnTouch
  142. */
  143. static void _OnTouch(SLIDER_Handle hObj, SLIDER_Obj* pObj, WM_MESSAGE*pMsg) {
  144.   GUI_TOUCH_tState* pState = (GUI_TOUCH_tState*)pMsg->Data.p;
  145.   if (pMsg->Data.p) {  /* Something happened in our area (pressed or released) */
  146.     if (pState->Pressed) {
  147.       int Sel;
  148.       int Range = (pObj->Max - pObj->Min);
  149.       int x0, xsize;
  150.       int x;
  151.       x0 = 1 + pObj->Width/2;  /* 1 pixel focus rectangle + width of actual slider */
  152.       x = (pObj->Widget.State & WIDGET_STATE_VERTICAL) ? pState->y : pState->x;
  153.       x -= x0;
  154.       xsize = WIDGET__GetWindowSizeX(hObj) - 2 * x0;
  155.       if (x <= 0) {
  156.         Sel = pObj->Min;
  157.       } else if (x >= xsize) {
  158.         Sel = pObj->Max;
  159.       } else {
  160.         Sel = GUI__DivideRound(Range* x, xsize);
  161.         Sel += pObj->Min;
  162.       }
  163.       WM_SetFocus(hObj);
  164.       WM_SetCapture(hObj, 1);
  165.       SLIDER_SetValue(hObj, Sel);
  166.     } 
  167.   }
  168. }
  169. /*********************************************************************
  170. *
  171. *       _OnKey
  172. */
  173. static void  _OnKey(SLIDER_Handle hObj, WM_MESSAGE*pMsg) {
  174.   WM_KEY_INFO* pKeyInfo;
  175.   int Key;
  176.   pKeyInfo = (WM_KEY_INFO*)(pMsg->Data.p);
  177.   Key = pKeyInfo->Key;
  178.   if (pKeyInfo->PressedCnt > 0) {
  179.     switch (Key) {
  180.       case GUI_KEY_RIGHT:
  181.         SLIDER_Inc(hObj);
  182.         break;                    /* Send to parent by not doing anything */
  183.       case GUI_KEY_LEFT:
  184.         SLIDER_Dec(hObj);
  185.         break;                    /* Send to parent by not doing anything */
  186.       default:
  187.         return;
  188.     }
  189.   }
  190. }
  191. /*********************************************************************
  192. *
  193. *       _SLIDER_Callback
  194. */
  195. static void _SLIDER_Callback (WM_MESSAGE *pMsg) {
  196.   SLIDER_Handle hObj;
  197.   SLIDER_Obj* pObj;
  198.   hObj = pMsg->hWin;
  199.   pObj = SLIDER_H2P(hObj);
  200.   /* Let widget handle the standard messages */
  201.   if (WIDGET_HandleActive(hObj, pMsg) == 0) {
  202.     return;
  203.   }
  204.   switch (pMsg->MsgId) {
  205.   case WM_PAINT:
  206.     GUI_DEBUG_LOG("SLIDER: _Callback(WM_PAINT)n");
  207.     _Paint(pObj);
  208.     return;
  209.   case WM_TOUCH:
  210.     _OnTouch(hObj, pObj, pMsg);
  211.     break;
  212.   case WM_KEY:
  213.     _OnKey(hObj, pMsg);
  214.     break;
  215.   }
  216.   WM_DefaultProc(pMsg);
  217. }
  218. /*********************************************************************
  219. *
  220. *       Exported routines:  Create
  221. *
  222. **********************************************************************
  223. */
  224. /* Note: the parameters to a create function may vary.
  225.          Some widgets may have multiple create functions */
  226. SLIDER_Handle SLIDER_Create (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int WinFlags, int SpecialFlags) {
  227.   SLIDER_Handle hObj;
  228.   /* Create the window */
  229.   WM_LOCK();
  230.   hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent,
  231.                        WinFlags, _SLIDER_Callback, sizeof(SLIDER_Obj)-sizeof(WM_Obj));
  232.   if (hObj) {
  233.     SLIDER_Obj* pObj = SLIDER_H2P(hObj);
  234.     U16 InitState;
  235.     /* Handle SpecialFlags */
  236.     InitState = WIDGET_STATE_ENABLED;
  237.     if (SpecialFlags & SLIDER_CF_VERTICAL) {
  238.       InitState |= WIDGET_CF_VERTICAL;
  239.     }
  240.     /* init widget specific variables */
  241.     WIDGET__Init(&pObj->Widget, InitState);
  242.     /* init member variables */
  243.     SLIDER_INIT_ID(pObj);
  244.     pObj->Widget.Id       = Id;
  245.     pObj->aBkColor[0]   = SLIDER_BKCOLOR0_DEFAULT;
  246.     pObj->aBkColor[1]   = SLIDER_BKCOLOR1_DEFAULT;
  247.     pObj->aColor[0]     = SLIDER_COLOR0_DEFAULT;
  248.     pObj->aColor[1]     = SLIDER_COLOR1_DEFAULT;
  249.     pObj->Width = 8;
  250.     pObj->Max =100;
  251.     pObj->Min =0;
  252.     pObj->NumSections = 10;
  253.   } else {
  254.     GUI_DEBUG_ERROROUT_IF(hObj==0, "SLIDER_Create failed")
  255.   }
  256.   WM_UNLOCK();
  257.   return hObj;
  258. }
  259. SLIDER_Handle SLIDER_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) {
  260.   SLIDER_Handle  hThis;
  261.   GUI_USE_PARA(cb);
  262.   hThis = SLIDER_Create(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize,
  263.                         hWinParent, pCreateInfo->Id, 0, pCreateInfo->Flags);
  264.   return hThis;
  265. }
  266. /*********************************************************************
  267. *
  268. *       Exported routines:  Various methods
  269. *
  270. **********************************************************************
  271. */
  272. void SLIDER_Dec(SLIDER_Handle hObj) {
  273.   SLIDER_Obj* pObj;
  274.   if (hObj) {
  275.     WM_LOCK();
  276.     pObj = SLIDER_H2P(hObj);
  277.     if (pObj->v > pObj->Min) {
  278.       pObj->v--;
  279.       WM_InvalidateWindow(hObj);
  280.       WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
  281.     }
  282.     WM_UNLOCK();
  283.   }
  284. }
  285. void SLIDER_Inc(SLIDER_Handle hObj) {
  286.   SLIDER_Obj* pObj;
  287.   if (hObj) {
  288.     WM_LOCK();
  289.     pObj = SLIDER_H2P(hObj);
  290.     if (pObj->v < pObj->Max) {
  291.       pObj->v++;
  292.       WM_InvalidateWindow(hObj);
  293.       WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
  294.     }
  295.     WM_UNLOCK();
  296.   }
  297. }
  298. void SLIDER_SetWidth(SLIDER_Handle hObj, int Width) {
  299.   SLIDER_Obj* pObj;
  300.   if (hObj) {
  301.     WM_LOCK();
  302.     pObj = SLIDER_H2P(hObj);
  303.     if (pObj->Width != Width) {
  304.       pObj->Width = Width;
  305.       WM_InvalidateWindow(hObj);
  306.     }
  307.     WM_UNLOCK();
  308.   }
  309. }
  310. void SLIDER_SetValue(SLIDER_Handle hObj, int v) {
  311.   SLIDER_Obj* pObj;
  312.   if (hObj) {
  313.     WM_LOCK();
  314.     pObj = SLIDER_H2P(hObj);
  315.     /* Put in min/max range */
  316.     if (v < pObj->Min) {
  317.       v = pObj->Min;
  318.     }
  319.     if (v > pObj->Max) {
  320.       v = pObj->Max;
  321.     }
  322.     if (pObj->v != v) {
  323.       pObj->v = v;
  324.       WM_InvalidateWindow(hObj);
  325.       WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
  326.     }
  327.     WM_UNLOCK();
  328.   }
  329. }
  330. void SLIDER_SetRange(SLIDER_Handle hObj, int Min, int Max) {
  331.   SLIDER_Obj* pObj;
  332.   if (hObj) {
  333.     WM_LOCK();
  334.     pObj = SLIDER_H2P(hObj);
  335.     pObj->Min = Min;
  336.     pObj->Max = Max;
  337.     WM_InvalidateWindow(hObj);
  338.     WM_UNLOCK();
  339.   }
  340. }
  341. /*********************************************************************
  342. *
  343. *       Query state
  344. *
  345. **********************************************************************
  346. */
  347. int SLIDER_GetValue(SLIDER_Handle hObj) {
  348.   int r = 0;
  349.   SLIDER_Obj* pObj;
  350.   if (hObj) {
  351.     WM_LOCK();
  352.     pObj = SLIDER_H2P(hObj);
  353.     r = pObj->v;
  354.     WM_UNLOCK();
  355.   }
  356.   return r;
  357. }
  358. #endif  /* #if GUI_WINSUPPORT */