Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование на WinApi, C++Builder, Visual C++


Информационный Канал Subscribe.Ru


Выпуск № 47-2003 BCBDEV.RU

Здравствуйте уважаемые подписчики!

Перед вами очередной выпуск рассылки "Программирование на WinApi"
Переводы многих функций Win32API, которые часто используются в данной рассылке, вы можете получать, подписавшись на дружественную рассылку "WinAPI на русском".
Предлагаю вашему вниманию рассылку "Тестирование и качество". Рассылка для тестировщиков и инженеров качества.
Справочник по функциям Win32API вы можете посмотреть на сайте BcbDev.ru в разделе MSDN по-русски.

Как определить, может ли пользователь видеть моё окно?
Ответ на этот вопрос зависит от того, желаете ли вы определить что пользователь видит окно целиком, часть окна или определённую точку вашего окна.

Определённая точка
Для определения возможности просмотра определённой точки вашего окна, вы можете найти экранные координаты этой точки, вызвав функцию WindowFromPoint, и сделать проверку, чтобы убедиться в том, что дескриптор, возвращённый WindowFromPoint, тот же что и дескриптор вашего окна. Если так, вы можете быть уверены, что пользователь видит эту точку. Хотя это может быть всего один пиксель вашего окна, выглядывающий из-под множества окон, находящихся выше. Эта простая функция проверяет, может ли пользователь видеть середину вашего окна:
BOOL IsWindowCentreVisibleToUser (HWND hWnd)
{
   BOOL  bRetVal = FALSE;
   RECT  rcWnd;
   POINT pt;

   if (IsWindow (hWnd))
   {
      GetWindowRect (hWnd, &rcWnd);
      pt.x = rcWnd.left + (rcWnd.right - rcWnd.left)/2;
      pt.y = rcWnd.top + (rcWnd.bottom - rcWnd.top)/2;

      bRetVal = (WindowFromPoint (pt) == hWnd);
   }
   return bRetVal;
}

Плохой стороной этого метода является то, что WindowFromPoint возвращает дескрипторы только неблокированных окон. Так что нам нужен более продвинутый метод...

Окно целиком или только его часть
Всё более усложняется, когда заходит речь о целом окне или какой то его части. Уловка заключается в том, что надо заставить систему поработать на вас и используя систему отсечений. Взглянем на код ниже:

#define IWVTU_FULL     1
#define IWVTU_PARTIAL  2
#define IWVTU_HIDDEN   3
#define IWVTU_ERROR    4


UINT IsWindowVisibleToUser (HWND hWnd)
{
   UINT uRetVal = IWVTU_ERROR;
   int  iClipRes;
   HDC  hdcWnd;
   RECT rcWndClient;
   RECT rcWndClip;

   if (IsWindow (hWnd))
   {

      hdcWnd = GetDC (hWnd);
      GetClientRect (hWnd, &rcWndClient);
      iClipRes = GetClipBox (hdcWnd, &rcWndClip);
      ReleaseDC (hWnd, hdcWnd);

      switch (iClipRes)
      {
         case NULLREGION:
              uRetVal = IWVTU_HIDDEN;
              break;

         case SIMPLEREGION:
              if (EqualRect (&rcWndClip, &rcWndClient))
                 uRetVal = IWVTU_FULL;
              else
                 uRetVal = IWVTU_PARTIAL;
              break;

         case COMPLEXREGION:
              uRetVal = IWVTU_PARTIAL;
              break;

         default:
              uRetVal = IWVTU_ERROR;
              break;
      }
   }
   return uRetVal;
}

 


Удачи Вам в Ваших делах Куковинец Андрей aka Juggernaut

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное