Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
Microsoft Foundation Sınıfları (MFC) kitaplığı desteklenmeye devam ediyor. Ancak artık özellik eklemeyeceğiz veya belgeleri güncelleştirmeyeceğiz.
Bir denetime kendisini kapsayıcı tarafından sağlanan bir cihaz bağlamı içine çizmesi talimatı verildiğinde, genellikle cihaz bağlamında GDI nesnelerini (kalemler, fırçalar ve yazı tipleri gibi) seçer, çizim işlemlerini gerçekleştirir ve önceki GDI nesnelerini geri yükler. Kapsayıcıda aynı cihaz bağlamında çizilecek birden çok denetim varsa ve her denetim gerektirdiği GDI nesnelerini seçerse, denetimler önceden seçilen nesneleri ayrı ayrı geri yüklemezse zaman kaydedilebilir. Tüm denetimler çizildikten sonra kapsayıcı, özgün nesneleri otomatik olarak geri yükleyebilir.
Kapsayıcının bu tekniği destekleyip desteklemediğini algılamak için bir denetim COleControl::IsOptimizedDraw üye işlevini çağırabilir. Bu işlev TRUE döndürürse, denetim daha önce seçili nesneleri geri yüklemenin normal adımını atlayabilir.
Aşağıdaki (iyileştirilmemiş) OnDraw işleve sahip bir denetimi göz önünde bulundurun:
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);
}
Bu örnekteki kalem ve fırça yerel değişkenlerdir, yani yok edicileri kapsam dışına çıktığında (OnDraw işlevi sona erdiğinde) çağrılır. Yıkıcılar ilgili GDI nesnelerini silmeye çalışır. Ancak OnDraw'den döndükten sonra onları cihaz bağlamında seçili bırakmayı planlıyorsanız silinmemeleri gerekir.
Tamamlandığında CPen ve CBrush nesnelerinin yok OnDraw edilmesini önlemek için, bunları yerel değişkenler yerine üye değişkenlerinde depolayın. Denetimin sınıf bildiriminde iki yeni üye değişkeni için bildirimler ekleyin:
class CMyAxOptCtrl : public COleControl
{
CPen m_pen;
CBrush m_brush;
};
Ardından işlev OnDraw aşağıdaki gibi yeniden yazılabilir:
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);
}
Bu yaklaşım, her OnDraw çağrıldığında kalem ve fırçanın oluşturulmasını önler. Hız artışı, ek örnek verilerinin bakımının maliyetine bağlıdır.
ForeColor veya BackColor özelliği değişirse kalem veya fırçanın yeniden oluşturulması gerekir. Bunu yapmak için OnForeColorChanged ve OnBackColorChanged üye işlevlerini geçersiz kılın:
void CMyAxOptCtrl::OnForeColorChanged()
{
m_pen.DeleteObject();
}
void CMyAxOptCtrl::OnBackColorChanged()
{
m_brush.DeleteObject();
}
Son olarak, gereksiz SelectObject çağrıları ortadan kaldırmak için aşağıdaki gibi değiştirin OnDraw :
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);
}
}
Ayrıca bakınız
MFC ActiveX Denetimleri: İyileştirme
COleControl Sınıfı
MFC ActiveX Denetimleri
MFC ActiveX Denetim Sihirbazı
MFC ActiveX Denetimleri: ActiveX Denetimini Boyama