Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Ketika kontrol diinstruksikan untuk menggambar dirinya ke dalam konteks perangkat yang disediakan kontainer, biasanya memilih objek GDI (seperti pena, kuas, dan font) ke dalam konteks perangkat, melakukan operasi menggambarnya, dan memulihkan objek GDI sebelumnya. Jika kontainer memiliki beberapa kontrol yang akan digambar ke dalam konteks perangkat yang sama, dan setiap kontrol memilih objek GDI yang diperlukan, waktu dapat disimpan jika kontrol tidak memulihkan objek yang dipilih sebelumnya secara individual. Setelah semua kontrol digambar, kontainer dapat secara otomatis memulihkan objek asli.
Untuk mendeteksi apakah kontainer mendukung teknik ini, kontrol dapat memanggil fungsi anggota COleControl::IsOptimizedDraw . Jika fungsi ini mengembalikan TRUE, kontrol dapat melewati langkah normal memulihkan objek yang dipilih sebelumnya.
Pertimbangkan kontrol yang memiliki fungsi berikut (tidak optimal): OnDraw
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);
}
Pena dan kuas dalam contoh ini adalah variabel lokal, yang berarti destruktor mereka akan dipanggil ketika keluar dari cakupan (ketika fungsi OnDraw berakhir). Destruktor akan berusaha untuk menghapus objek GDI yang bersesuaian. Tetapi mereka tidak boleh dihapus jika Anda berencana untuk membiarkannya dipilih ke dalam konteks perangkat setelah kembali dari OnDraw.
Untuk mencegah objek CPen dan CBrush dihancurkan ketika OnDraw selesai, simpan dalam variabel anggota alih-alih variabel lokal. Dalam deklarasi kelas kontrol, tambahkan deklarasi untuk dua variabel anggota baru:
class CMyAxOptCtrl : public COleControl
{
CPen m_pen;
CBrush m_brush;
};
Kemudian, OnDraw fungsi dapat ditulis ulang sebagai berikut:
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);
}
Pendekatan ini menghindari pembuatan pena dan kuas setiap kali OnDraw dipanggil. Peningkatan kecepatan datang dengan mengorbankan pemeliharaan data instans tambahan.
Jika properti ForeColor atau BackColor berubah, pena atau kuas perlu dibuat lagi. Untuk melakukan ini, ambil alih fungsi anggota OnForeColorChanged dan OnBackColorChanged :
void CMyAxOptCtrl::OnForeColorChanged()
{
m_pen.DeleteObject();
}
void CMyAxOptCtrl::OnBackColorChanged()
{
m_brush.DeleteObject();
}
Terakhir, untuk menghilangkan panggilan yang tidak perlu SelectObject , ubah OnDraw sebagai berikut:
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);
}
}
Lihat juga
Kontrol ActiveX MFC: Pengoptimalan
Kelas COleControl
Kontrol ActiveX MFC
Panduan Kontrol ActiveX MFC
Kontrol ActiveX MFC: Melukis Kontrol ActiveX