Udostępnij za pośrednictwem


Optymalizacja kontroli rysunku

Jeżeli pojawi się odpowiedni formant jest Rysowanie sam do kontekstu urządzenia dostarczony w pojemniku, zazwyczaj wybiera obiekty interfejsu GDI (takie jak pióra, pędzle i czcionki) do kontekstu urządzenia, wykonuje swoje operacje rysunku i przywraca poprzednie obiekty interfejsu GDI.Jeśli pojemnik ma wiele formantów, które mają być określone w tym samym kontekście urządzenia każdej kontroli wybiera obiekty interfejsu GDI, które wymaga, czasu można zapisywać, jeśli formanty nie indywidualnie przywrócić poprzednio zaznaczonych obiektów.Po wszystkie formanty zostały wystawione, pojemnika można automatycznie przywrócić obiekty oryginalne.

Aby wykryć, czy kontener obsługuje tej techniki, formant można wywołać COleControl::IsOptimizedDraw funkcji składowej.Jeśli ta funkcja zwraca TRUE, formant można pominąć krok normalnej przywrócenie poprzednio zaznaczonych obiektów.

Należy wziąć pod uwagę formantu, który ma następujące (unoptimized) OnDraw funkcji:

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);
}

Pióro i Ołówek w tym przykładzie są zmienne lokalne, co oznacza ich destruktory zostanie wywołana, gdy wykraczają poza zakresem (po OnDraw kończy się działać).Destruktory spróbuje usunąć odpowiednie obiekty interfejsu GDI.Ale one nie powinny być usuwane, jeśli planuje się pozostawienie ich wybranych do kontekstu urządzenia po powrocie z OnDraw.

Aby zapobiec CPen i CBrush obiektów z zniszczeniu podczas OnDraw wykończenie, przechowywać je w zmiennych zamiast zmiennych lokalnych.W deklaracji klasy formantu należy dodać deklaracje dwie nowe zmienne składowe:

class CMyAxOptCtrl : public COleControl
{


...


   CPen m_pen;
   CBrush m_brush;
};

Następnie, OnDraw funkcji można zapisać w następujący sposób:

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);
}

Podejście to pozwala uniknąć tworzenia Pióro i Ołówek każdym OnDraw jest wywoływana.Poprawę szybkości jest dostarczany jest związany z utrzymania dane dodatkowe wystąpienia.

Zmiana właściwości ForeColor lub BackColor pióro lub pędzla musi być utworzony ponownie.Aby to zrobić, należy zastąpić OnForeColorChanged i OnBackColorChanged funkcji elementów członkowskich:

void CMyAxOptCtrl::OnForeColorChanged()
{
   m_pen.DeleteObject();
}

void CMyAxOptCtrl::OnBackColorChanged()
{
   m_brush.DeleteObject();
}

Wreszcie Aby wyeliminować zbędne SelectObject modyfikowanie rozmowy, OnDraw w następujący sposób:

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);
   }
}

Zobacz też

Informacje

Klasa COleControl

Kreator formant ActiveX MFC

Koncepcje

Formanty ActiveX MFC: Optymalizacja

Formanty ActiveX MFC

Formanty ActiveX MFC

Formanty ActiveX MFC: Malowanie formantu ActiveX