..::CRectTracker::..

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.

Popis d∙le₧it²ch Φlensk²ch funkcφ:

void Draw(CDC* pDC) const;

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.

BOOL Track( CWnd* pWnd, CPoint point, BOOL bAllowInvert = FALSE, CWnd* pWndClipTo = NULL );

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.

int HitTest( CPoint point ) const;

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∞.

BOOL SetCursor( CWnd* pWnd, UINT nHitTest ) const;

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.

P°evod sou°adnic pravo·helnφka t°φdy CRectTracker

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:

  1. Ve svΘ t°φd∞ pohledu definujte datov² Φlen typu CRectTracker. Pou₧ijte jmΘno m_tracker.

  2. 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.

  3. 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);


  4. 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

    }