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

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        : WM_Screen2hWin.c
  16. Purpose     : Windows manager, add. module
  17. ----------------------------------------------------------------------
  18. */
  19. #include "WM_Intern.H"
  20. #if GUI_WINSUPPORT    /* If 0, WM will not generate any code */
  21. /*******************************************************************
  22. *
  23. *         Static code
  24. *
  25. ********************************************************************
  26. */
  27. static int _CheckHit(WM_Obj * pWin, int x, int y) {
  28.   if (   (pWin->Status & WM_SF_ISVIS)
  29.       && (x >= pWin->Rect.x0)
  30.       && (x <= pWin->Rect.x1)
  31.       && (y >= pWin->Rect.y0)
  32.       && (y <= pWin->Rect.y1))
  33.   {
  34.     return 1;
  35.   }
  36.   return 0;
  37. }
  38. /*******************************************************************
  39. *
  40. *         _Screen2hWin
  41.   This routine is recursive.
  42.   It checks if the given coordinates are in the window or a decendant.
  43.   Returns:
  44.   0:   If coordinates are neither in the given window nor a decendent
  45.   !=0  Handle of the topmost visible decendent in which the given
  46.        coordinate falls.
  47. */
  48. static WM_HWIN _Screen2hWin(WM_HWIN hWin, int x, int y) {
  49.   WM_Obj* pWin = WM_HANDLE2PTR(hWin);
  50.   WM_HWIN hChild, hHit;
  51.   /* First check if the  coordinates are in the given window. If not, return 0 */
  52.   if (_CheckHit(pWin, x, y) == 0) {
  53.     return 0;
  54.   }
  55.   /* If the coordinates are in a child, search deeper ... */
  56.   for (hChild = pWin->hFirstChild; hChild; ) {
  57.     WM_Obj* pChild = WM_HANDLE2PTR(hChild);
  58.     if ((hHit = _Screen2hWin(hChild, x, y)) != 0) {
  59.       hWin = hHit;        /* Found a window */
  60.     }
  61.     hChild = pChild->hNext;
  62.   }
  63.   return hWin;            /* No Child affected ... The parent is the right one */
  64. }
  65. /*******************************************************************
  66. *
  67. *         Public code
  68. *
  69. ********************************************************************
  70. */
  71. WM_HWIN WM_Screen2hWin(int x, int y) {
  72.   WM_HWIN r;
  73.   WM_LOCK();
  74.   r = _Screen2hWin(WM__FirstWin, x, y);
  75.   WM_UNLOCK();
  76.   return r;
  77. }
  78. #else                                       /* Avoid empty object files */
  79.   void WM_Screen2Win(void) {}
  80. #endif /* WM_MAX_WINDOW */