Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Wanneer een besturingselement wordt geïnstrueerd zichzelf te tekenen in een apparaatcontext die door een container wordt geleverd, worden GDI-objecten (zoals pennen, penselen en lettertypen) meestal geselecteerd in de apparaatcontext, worden de tekenbewerkingen uitgevoerd en worden de vorige GDI-objecten hersteld. Als de container meerdere besturingselementen bevat die in dezelfde apparaatcontext moeten worden getrokken en elk besturingselement de GDI-objecten selecteert die nodig zijn, kan de tijd worden opgeslagen als de besturingselementen eerder geselecteerde objecten niet afzonderlijk herstellen. Nadat alle besturingselementen zijn getekend, kan de container de oorspronkelijke objecten automatisch herstellen.
Om te detecteren of een container deze techniek ondersteunt, kan een besturingselement de COleControl::IsOptimizedDraw-lidfunctie aanroepen. Als deze functie TRUE retourneert, kan het besturingselement de normale stap van het herstellen van de eerder geselecteerde objecten overslaan.
Overweeg een besturingselement met de volgende (niet-geoptimaliseerde) OnDraw functie:
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);
}
De pen en borstel in dit voorbeeld zijn lokale variabelen, wat betekent dat hun destructors worden aangeroepen wanneer ze buiten het bereik vallen (wanneer de OnDraw functie eindigt). De destructors proberen de bijbehorende GDI-objecten te verwijderen. Maar ze mogen niet worden verwijderd als u van plan bent om ze geselecteerd te laten in de apparaatcontext wanneer u terugkeert van OnDraw.
Als u wilt voorkomen dat de CPen - en CBrush-objecten worden vernietigd wanneer OnDraw ze zijn voltooid, slaat u ze op in lidvariabelen in plaats van lokale variabelen. Voeg in de klassedeklaratie van de controle declaraties toe voor twee nieuwe lidvariabelen.
class CMyAxOptCtrl : public COleControl
{
CPen m_pen;
CBrush m_brush;
};
Vervolgens kan de OnDraw functie als volgt worden herschreven:
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);
}
Deze aanpak voorkomt dat de pen en kwast elke keer worden aangemaakt wanneer OnDraw wordt aangeroepen. De snelheidsverbetering komt ten koste van het onderhouden van extra exemplaargegevens.
Als de eigenschap ForeColor of BackColor wordt gewijzigd, moet de pen of borstel opnieuw worden gemaakt. Hiervoor overschrijft u de functies OnForeColorChanged en OnBackColorChanged :
void CMyAxOptCtrl::OnForeColorChanged()
{
m_pen.DeleteObject();
}
void CMyAxOptCtrl::OnBackColorChanged()
{
m_brush.DeleteObject();
}
Als u onnodige SelectObject aanroepen wilt voorkomen, wijzigt u OnDraw als volgt:
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);
}
}
Zie ook
MFC ActiveX-besturingselementen: Optimalisatie
COleControl-klasse
MFC ActiveX-besturingselementen
MFC ActiveX-besturingselement Wizard
MFC ActiveX-besturingselementen: een ActiveX-besturingselement schilderen