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

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        : CHECKBOX.c
  16. Purpose     : Template 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 "CHECKBOX.h"
  23. #include "Widget.h"
  24. #if GUI_WINSUPPORT
  25. /*********************************************************************
  26. *
  27. *       Private config defaults
  28. *
  29. **********************************************************************
  30. */
  31. /* Define default fonts */
  32. #ifndef CHECKBOX_FONT_DEFAULT
  33.   #define CHECKBOX_FONT_DEFAULT &GUI_Font13_1
  34. #endif
  35. /* Support for 3D effects */
  36. #ifndef CHECKBOX_USE_3D
  37.   #define CHECKBOX_USE_3D 1
  38. #endif
  39. /* Define colors */
  40. #ifndef CHECKBOX_BKCOLOR0_DEFAULT
  41.   #define CHECKBOX_BKCOLOR0_DEFAULT 0x808080           /* Inactive color */
  42. #endif
  43. #ifndef CHECKBOX_BKCOLOR1_DEFAULT
  44.   #define CHECKBOX_BKCOLOR1_DEFAULT GUI_WHITE          /* Active color */
  45. #endif
  46. #ifndef CHECKBOX_FGCOLOR0_DEFAULT
  47.   #define CHECKBOX_FGCOLOR0_DEFAULT 0x101010
  48. #endif
  49. #ifndef CHECKBOX_FGCOLOR1_DEFAULT
  50.   #define CHECKBOX_FGCOLOR1_DEFAULT GUI_BLACK
  51. #endif
  52. /*********************************************************************
  53. *
  54. *       Object definition
  55. *
  56. **********************************************************************
  57. */
  58. typedef struct {
  59.   WIDGET Widget;
  60.   GUI_COLOR aBkColor[2];
  61.   GUI_COLOR aFgColor[2];
  62.   #if GUI_DEBUG_LEVEL >1
  63.     int DebugId;
  64.   #endif  
  65. } CHECKBOX_Obj;
  66. /*********************************************************************
  67. *
  68. *       Static data
  69. *
  70. **********************************************************************
  71. */
  72. static GUI_COLOR _aColor[2];
  73. /*********************************************************************
  74. *
  75. *       Static const data
  76. *
  77. **********************************************************************
  78. */
  79. static const GUI_LOGPALETTE _PalCheck = {
  80.   2, /* number of entries */
  81.   0,  /* No transparency */
  82.   &_aColor[0]
  83. };
  84. static const unsigned char _acCheck[] = {
  85.   XXXXXXXX, XXX_____,
  86.   XXXXXXXX, XXX_____,
  87.   XXXXXXXX, _XX_____,
  88.   XXXXXXX_, _XX_____,
  89.   XX_XXX__, _XX_____,
  90.   XX__X___, XXX_____,
  91.   XX_____X, XXX_____,
  92.   XXX___XX, XXX_____,
  93.   XXXX_XXX, XXX_____,
  94.   XXXXXXXX, XXX_____,
  95.   XXXXXXXX, XXX_____
  96. };
  97. static const GUI_BITMAP _bmCheck = {
  98.  11, /* XSize */
  99.  11, /* YSize */
  100.  2, /* BytesPerLine */
  101.  1, /* BitsPerPixel */
  102.  _acCheck,  /* Pointer to picture data (indices) */
  103.  &_PalCheck  /* Pointer to palette */
  104. };
  105. /*********************************************************************
  106. *
  107. *       Macros for internal use
  108. *
  109. **********************************************************************
  110. */
  111. #define CHECKBOX_ID 0x4544   /* Magic numer, should be unique if possible */
  112. #define CHECKBOX_H2P(h) (CHECKBOX_Obj*) WM_H2P(h)
  113. #ifdef _DEBUG
  114.   #define CHECKBOX_ASSERT_IS_VALID_PTR(p) DEBUG_ERROROUT_IF(p->DebugId != CHECKBOX_ID, "xxx.c: Wrong handle type or Object not init'ed")
  115.   #define CHECKBOX_INIT_ID(p)   p->DebugId = CHECKBOX_ID
  116.   #define CHECKBOX_DEINIT_ID(p) p->DebugId = CHECKBOX_ID+1
  117. #else
  118.   #define CHECKBOX_ASSERT_IS_VALID_PTR(p)
  119.   #define CHECKBOX_INIT_ID(p)
  120.   #define CHECKBOX_DEINIT_ID(p)
  121. #endif
  122. /*********************************************************************
  123. *
  124. *       Static routines
  125. *
  126. **********************************************************************
  127. */
  128. /*********************************************************************
  129. *
  130. *       _Paint
  131. */
  132. static void _Paint(CHECKBOX_Obj* pObj) {
  133.   int ColorIndex;
  134.   ColorIndex = WIDGET__IsEnabled(&pObj->Widget);
  135.   /* Clear inside  ... Just in case */
  136.   GUI_SetBkColor (pObj->aBkColor[ColorIndex]);
  137.   GUI_Clear();
  138.   if (pObj->Widget.State & CHECKBOX_STATE_CHECKED) {
  139.     _aColor[1] = pObj->aBkColor[ColorIndex];
  140.     _aColor[0] = pObj->aFgColor[ColorIndex];
  141.     GUI_DrawBitmap(&_bmCheck, 2, 2);
  142.   }
  143.   /* Draw the 3D effect (if configured) */
  144.   WIDGET__EFFECT_DrawDown(&pObj->Widget);
  145. }
  146. /*********************************************************************
  147. *
  148. *       _OnTouch
  149. */
  150. static void _OnTouch(CHECKBOX_Handle hObj, CHECKBOX_Obj* pObj, WM_MESSAGE*pMsg) {
  151.   int Notification;
  152.   int Hit = 0;
  153.   GUI_TOUCH_tState* pState = (GUI_TOUCH_tState*)pMsg->Data.p;
  154.   if (pMsg->Data.p) {  /* Something happened in our area (pressed or released) */
  155.     if (pState->Pressed) {
  156.       if (pObj->Widget.State & WIDGET_STATE_ENABLED) {
  157.         pObj->Widget.State ^= CHECKBOX_STATE_CHECKED;
  158.         WM_Invalidate(hObj);
  159.         Notification = WM_NOTIFICATION_CLICKED;
  160.         WM_SetFocus(hObj);
  161.       }
  162.     } else {
  163.       Hit =1;
  164.       Notification = WM_NOTIFICATION_RELEASED;
  165.     }
  166.   } else {
  167.     Notification = WM_NOTIFICATION_MOVED_OUT;
  168.   }
  169.   WM_NotifyParent(hObj, Notification);
  170.   if (Hit == 1) {
  171.     GUI_DEBUG_LOG("CHECKBOX: Hitn");
  172.     GUI_StoreKey(pObj->Widget.Id);
  173.   }
  174. }
  175. /*********************************************************************
  176. *
  177. *       _Callback
  178. */
  179. static void _CHECKBOX_Callback (WM_MESSAGE *pMsg) {
  180.   CHECKBOX_Handle hObj;
  181.   CHECKBOX_Obj* pObj;
  182.   hObj = pMsg->hWin;
  183.   pObj = CHECKBOX_H2P(hObj);
  184.   /* Let widget handle the standard messages */
  185.   if (WIDGET_HandleActive(hObj, pMsg) == 0) {
  186.     return;
  187.   }
  188.   switch (pMsg->MsgId) {
  189.   case WM_PAINT:
  190.     GUI_DEBUG_LOG("CHECKBOX: _Callback(WM_PAINT)n");
  191.     _Paint(pObj);
  192.     return;
  193.   case WM_TOUCH:
  194.     _OnTouch(hObj, pObj, pMsg);
  195.     break;
  196.   }
  197.   WM_DefaultProc(pMsg);
  198. }
  199. /*********************************************************************
  200. *
  201. *       Exported routines:  Create
  202. *
  203. **********************************************************************
  204. */
  205. /* Note: the parameters to a create function may vary.
  206.          Some widgets may have multiple create functions */
  207. CHECKBOX_Handle CHECKBOX_Create (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags) {
  208.   CHECKBOX_Handle hObj;
  209.   /* Create the window */
  210.   WM_LOCK();
  211.   hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent,
  212.                                 Flags, _CHECKBOX_Callback, sizeof(CHECKBOX_Obj)-sizeof(WM_Obj));
  213.   if (hObj) {
  214.     CHECKBOX_Obj* pObj = CHECKBOX_H2P(hObj);
  215.     /* init widget specific variables */
  216.     WIDGET__Init(&pObj->Widget, WIDGET_STATE_FOCUSSABLE | WIDGET_STATE_ENABLED);
  217.     pObj->Widget.Id     = Id;
  218.     /* init member variables */
  219.     CHECKBOX_INIT_ID(pObj);
  220.     pObj->aBkColor[0]   = CHECKBOX_BKCOLOR0_DEFAULT;
  221.     pObj->aBkColor[1]   = CHECKBOX_BKCOLOR1_DEFAULT;
  222.     pObj->aFgColor[0]   = CHECKBOX_FGCOLOR0_DEFAULT;
  223.     pObj->aFgColor[1]   = CHECKBOX_FGCOLOR1_DEFAULT;
  224.   } else {
  225.     GUI_DEBUG_ERROROUT_IF(hObj==0, "CHECKBOX_Create failed")
  226.   }
  227.   WM_UNLOCK();
  228.   return hObj;
  229. }
  230. CHECKBOX_Handle CHECKBOX_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) {
  231.   CHECKBOX_Handle  hThis;
  232.   GUI_USE_PARA(cb);
  233.   hThis = CHECKBOX_Create(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, 15, 15,
  234.                           hWinParent, pCreateInfo->Id, pCreateInfo->Flags);
  235.   return hThis;
  236. }
  237. /*********************************************************************
  238. *
  239. *       Exported routines:  Various methods
  240. *
  241. **********************************************************************
  242. */
  243. void CHECKBOX_Check(CHECKBOX_Handle hObj) {
  244.   WIDGET_OrState(hObj, CHECKBOX_STATE_CHECKED);
  245. }
  246. void CHECKBOX_Uncheck(CHECKBOX_Handle hObj) {
  247.   WIDGET_AndState(hObj, CHECKBOX_STATE_CHECKED);
  248. }
  249. /*********************************************************************
  250. *
  251. *       Exported routines:  Query state
  252. *
  253. **********************************************************************
  254. */
  255. /*********************************************************************
  256. *
  257. *       CHECKBOX_IsChecked
  258. */
  259. int CHECKBOX_IsChecked(CHECKBOX_Handle hObj) {
  260.   int r = 0;
  261.   CHECKBOX_Obj* pObj;
  262.   if (hObj) {
  263.     WM_LOCK();
  264.     pObj = CHECKBOX_H2P(hObj);
  265.     r = (pObj->Widget.State & CHECKBOX_STATE_CHECKED) ? 1 : 0;
  266.     WM_UNLOCK();
  267.   }
  268.   return r;
  269. }
  270. #endif  /* #if GUI_WINSUPPORT */