Sdílet prostřednictvím


Kreslení v zobrazení

Téměř všechny výkresy v aplikaci se vyskytují v členské funkci zobrazení OnDraw , kterou musíte přepsat ve třídě zobrazení. (Výjimkou je kreslení myší, které je popsáno v tématu Interpretace uživatelského vstupu prostřednictvím zobrazení.) Vaše OnDraw přetížení:

  1. Získá data voláním funkcí členů dokumentu, které poskytnete.

  2. Zobrazí data voláním členských funkcí objektu kontextu zařízení, který architektura předává OnDraw.

Když se data dokumentu nějakým způsobem změní, musí se zobrazení překreslit, aby odráželo změny. K tomu obvykle dochází, když uživatel provede změnu v zobrazení dokumentu. V tomto případě zobrazovací část volá členskou funkci UpdateAllViews dokumentu, aby upozornila všechna zobrazení na stejném dokumentu na nutnost se aktualizovat. UpdateAllViews volá členskou funkci každého zobrazení OnUpdate. Výchozí implementace OnUpdate zneplatní celou oblast klienta zobrazení. Můžete ji přepsat tak, aby zneplatněla pouze ty oblasti klientské oblasti, které odpovídají upraveným částem dokumentu.

Členová funkce UpdateAllViews třídy CDocument a členová funkce OnUpdate třídy CView vám umožňují předávat informace popisující, které části dokumentu byly změněny. Tento mechanismus „nápovědy“ umožňuje omezit oblast, kterou musí zobrazení znovu vykreslit. OnUpdate přebírá dva argumenty typu "nápověda". První, lHint, typu LPARAM, umožňuje předat všechna data, která se vám líbí, zatímco druhý pHint, typu CObject*, umožňuje předat ukazatel na jakýkoli objekt odvozený z CObject.

Když se zobrazení stane neplatným, Systém Windows ho odešle WM_PAINT zprávu. Funkce obslužné rutiny OnPaint zobrazení odpoví na zprávu vytvořením objektu kontextu zařízení třídy CPaintDC a zavolá funkci člena OnDraw vašeho zobrazení. Obvykle nemusíte psát přepisování OnPaint funkce obslužné rutiny.

Kontext zařízení je datová struktura Systému Windows, která obsahuje informace o atributech výkresu zařízení, jako je zobrazení nebo tiskárna. Všechna volání výkresu se provádějí prostřednictvím objektu kontextu zařízení. Při kreslení na obrazovce se předá objekt OnDraw do CPaintDC. Pro kreslení na tiskárně se předává objekt CDC nastavený pro aktuální tiskárnu.

Kód pro kreslení v zobrazení nejprve načte ukazatel na dokument a pak provede volání výkresu prostřednictvím kontextu zařízení. Následující jednoduchý OnDraw příklad znázorňuje proces:

void CMyView::OnDraw(CDC* pDC)
{
   CMyDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   CString s = pDoc->GetData();   // Returns a CString
   CRect rect;
   GetClientRect(&rect);

   pDC->SetTextAlign(TA_BASELINE | TA_CENTER);
   pDC->TextOut(rect.right / 2, rect.bottom / 2, s, s.GetLength());
}

V tomto příkladu byste definovali GetData funkci jako člena odvozené třídy dokumentu.

Příklad vytiskne jakýkoli řetězec, který získá z dokumentu, na střed v zobrazení. Pokud je volání pro vykreslování na obrazovce OnDraw, objekt CDC předaný v pDC je to CPaintDC, jehož konstruktor již zavolal BeginPaint. Volání funkcí kreslení se provádí prostřednictvím ukazatele kontextu zařízení. Informace o kontextech zařízení a volání výkresu naleznete v tématu CDC třídy v odkazu MFC a práce s objekty okna.

Další příklady zápisu OnDrawnajdete v ukázkách MFC.

Viz také

Použití zobrazení