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ší, probírané v tématuInterpretace uživatelského vstupu prostřednictvím zobrazení.) Vaše OnDraw
přepsání:
Získá data voláním členských funkcí dokumentu, které zadáte.
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ě zobrazení volá členskou funkci UpdateAllViews dokumentu, aby upozorňovat všechna zobrazení na stejném dokumentu, aby se aktualizovaly samy. UpdateAllViews
volá členskou funkci OnUpdate každého zobrazení. Výchozí implementace OnUpdate
zneplatní celou oblast klienta zobrazení. Můžete ji přepsat tak, aby zneplatněla pouze ty oblasti klientské oblasti, které se mapují na upravené části dokumentu.
Členová UpdateAllViews
funkce třídy CDocument
a OnUpdate
členová funkce třídy CView
umožňují předávat informace popisující, které části dokumentu byly změněny. Tento mechanismus "hint" umožňuje omezit oblast, kterou musí zobrazení překreslit. OnUpdate
přebírá dva argumenty "hint". 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 zobrazení je zapnutá Malování odpoví na zprávu vytvořením objektu kontextu zařízení třídy C Malování DC a zavolá členskou OnDraw
funkci 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í. Pro kreslení na obrazovce OnDraw
se předá CPaintDC
objekt. 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 kresbu obrazovky, CDC
objekt předaný v pDC je CPaintDC
jehož konstruktor již volal BeginPaint
.OnDraw
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 OnDraw
najdete v ukázkách MFC.