Optimalizace řízení výkresu
Předem definovaných podmínek ovládacího prvku samotného kreslení do kontextu kontejneru dodaných zařízení ji obvykle vybere do kontextu zařízení GDI objektů (například per stopy a písma), provede její operace kreslení a obnoví předchozí objekty GDI.Pokud kontejner má více ovládacích prvků, které jsou stanoveny do stejného kontextu zařízení a objekty GDI, které vyžaduje vybere každý ovládací prvek, čas můžete uloženy ovládací prvky neobnovujte jednotlivě dříve vybrané objekty.Poté, co byly stanoveny všechny ovládací prvky kontejneru automaticky obnovit původní objekty.
Chcete-li zjistit, zda kontejner podporuje tuto techniku, můžete zavolat ovládací prvek COleControl::IsOptimizedDraw členské funkce.Pokud je tato funkce vrací TRUE, normální krok obnovení dříve vybrané objekty můžete přeskočit ovládací prvek.
Zvažte ovládací prvek, který má následující (neoptimalizované) OnDraw funkce:
void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
CPen pen(PS_SOLID, 0, TranslateColor(GetForeColor()));
CBrush brush(TranslateColor(GetBackColor()));
CPen* pPenSave = pdc->SelectObject(&pen);
CBrush* pBrushSave = pdc->SelectObject(&brush);
pdc->Rectangle(rcBounds);
pdc->SelectObject(pPenSave);
pdc->SelectObject(pBrushSave);
}
Pero a štětec v tomto příkladu jsou místní proměnné znamená jejich destruktory bude volána při přístupu mimo rozsah (když OnDraw končí funkční).Destruktory pokusí odstranit odpovídající objekty GDI.Ale jejich měla odstranit plánujete nechat vybraný do kontextu zařízení po návratu z OnDraw.
Aby CPen a CBrush objekty z zničen při OnDraw dokončení je uložit do proměnné členů namísto místní proměnné.V deklaraci třídy ovládacího prvku přidejte prohlášení pro dvě nové členské proměnné:
class CMyAxOptCtrl : public COleControl
{
...
CPen m_pen;
CBrush m_brush;
};
Potom, OnDraw funkce můžete přepsat takto:
void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
CPen pen(PS_SOLID, 0, TranslateColor(GetForeColor()));
CBrush brush(TranslateColor(GetBackColor()));
CPen* pPenSave = pdc->SelectObject(&pen);
CBrush* pBrushSave = pdc->SelectObject(&brush);
pdc->Rectangle(rcBounds);
pdc->SelectObject(pPenSave);
pdc->SelectObject(pBrushSave);
}
Tento přístup zabraňuje vytváření pero a štětec při každém OnDraw se nazývá.Zlepšení rychlosti je dodávána na druhou stranu zachování dat další instance.
Pokud změní vlastnost Barva popředí a barva pozadí, pera nebo stopy musí být vytvořen znovu.To provedete přepsat OnForeColorChanged a OnBackColorChanged funkce členů:
void CMyAxOptCtrl::OnForeColorChanged()
{
m_pen.DeleteObject();
}
void CMyAxOptCtrl::OnBackColorChanged()
{
m_brush.DeleteObject();
}
Konečně odstranit nepotřebné SelectObject upravit volání, OnDraw takto:
void CMyAxOptCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (m_pen.m_hObject == NULL)
m_pen.CreatePen(PS_SOLID, 0, TranslateColor(GetForeColor()));
if (m_brush.m_hObject == NULL)
m_brush.CreateSolidBrush(TranslateColor(GetBackColor()));
CPen* pPenSave = pdc->SelectObject(&m_pen);
CBrush* pBrushSave = pdc->SelectObject(&m_brush);
pdc->Rectangle(rcBounds);
if (! IsOptimizedDraw())
{
pdc->SelectObject(pPenSave);
pdc->SelectObject(pBrushSave);
}
}
Viz také
Referenční dokumentace
Průvodce ovládacího prvku knihovny MFC technologie ActiveX