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

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        : ProgBar.c
  16. Purpose     : Progress bar for emWin GSC
  17. ---------------------------END-OF-HEADER------------------------------
  18. */
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include "GUI_Private.h"
  22. #include "ProgBar.h"
  23. #include "Widget.h"
  24. #if GUI_WINSUPPORT
  25. /*********************************************************************
  26. *
  27. *       Private config defaults
  28. *
  29. **********************************************************************
  30. */
  31. #ifndef PROGBAR_DEFAULT_FONT
  32.   #define PROGBAR_DEFAULT_FONT GUI_DEFAULT_FONT
  33. #endif
  34. #ifndef PROGBAR_DEFAULT_BARCOLOR0
  35.   #define PROGBAR_DEFAULT_BARCOLOR0 0x555555
  36. #endif
  37. #ifndef PROGBAR_DEFAULT_BARCOLOR1
  38.   #define PROGBAR_DEFAULT_BARCOLOR1 0xAAAAAA
  39. #endif
  40. #ifndef PROGBAR_DEFAULT_TEXTCOLOR0
  41.   #define PROGBAR_DEFAULT_TEXTCOLOR0 0xFFFFFF
  42. #endif
  43. #ifndef PROGBAR_DEFAULT_TEXTCOLOR1
  44.   #define PROGBAR_DEFAULT_TEXTCOLOR1 0x000000
  45. #endif
  46. /*********************************************************************
  47. *
  48. *       Object definition
  49. *
  50. **********************************************************************
  51. */
  52. typedef struct {
  53.   WIDGET Widget;
  54.   int v;
  55.   const GUI_FONT* pFont;
  56.   GUI_COLOR BarColor[2];
  57.   GUI_COLOR TextColor[2];
  58.   WM_HMEM hpText;
  59.   I16 XOff, YOff;
  60.   I16 TextAlign;
  61.   int Min, Max;
  62. /*  I16 Options; */
  63.   #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL
  64.     int DebugId;
  65.   #endif  
  66. } PROGBAR_Obj;
  67. /*********************************************************************
  68. *
  69. *       Static data
  70. *
  71. **********************************************************************
  72. */
  73. /* None */
  74. /*********************************************************************
  75. *
  76. *       Macros for internal use
  77. *
  78. **********************************************************************
  79. */
  80. #define Invalidate(h) WM_InvalidateWindow(h)
  81. #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL
  82.   #define OBJECT_ID 0x4569   /* Magic nubmer, should be unique if possible */
  83.   #define INIT_ID(p)   p->DebugId = OBJECT_ID
  84.   #define DEINIT_ID(p) p->DebugId = OBJECT_ID+1
  85. #else
  86.   #define INIT_ID(p)
  87.   #define DEINIT_ID(p)
  88. #endif
  89. /*********************************************************************
  90. *
  91. *       Static routines
  92. *
  93. **********************************************************************
  94. */
  95. #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL
  96.   PROGBAR_Obj* PROGBAR_h2p(PROGBAR_Handle h) {
  97.     PROGBAR_Obj* p = (PROGBAR_Obj*)WM_HMEM2Ptr(h);
  98.     if (p) {
  99.       if (p->DebugId != OBJECT_ID) {
  100.         GUI_DEBUG_ERROROUT("PROGBAR.C: Wrong handle type or Object not init'ed");
  101.         return 0;
  102.       }
  103.     }
  104.     return p;
  105.   }
  106.   #define PROGBAR_H2P(h) PROGBAR_h2p(h)
  107. #else
  108.   #define PROGBAR_H2P(h) (PROGBAR_Obj*) WM_HMEM2Ptr(h)
  109. #endif
  110. /*********************************************************************
  111. *
  112. *       _FreeText
  113. */
  114. static void _FreeText(PROGBAR_Handle hObj) {
  115.   PROGBAR_Obj* pObj = PROGBAR_H2P(hObj);
  116.   WM_FREEPTR(&pObj->hpText);
  117. }
  118. /*********************************************************************
  119. *
  120. *       _Value2X
  121. */
  122. static int _Value2X(PROGBAR_Handle hObj, int v) {
  123.   PROGBAR_Obj* pObj = PROGBAR_H2P(hObj);
  124.   int xsize  = WM_GetWindowSizeX(hObj);
  125.   int Min = pObj->Min;
  126.   int Max = pObj->Max;
  127.   if (v<Min)
  128.   v = Min;
  129.   if (v> Max)
  130.   v = Max;
  131.   return (xsize* (I32)(v-Min)) / (Max-Min);
  132. }
  133. /*********************************************************************
  134. *
  135. *       _DrawPart
  136. */
  137. static void _DrawPart(PROGBAR_Obj* pThis,
  138.                      int Index,
  139.  int xText, int yText,
  140.  const char* pText)
  141. {
  142.     GUI_SetBkColor(pThis->BarColor[Index]);
  143.     GUI_SetColor(pThis->TextColor[Index]);
  144.     GUI_Clear();
  145.     GUI_GotoXY(xText,yText);
  146. GUI_DispString(pText);
  147. }
  148. /*********************************************************************
  149. *
  150. *       _Paint
  151. */
  152. static void _Paint(PROGBAR_Handle hObj) {
  153.   PROGBAR_Obj* pObj = PROGBAR_H2P(hObj);
  154.   WM_HWIN hWin = hObj;
  155.   int xsize = WM_GetWindowSizeX(hWin);
  156.   int ysize = WM_GetWindowSizeY(hWin);
  157.   int tm;
  158.   GUI_SetFont(pObj->pFont);
  159.   {
  160.     int x1;
  161.     int FontSizeY = GUI_GetFontSizeY();
  162.     int xText;
  163.     int yText = (ysize-FontSizeY)/2;
  164.     GUI_RECT r;
  165.     int XSizeChar;
  166.     char ac[5];   /* Just enough for the percentage */
  167.     char*s = ac;
  168.     const char* pText;
  169.     if (pObj->hpText != WM_HMEM_NULL) {
  170.       pText = (const char*) WM_HMEM2Ptr(pObj->hpText);
  171.     } else {
  172.       GUI_AddDecMin((100*(I32)(pObj->v-pObj->Min))/(pObj->Max-pObj->Min), &s);
  173.       *s = '%';
  174. *(s+1) =0;
  175. pText = &ac[0];
  176. }
  177. /* Calculate text positions */
  178.     XSizeChar = GUI_GetStringDistX(pText);
  179.     x1 = _Value2X(hObj, pObj->v);
  180.     switch (pObj->TextAlign &GUI_TA_HORIZONTAL) {
  181.     case GUI_TA_CENTER:
  182.       xText  = (xsize-XSizeChar)/2;
  183. break;
  184.     case GUI_TA_LEFT:
  185.       xText  = 0;
  186. break;
  187.     case GUI_TA_RIGHT:
  188.       xText  = xsize-XSizeChar-1;
  189. break;
  190. }
  191.     xText += pObj->XOff;
  192.     yText += pObj->YOff;
  193.     tm = GUI_SetTextMode(GUI_TM_TRANS);
  194. /* Draw left bar */
  195.     r.x0=0; r.x1=x1-1; r.y0=0; r.y1 = GUI_YMAX;
  196.     WM_SetUserClipArea(&r);
  197.     _DrawPart(pObj, 0, xText, yText, pText);
  198. /* Draw right bar */
  199.     r.x0=r.x1+1; r.x1=GUI_XMAX;
  200.     WM_SetUserClipArea(&r);
  201.     _DrawPart(pObj, 1, xText, yText, pText);
  202.   }
  203.   WM_SetUserClipArea(NULL);
  204.   GUI_SetTextMode(tm);
  205. }
  206. /*********************************************************************
  207. *
  208. *       _Delete
  209. */
  210. void _Delete(PROGBAR_Handle hObj) {
  211.   _FreeText(hObj);
  212.   DEINIT_ID(PROGBAR_H2P(hObj));
  213. }
  214. /*********************************************************************
  215. *
  216. *       _Callback
  217. */
  218. static void _Callback (WM_MESSAGE*pMsg) {
  219.   PROGBAR_Handle hObj = (PROGBAR_Handle)pMsg->hWin;
  220.   switch (pMsg->MsgId) {
  221.   case WM_PAINT:
  222.     _Paint(hObj);
  223.     return;
  224.   case WM_DELETE:
  225.     _Delete(hObj);
  226.     break;
  227.   }
  228.   WM_DefaultProc(pMsg);
  229. }
  230. /*********************************************************************
  231. *
  232. *       Exported routines:  Create
  233. *
  234. **********************************************************************
  235. */
  236. PROGBAR_Handle PROGBAR_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags) {
  237.   /* Create the window */
  238.   PROGBAR_Handle hObj =WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, 
  239.                                               Flags, _Callback, sizeof(PROGBAR_Obj) - sizeof(WM_Obj));
  240.   if (hObj) {
  241.     PROGBAR_Obj* pObj = (PROGBAR_Obj*) WM_HMEM2Ptr(hObj);
  242.     INIT_ID(pObj);
  243.     pObj->Widget.Id       = Id;
  244.     /* init member variables */
  245.     pObj->pFont =GUI_DEFAULT_FONT;
  246.     pObj->BarColor[0] = 0x555555;
  247.     pObj->BarColor[1] = 0xaaaaaa;
  248.     pObj->TextColor[0] = 0xffffff;
  249.     pObj->TextColor[1] = 0x000000;
  250.     pObj->TextAlign    = GUI_TA_CENTER;
  251.     pObj->Max =100;
  252.     pObj->Min =0;
  253.   }
  254.   return hObj;
  255. }
  256. PROGBAR_Handle PROGBAR_Create(int x0, int y0, int xsize, int ysize, int Flags) {
  257.   return PROGBAR_CreateEx(x0, y0, xsize, ysize, 0, 0, Flags) ;
  258. }
  259. PROGBAR_Handle  PROGBAR_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) {
  260.   PROGBAR_Handle  hThis;
  261.   GUI_USE_PARA(cb);
  262.   hThis = PROGBAR_CreateEx(
  263.     pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize,
  264.     hWinParent, pCreateInfo->Id, pCreateInfo->Flags);
  265.   return hThis;
  266. }
  267. /*********************************************************************
  268. *
  269. *       Exported routines:  Various methods
  270. *
  271. **********************************************************************
  272. */
  273. void PROGBAR_SetValue(PROGBAR_Handle hObj, int v) {
  274.   PROGBAR_Obj* pObj;
  275.   GUI_RECT r;
  276.   if (hObj) {
  277.     WM_LOCK();
  278.     pObj= PROGBAR_H2P(hObj);
  279.     /* Put v into legal range */
  280.     if (v < pObj->Min)
  281.     v = pObj->Min;
  282.     if (v > pObj->Max)
  283.     v = pObj->Max;
  284.     if (pObj->v != v) {
  285.       /* Invalidate */
  286.       if (pObj->hpText) {
  287.         /* Calculate invalid area */
  288.         r.x0 = _Value2X(hObj, pObj->v);
  289.         r.x1 = _Value2X(hObj, v);
  290.         /* Make sure x0 <= x1 */
  291.     if (r.x0 > r.x1) {
  292.     int t = r.x0;
  293.     r.x0 = r.x1;
  294.     r.x1 = t;
  295.     }
  296.     r.y0 =0;
  297.     r.y1 =4095;
  298.         WM_InvalidateRect(hObj,&r);
  299.     } else {
  300.         Invalidate(hObj);
  301.     }
  302.       pObj->v = v;                         /* Update stored value */
  303.     }
  304.     WM_UNLOCK();
  305.   }
  306. }
  307. void PROGBAR_SetFont(PROGBAR_Handle hObj, const GUI_FONT* pfont) {
  308.   PROGBAR_Obj* pObj;
  309.   if (hObj) {
  310.     WM_LOCK();
  311.     pObj = PROGBAR_H2P(hObj);
  312.     pObj->pFont = pfont;
  313.     Invalidate(hObj);
  314.     WM_UNLOCK();
  315.   }
  316. }
  317. void PROGBAR_SetBarColor(PROGBAR_Handle hObj, int index, GUI_COLOR color) {
  318.   PROGBAR_Obj* pObj;
  319.   if (hObj) {
  320.     WM_LOCK();
  321.     pObj = PROGBAR_H2P(hObj);
  322.     pObj->BarColor[index] = color;
  323.     Invalidate(hObj);
  324.     WM_UNLOCK();
  325.   }
  326. }
  327. void PROGBAR_SetTextColor(PROGBAR_Handle hObj, int index, GUI_COLOR color) {
  328.   PROGBAR_Obj* pObj;
  329.   if (hObj) {
  330.     WM_LOCK();
  331.     pObj = PROGBAR_H2P(hObj);
  332.     pObj->TextColor[index] = color;
  333.     Invalidate(hObj);
  334.     WM_UNLOCK();
  335.   }
  336. }
  337. void PROGBAR_SetText(PROGBAR_Handle hObj, const char* s) {
  338.   PROGBAR_Obj* pObj;
  339.   WM_HMEM hMem;
  340.   if (hObj) {
  341.     WM_LOCK();
  342.     pObj = PROGBAR_H2P(hObj);
  343.     _FreeText(hObj);
  344.     hMem = WM_ALLOC(strlen(s)+1);
  345.     strcpy((char *) WM_HMEM2Ptr(hMem), s);
  346.     pObj->hpText = hMem;
  347.     Invalidate(hObj);
  348.     WM_UNLOCK();
  349.   }
  350. }
  351. void PROGBAR_SetTextAlign(PROGBAR_Handle hObj, int Align) {
  352.   PROGBAR_Obj* pObj;
  353.   if (hObj) {
  354.     WM_LOCK();
  355.     pObj = PROGBAR_H2P(hObj);
  356.     pObj->TextAlign = Align;
  357.     Invalidate(hObj);
  358.     WM_UNLOCK();
  359.   }
  360. }
  361. void PROGBAR_SetTextPos(PROGBAR_Handle hObj, int XOff, int YOff) {
  362.   PROGBAR_Obj* pObj;
  363.   if (hObj) {
  364.     WM_LOCK();
  365.     pObj = PROGBAR_H2P(hObj);
  366.     pObj->XOff = XOff;
  367.     pObj->YOff = YOff;
  368.     Invalidate(hObj);
  369.     WM_UNLOCK();
  370.   }
  371. }
  372. void PROGBAR_SetMinMax(PROGBAR_Handle hObj, int Min, int Max) {
  373.   PROGBAR_Obj* pObj;
  374.   if (hObj) {
  375.     WM_LOCK();
  376.     pObj = PROGBAR_H2P(hObj);
  377.     if (Max > Min) {
  378.       if ((Max != pObj->Max) || (Min != pObj->Min)) {
  379.         pObj->Min = Min;
  380.         pObj->Max = Max;
  381.         Invalidate(hObj);
  382.       }
  383.     }
  384.     WM_UNLOCK();
  385.   }
  386. }
  387. #else
  388. void WIDGET_Progbar(void) {} /* avoid empty object files */
  389. #endif /* GUI_WINSUPPORT */