다음을 통해 공유


컨트롤 그리기 최적화

컨트롤 컨테이너에서 제공 하는 장치 컨텍스트에 자신을 그리도록 지시를 받으면 일반적으로 GDI 개체 (펜, 브러시, 글꼴 등)을 디바이스 컨텍스트로 선택, 해당 드로잉 작업을 수행 및 이전의 GDI 개체를 복원 합니다.컨테이너 같은 디바이스 컨텍스트에 그려지는 컨트롤을 여러 개 있고 각 컨트롤을 필요로 하는 GDI 개체 선택 컨트롤 이전에 선택한 개체를 개별적으로 복원 하지 않으면 시간 저장할 수 있습니다.모든 컨트롤이 그려진 후 컨테이너 원래 개체를 자동으로 복원할 수 있습니다.

컨테이너는이 기술을 지원 하는지 여부를 검색 하는 컨트롤에서 호출할 수 있는 COleControl::IsOptimizedDraw 멤버 함수.이 함수가 반환 하는 경우 TRUE, 컨트롤에서 이전에 선택한 개체를 복원 하는 일반적인 단계를 건너뛸 수 있습니다.

(최적화 되지 않음)는 다음의 컨트롤을 고려 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);
}

펜 및 브러시이 예제에서 지역 변수가 범위를 벗어나면 해당 소멸자에 라는 의미입니다 (때의 OnDraw 작동 끝).소멸자는 해당 GDI 개체를 삭제 하려고 합니다.하지만 선택한 장치 컨텍스트를 반환 시에 두려면 계획 이라면 이러한 삭제 해서는 안 OnDraw.

방지 하는 CPenCBrush 개체에서 소멸 될 때 OnDraw 실행이 끝나면 저장 고에서 멤버 변수를 지역 변수 대신.컨트롤의 클래스 선언에 두 새 멤버 변수 선언을 추가 합니다.

class CMyAxOptCtrl : public COleControl
{


...


   CPen m_pen;
   CBrush m_brush;
};

그런 다음, 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);
}

이 접근 방식을 만들 때마다 펜 및 브러시를 피할 수 OnDraw 라고 합니다.추가 인스턴스 데이터를 유지 관리의 속도 향상을 제공 합니다.

ForeColor 또는 BackColor 속성이 변경 되 면 펜 또는 브러시를 다시 만들어야 할.이렇게 하려면 재정의 OnForeColorChangedOnBackColorChanged 멤버 함수:

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

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

마지막으로, 제거 불필요 한 SelectObject 호출을 수정 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);
   }
}

참고 항목

참조

COleControl 클래스

MFC ActiveX 컨트롤 마법사

개념

MFC 컨트롤을 ActiveX: 최적화

MFC 컨트롤을 ActiveX

MFC 컨트롤을 ActiveX

ActiveX 컨트롤을 MFC 컨트롤을 ActiveX: 페인팅