T°φda knihovny MFC CRectTracker umo₧≥uje u₧ivateli p°emis¥ovat a m∞nit velikost pravo·hlΘho objektu v oknu pohledu. Tato t°φda mß dva d∙le₧itΘ datovΘ Φleny: Φlen m_nStyle urΦuje okraj, ·chyt pro zm∞nu velikosti a dalÜφ vlastnosti a Φlen m_rect uchovßvß sou°adnice za°φzenφ (tj. pixely ~ MM_TEXT) pravo·helnφka.
Funkce Draw kreslφ pravo·helnφk vΦetn∞ okraje a ·chyt∙ pro zm∞nu velikosti, dovnit° tohoto pravo·helnφka nekreslφ nic. To je vaÜe prßce.
Tuto funkci volßte z funkce obsluhujφcφ zprßvu WM_LBUTTONDOWN. Pokud se kurzor nachßzi na n∞kterΘm z ·chyt∙, m∙₧e u₧ivatel m∞nit velikost pravo·helnφka p°i stisknutΘm levΘm tlaΦφtku myÜi. Jestli₧e je kurzor uvnit° pravo·helnφka, m∙₧e u₧ivatel tento pravo·helnφk p°emis¥ovat. Jestli₧e se kurzor nachßzφ vn∞ pravo·helnφka, funkce Track okam₧it∞ vrßtφ hodnotu FALSE, jinak vracφ hodnotu TRUE pouze tehdy, kdy₧ u₧ivatel uvolnφ tlaΦφtko myÜi. To znamenß, ₧e funkce Track pracuje podobn∞ jako CDialog::DoModal. Mß svou vlastnφ logiku odesφlßnφ zprßv.
Funkci HitTest volejte, pokud pot°ebujete rozliÜovat mezi stisknutφm tlaΦφtka myÜi uvnit° pravo·helnφka a na jeho okraji. Funkce okam₧it∞ vracφ stav stisknutφ tlaΦφtka v nßvratovΘ hodnot∞.
Tuto funkci volejte ve vaÜem pohledu z funkce obsluhujφcφ zprßvu WM_SETCURSOR, abyste zajistili zm∞ny kurzoru p°i prßci s pravo·helnφkem. Pokud Funkce SetCursor vrßtφ hodnotu FALSE, volejte funkci OnSetCursor zßkladnφ t°φdy, kdy₧ vrßti TRUE, vra¥te takΘ TRUE.
Musφte si poradit s tφm, ₧e v Φlenu CRectTracker::m_rect jsou ulo₧eny
sou°adnice za°φzenφ (pixely). Pokud pou₧φvßte rolovacφ pohled nebo jste
jin²m zp∙sobem zm∞nili mapovacφ re₧em nebo poΦßtek sou°adnic za°φzenφ
(viewport origin), musφte provßd∞t p°evody sou°adnic.
Zde je mo₧n² postup:
Ve svΘ t°φd∞ pohledu definujte datov² Φlen typu CRectTracker. Pou₧ijte jmΘno m_tracker.
Ve svΘ t°φd∞ pohledu definujte samostant² datov² Φlen pro uklßdßnφ pravo·helnφka v logick²ch sou°adnicφch. Pou₧ijte jmΘno m_rectTracker.
Ve funkci OnDraw vaÜφ t°φdy pohledu vlo₧te do m_rect
aktualizovanΘ sou°adnice za°φzenφ a potom nakreslete pravo·helnφk.
Zde je vzorov² k≤d:
m_tracker.m_rect = m_rectTracker;
pDC->LPtoDP(m_tracker.m_rect);
// LogickΘ sou°adnice na sou°adnice za°φzenφ
m_tracker.Draw(pDC);
Ve vaÜφ funkci obsluhujφcφ zprßvu stisknutφ tlaΦφtka myÜi zavolejte funkci Track, do prom∞nnΘ m_rectTracker vlo₧te aktualizovanΘ logickΘ sou°adnice a zovolejte funkci Invalidate tak, jak vidφte zde:
if (m_tracker.Track(this, point, FALSE, NULL))
{
CClientDC dc(this);
OnPrepareDC(&dc);
// Virtußlnφ Φlenskß funkce t°φdy CView
// Slou₧φ ke zm∞n∞ sou°adnic a jejich poΦßtku
m_rectTracker = m_tracker.m_rect;
dc.DPtoLP(m_rectTracker);
// Sou°adnice za°φzenφ na logickΘ sou°adnice
Invalidate(); // P°ekreslenφ obrazovky
}