ActiveX 컨트롤을 MFC 컨트롤을 ActiveX: 페인팅
ActiveX 컨트롤 그리기 프로세스와 프로세스를 최적화 하는 그리기 코드를 변경할 수 있습니다 방법을 설명 합니다.(참조 하십시오 컨트롤 그리기 최적화 컨트롤 개별적으로 하지 않고 그리기 작업을 최적화 하는 방법에 대 한 기술 이전에 선택한 GDI 개체를 복원 합니다.모든 컨트롤이 그려진 후 컨테이너가 자동으로 원래 개체를 복원할 수 있습니다.)
이 문서의 예제에서는 ActiveX MFC 컨트롤 마법사 기본 설정에 의해 생성 되는 컨트롤입니다.ActiveX 컨트롤 MFC 마법사를 사용 하 여 뼈대 제어 응용 프로그램을 만드는 대 한 자세한 내용은 문서를 참조 하십시오. ActiveX 컨트롤 마법사 MFC.
다음 내용은 다룹니다.
컨트롤과 ActiveX 컨트롤 마법사에서 페인팅을 지원 하기 위해 만든 코드를 그리기에 대 한 전반적인 프로세스
그리기 프로세스를 최적화 하는 방법
메타 파일을 사용 하 여 컨트롤을 그리는 방법
ActiveX 컨트롤의 그리기 프로세스
ActiveX 컨트롤을 처음에 표시할지 또는 그려집니다 때 테이와 하나의 중요 한 차이점은 MFC를 사용 하 여 개발 하는 다른 응용 프로그램에 비슷한 페인트 과정: ActiveX 컨트롤이 활성 또는 비활성 상태로 될 수 있습니다.
활성 컨트롤은 ActiveX 컨트롤 컨테이너에 자식 창으로 표시 됩니다.다른 창과 마찬가지로 자체 그리기를 담당 하는 경우는 WM_PAINT 메시지를 받은.컨트롤의 기본 클래스를 COleControl,이 메시지를 처리 하는 OnPaint 함수.이 기본 구현을 호출 하는 OnDraw 컨트롤의 기능을 합니다.
비활성 컨트롤은 이와 다르게 그려집니다.그리기 메시지를 받을 수 있도록 컨트롤이 비활성 상태일 때 해당 창이 보이지 않거나 존재 하지 않는 경우입니다.대신 컨트롤 컨테이너를 직접 호출 하는 OnDraw 함수는 컨트롤의.이에 있는 활성 컨트롤의 그리기 프로세스를 다릅니다는 OnPaint 멤버 함수를 호출 하지 않습니다.
ActiveX 컨트롤은 업데이트 방법을 앞에서 설명한 대로 컨트롤의 상태에 따라 달라 집니다.그러나 프레임 워크에서 호출 하므로 OnDraw 멤버 함수 두 경우 모두에서 대부분의 그리기 코드에이 멤버 함수를 추가 합니다.
OnDraw 멤버 함수는 컨트롤 그리기를 처리 합니다.컨트롤 컨테이너 컨트롤 비활성 상태일 때를 호출 OnDraw, 장치 컨텍스트 컨트롤 컨테이너와 컨트롤에 의해 차지 하는 사각형 영역의 좌표를 전달 합니다.
사각형을 전달 하는 프레임 워크에 OnDraw 멤버 함수가 포함 된 컨트롤에 의해 차지 하는 영역입니다.컨트롤이 활성화 된 경우 왼쪽 위 모퉁이 (0, 0) 및 컨트롤이 포함 된 자식 창에 전달 된 디바이스 컨텍스트가 됩니다.컨트롤이 활성화 되어 있지 않으면 왼쪽 위 좌표 되지는지 않습니다 (0, 0) 및 컨트롤을 포함 하는 컨트롤 컨테이너에 대 한 전달 된 디바이스 컨텍스트가 됩니다.
[!참고]
반드시 해당 수정 내용을 OnDraw 되는 사각형의 왼쪽된 위 좌표가에 종속 되지 않습니다 (0, 0) 사용자 그리는 사각형 내 에서만 전달 하 고 OnDraw.사각형의 영역을 넘어 그릴 경우 예기치 않은 결과가 발생할 수 있습니다.
기본 구현에서는 ActiveX MFC 컨트롤 마법사는 컨트롤 구현 파일에 의해 제공 (.CPP) 표시 아래의 흰색 브러시로 사각형을 칠하고 타원을 현재 배경색으로 채웁니다.
void CMyAxUICtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
// TODO: Replace the following code with your own drawing code.
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
}
[!참고]
컨트롤을 그리는 경우 가정으로 전달 되는 장치 컨텍스트의 상태를 확인 해야 해당 pdc 매개 변수에 OnDraw 함수.가끔 디바이스 컨텍스트는 컨테이너 응용 프로그램에서 제공 하며 반드시 기본 상태로 초기화 되지 않습니다.특히 명시적으로 펜, 브러시, 색, 글꼴 및 그리기 코드에 따라 달라 집니다 다른 자원을 선택 합니다.
그리기 코드 최적화
컨트롤이 성공적으로 자체 페인팅 되 면 다음 단계를 최적화 하는 것은 OnDraw 함수.
기본 구현은 ActiveX 컨트롤 그리기의 전체 컨트롤 영역을 그립니다.이 간단한 컨트롤의 경우 충분 하지만 전체 컨트롤 대신 업데이트가 필요한 부분은 다시 했습니다 경우에 대부분의 컨트롤을 다시 그리는 속도 수 있습니다.
OnDraw 전달 하 여 손쉽게 최적화 함수를 제공 rcInvalid, 다시 그려야 하는 컨트롤의 사각형 영역입니다.이 영역에는 전체 컨트롤 영역 보다 일반적으로 더 작은 그리기 프로세스 속도를 사용 합니다.
메타 파일을 사용 하 여 컨트롤 그리기
대부분에서의 pdc 매개 변수는 OnDraw 함수 화면 디바이스 컨텍스트 (DC)를 가리키는.그러나 이미지 컨트롤 또는 인쇄 미리 보기 세션 동안 인쇄할 경우 렌더링을 위해 받는 DC는 "메타 파일 DC" 라고 하는 특수 한 종류입니다.즉시 받은 요청을 처리 하는 화면 DC와 달리, 메타 파일 DC 나중에 재생 요청을 저장 합니다.일부 컨테이너 응용 프로그램 디자인 모드일 때 DC 메타 파일을 사용 하 여 컨트롤 이미지를 렌더링 하도록 선택할 수도 있습니다.
메타 파일 그리기 요청 컨테이너 두 인터페이스 함수를 통해 수행할 수 있습니다: IViewObject::Draw (이 함수를 메타 비-드로잉 파일에 대 한 호출할 수 있습니다) 및 IDataObject::GetData.메타 파일 DC 전달 된 매개 변수 중 하나로 때 MFC 프레임 워크 호출 COleControl::OnDrawMetafile.가상 멤버 함수 이므로 모든 특수 처리를 수행 하는 컨트롤 클래스에서이 함수를 재정의 합니다.기본 동작은 호출 COleControl::OnDraw.
컨트롤에서 화면과 메타 파일 디바이스 컨텍스트를 그릴 수 있는지 확인 하려면 화면 및 메타 파일 DC 모두에서 지원 되는 멤버 함수에만 사용 해야 합니다.좌표계는 픽셀 단위로 측정 되지 않을 수도 없습니다 유의 하십시오.
때문에 기본 구현의 OnDrawMetafile 호출 컨트롤의 OnDraw 기능, 사용자 재정의 하지 않으면 메타 파일 및 화면 디바이스 컨텍스트를 적합 하는 멤버 함수만 사용 OnDrawMetafile.다음의 하위 집합을 나열 합니다. CDC 멤버 함수는 메타 파일 및 화면 디바이스 컨텍스트 모두에서 사용할 수 있습니다.이러한 함수에 대 한 자세한 내용은 클래스를 참조 하십시오. CDC 에 있는 MFC 참조.
호 |
BibBlt |
현 |
---|---|---|
Ellipse |
이스케이프 |
ExcludeClipRect |
ExtTextOut |
FloodFill |
IntersectClipRect |
LineTo |
MoveTo |
OffsetClipRgn |
OffsetViewportOrg |
OffsetWindowOrg |
PatBlt |
Pie |
Polygon |
Polyline |
PolyPolygon |
RealizePalette |
RestoreDC |
RoundRect |
SaveDC |
ScaleViewportExt |
ScaleWindowExt |
SelectClipRgn |
SelectObject |
SelectPalette |
SetBkColor |
SetBkMode |
SetMapMode |
SetMapperFlags |
SetPixel |
SetPolyFillMode |
SetROP2 |
SetStretchBltMode |
SetTextColor |
SetTextJustification |
SetViewportExt |
SetViewportOrg |
SetWindowExt |
SetWindowORg |
StretchBlt |
TextOut |
|
뿐만 아니라 CDC 멤버 함수를 메타 파일 DC에서 호환 되는 여러 가지 다른 기능입니다.여기에 CPalette::AnimatePalette, CFont::CreateFontIndirect, 고의 세 멤버 함수 CBrush: CreateBrushIndirect, CreateDIBPatternBrush, 및 CreatePatternBrush.
메타 파일에 기록 되지 않습니다 함수입니다: DrawFocusRect, DrawIcon, DrawText, ExcludeUpdateRgn, FillRect, FrameRect, GrayString, InvertRect, ScrollDC, 및 TabbedTextOut.메타 파일 DC 장치에 실제로 연결 되어 있지 않습니다 때문에 SetDIBits, GetDIBits 및 CreateDIBitmap 메타 파일 DC를 사용할 수 없습니다.SetDIBitsToDevice 및 Stretchdibits는 메타 파일 DC 대상으로 사용할 수 있습니다.CreateCompatibleDC, CreateCompatibleBitmap, 및 CreateDiscardableBitmap 메타 파일 DC 의미 하지 않습니다.
메타 파일 DC를 사용할 때 고려해 야 할 또 다른 사항은 좌표계는 픽셀 단위로 측정 되지 않을 수도 없습니다입니다.사각형에 맞게 그리기 코드를 조정 해야 모두 전달이 이유로 OnDraw 에 있는 rcBounds 매개 변수.이 때문에 외부 컨트롤 방지 rcBounds 컨트롤의 창 크기를 나타냅니다.
컨트롤에 대 한 메타 파일 렌더링을 구현한 후에 메타 파일을 테스트 하려면 테스트 컨테이너를 사용 합니다.테스트 컨테이너에 액세스하는 방법에 대한 자세한 내용은 Test Container를 사용하여 속성 및 이벤트 테스트를 참조하십시오.
Test Container를 사용 하 여 컨트롤의 메타 파일을 테스트 하려면
테스트 컨테이너의 편집 메뉴를 클릭 새 컨트롤 삽입.
에 새 컨트롤 삽입 상자, 컨트롤을 선택 및 클릭 확인.
컨트롤 테스트 컨테이너에 표시 됩니다.
에 컨트롤 메뉴를 클릭 메타 파일 그리기.
별도 창에는 메타 파일에 표시 되는 나타납니다.확장 컨트롤의 메타 파일에 미치는 영향을 보려면이 창의 크기를 변경할 수 있습니다.언제 든 지이 창을 닫겠습니다.