Поделиться через


Эластичные соединения и средства отслеживания

Другая функция, предоставляемая трекировщиками, — это выбор резиновой полосы, которая позволяет пользователю выбирать несколько элементов OLE, перетаскивая прямоугольник размера вокруг выбранных элементов. Когда пользователь освобождает левую кнопку мыши, элементы в регионе, выбранном пользователем, выбираются и могут управляться пользователем. Например, пользователь может перетащить выделение в другое приложение контейнера.

Для реализации этой функции требуется дополнительный код в функции обработчика WM_LBUTTONDOWN приложения.

В следующем примере кода реализованы выбор резиновой полосы и дополнительные функции.

else if (m_Tracker.HitTest(point) < 0)
{
// just to demonstrate CRectTracker::TrackRubberBand
CRectTracker trackerRubber;
if (trackerRubber.TrackRubberBand(this, point, TRUE))
{
   MessageBeep(0); // beep indicates TRUE

   // See if rubber band intersects 
   // with the doc's tracker
   CRect rectT;
   // so intersect rect works
   trackerRubber.m_rect.NormalizeRect();
   if (rectT.IntersectRect(trackerRubber.m_rect, m_Tracker.m_rect))
   {
      // If so, put resize handles on it (i.e. select it)
      if (m_Tracker.m_nStyle & CRectTracker::resizeInside)
      {
         // swap from resize inside to resize outside for effect
         m_Tracker.m_nStyle &= ~CRectTracker::resizeInside;
         m_Tracker.m_nStyle |= CRectTracker::resizeOutside;
      }
      else
      {
         // Just use inside resize handles on first time
         m_Tracker.m_nStyle &= ~CRectTracker::resizeOutside;
         m_Tracker.m_nStyle |= CRectTracker::resizeInside;
      }
      GetDocument()->SetModifiedFlag();
      GetDocument()->UpdateAllViews(NULL);
   }
}
}

Если вы хотите разрешить обратимую ориентацию трекера во время резиновой полосы, необходимо вызвать CRectTracker::TrackRubberBand с третьим параметром, равным TRUE. Помните, что возможность обратной ориентации иногда приводит к тому, что CRectTracker::m_rect будет инвертирован. Это можно исправить с помощью вызова CRect::NormalizeRect.

Дополнительные сведения см. в разделе "Элементы клиента контейнера" и перетаскивание OLE: настройка перетаскивания.

См. также

Средства отслеживания. Реализация средств отслеживания в приложении OLE
Класс CRectTracker