Freigeben über


Optimieren der Steuerelementdarstellung

Wenn ein Steuerelement angewiesen wird, die in einen Container-angegebenen Gerätekontext zu zeichnen, wird es in der Regel GDI-Objekte (wie Pinsel, Stifte und Schriftarten) in den Gerätekontext aus, führt die Zeichenvorgänge aus und stellt die vorherigen GDI-Objekte zurückgesetzt. Wenn der Container mehrere Steuerelemente, die in gezeichnet werden sollen, demselben Gerätekontext hat und jedes Steuerelement die GDI-Objekte auswählt, die es benötigt, kann Zeit gespeichert werden, wenn die Steuerelemente nicht einzeln zuvor ausgewählte Objekte wiederherstellen. Schließlich sind Steuerelemente, der Container können die ursprünglichen Objekte automatisch wiederhergestellt gezeichnet wurden.

Um zu erkennen ob ein Container diese Technik unterstützt, kann ein Steuerelement die COleControl::IsOptimizedDraw-Memberfunktion aufrufen. Wenn diese Funktion TRUE zurückgibt, kann das Steuerelement den normalen Schritt der Wiederherstellung der vorher ausgewählten Objekte überspringen.

Betrachten Sie ein Steuerelement, das über die folgende (nicht optimierte) OnDraw-Funktion verfügt:

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

Der Stift und der Pinsel in diesem Beispiel sind die Variablen heißt, dass ihre als Destruktoren bezeichnet werden, wenn sie den Gültigkeitsbereich verlassen (wenn die OnDraw-Funktion beendet). Die Destruktoren versuchen, die entsprechenden GDI-Objekte zu löschen. Aber sie sollten nicht gelöscht werden, wenn Sie planen, diese werden ausgewählt in den Gerätekontext nach der Rückgabe von OnDraw.

Um die CPen und CBrush an Objekte zerstört werden zu verhindern wenn OnDraw endet, speichern Sie sie in die Membervariablen statt der lokalen Variablen. In der Klassendeklaration des Steuerelements fügen Sie Deklarationen für zwei neue Membervariablen hinzu:

class CMyAxOptCtrl : public COleControl
{


...


   CPen m_pen;
   CBrush m_brush;
};

Anschließend kann die OnDraw umgeschrieben Funktion werden, wie folgt:

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

Diese Vorgehensweise vermeidet Erstellen des Stiftes und des Pinsels, wenn OnDraw aufgerufen wird. Die Geschwindigkeitsverbesserung stammt auf Kosten der Sicherung von zusätzlichen Instanzdaten.

Wenn die Eigenschaft - oder BackColor ändert, muss der Stift oder der Pinsel erneut erstellt werden. Hierzu, überschreiben Sie die OnForeColorChanged und OnBackColorChanged-Memberfunktionen:

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

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

Schließlich unnötige Aufrufe SelectObject zu vermeiden, ändern Sie OnDraw, wie folgt:

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

Siehe auch

Referenz

COleControl-Klasse

MFC-ActiveX-Steuerelement-Assistent

Konzepte

MFC-ActiveX-Steuerelemente: Optimierung

MFC-ActiveX-Steuerelemente

MFC-ActiveX-Steuerelemente

MFC-ActiveX-Steuerelemente: Darstellen eines ActiveX-Steuerelements