이 노트에서는 자체 그리기 사용자 정의 컨트롤에 대 한 MFC 지원을 설명 합니다. 동적 서브클래싱도 설명 하 고 있습니다. HWNDs 대 CWnd 개체의 소유권에 대 한 일반적인 조언을 제시합니다。
CTRLTEST MFC 샘플 응용 프로그램은 이러한 기능 중 많은 보여 줍니다. MFC 일반 샘플에 대 한 소스 코드를 참조 하십시오 CTRLTEST 및 온라인 도움말。
소유자 그리기 컨트롤/메뉴
Windows "소유자 그리기" 컨트롤 및 메뉴에 대 한 지원을 제공합니다. 이러한 컨트롤이 나 메뉴의 동작과 모양을 사용자 지정할 수 있는 컨트롤이 나 메뉴의 부모 창에 보내는 윈도우 메시지는。
MFC 메시지 맵 항목 소유자 그리기를 직접 지원:
CWnd에 이러한 무시할 수 있습니다-파생 클래스 (일반적으로 대화 상자 또는 주 프레임 창) 소유자 그리기 동작을 구현 하려면。
이 방법은 재사용 가능한 코드를 리드 하지 않습니다. 두 개의 유사한 컨트롤이 두 개의 서로 다른 대화 상자에 있는 두 위치에서 사용자 지정 컨트롤 동작을 구현 해야 합니다. 이 문제를 해결 하는 자체 그리기 컨트롤 MFC 지원 아키텍처。
자체 그리기 컨트롤 및 메뉴
MFC 표준 소유자 그리기 메시지에 대 한 기본 구현 ( CWnd CMenu에서)을 제공합니다. 이 기본 구현은 소유자 그리기 매개 변수 해독 하 고 소유자 그리기 메시지를 컨트롤 하거나 메뉴를 위임 합니다. 이 이라고 "self-draw" 컨트롤 또는 소유자 창에 메뉴 클래스에서 그리기 (/ 측정/비교) 코드는 이후。
이 기능을 사용 하면 "소유자 그리기" 의미론을 사용 하 여 컨트롤을 표시 하는 재사용 가능한 컨트롤 클래스를 만들 수 있습니다. Control 클래스에서 컨트롤이 아니라 컨트롤의 소유자 그리기에 대 한 코드가입니다. 이것은 사용자 지정 컨트롤 프로그래밍 개체 지향 접근。
CButton:DrawItem(LPDRAWITEMSTRUCT);
nbsp;????? / /이 버튼을 무승부(&N)
CMenu:MeasureItem(LPMEASUREITEMSTRUCT);
nbsp;????? / /이 메뉴에 있는 항목의 크기를 측정
CMenu:DrawItem(LPDRAWITEMSTRUCT);
?????? / /이 메뉴 항목을 그리기(&N)
CListBox:MeasureItem(LPMEASUREITEMSTRUCT);
nbsp;????? / /이 목록 상자에 있는 항목의 크기를 측정
CListBox:DrawItem(LPDRAWITEMSTRUCT);
?????? / /이 목록 상자에서 항목을 그리기
CListBox:CompareItem(LPCOMPAREITEMSTRUCT);
?????? / / 만약이 목록 상자에 있는 두 항목을 비교 LBS_SORT
CListBox:DeleteItem(LPDELETEITEMSTRUCT);
?????? / /이 목록 상자에서 항목 삭제(&N)
CComboBox:MeasureItem(LPMEASUREITEMSTRUCT);
nbsp;????? / /이 콤보 상자에 있는 항목의 크기를 측정
CComboBox:DrawItem(LPDRAWITEMSTRUCT);
?????? / /이 콤보 상자에서 항목을 그리기
CComboBox:CompareItem(LPCOMPAREITEMSTRUCT);
?????? / / 만약이 콤보 상자에 있는 두 항목을 비교 CBS_SORT
CComboBox:DeleteItem(LPDELETEITEMSTRUCT);
?????? / /이 콤보 상자에서 항목 삭제(&N)
소유자 그리기에 대 한 내용은 구조 (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCT및 DELETEITEMSTRUCT)를 참조 하십시오 CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareItem및 CWnd::OnDeleteItem 에 대 한 MFC 설명서 각각。
자체 그리기 컨트롤 및 메뉴 사용
MeasureItem 및 DrawItem 멤버 함수를 재정의 해야 합니다 자체 그리기 메뉴에 대 한。
목록 상자와 콤보 상자를 self-drawing에 대 한 MeasureItem 및 DrawItem를 재정의 해야 합니다. OWNERDRAWVARIABLE 스타일 대화 서식 파일에 지정 해야 합니다 (LBS_OWNERDRAWVARIABLE 및 CBS_OWNERDRAWVARIABLE 각각). OWNERDRAWFIXED 스타일 자체 그리기 컨트롤 목록 상자에 연결 하기 전에 고정된 항목 높이 결정 됩니다 이후 항목을 self-drawing와 함께 작동 하지 않습니다. (승리 3.1 멤버 함수 CListBox::SetItemHeight 및 CComboBox::SetItemHeight 이 제한을 해결 하는 데 사용 될 수 있습니다.)
또한, note OWNERDRAWVARIABLE 스타일 스위칭 NOINTEGRALHEIGHT 스타일 적용 됩니다. 때문에 필수적인 높이 가변 크기 항목 INTEGRALHEIGHT 의 기본 스타일은 무시 되 고 컨트롤은 항상 NOINTEGRALHEIGHT컨트롤을 계산할 수 있습니다. 귀하의 항목 높이 수정 항목 크기의 필수적인 승수 되도록 컨트롤 크기를 지정 하 여 그려지는에서 일부 항목을 방지할 수 있습니다.
목록 상자 및 콤보 상자 정렬 스타일과 self-drawing에 대 한 (LBS_SORT 및 CBS_SORT 각각), CompareItem 멤버 함수를 재정의 해야 합니다。
목록 상자와 콤보 상자를 self-drawing에 대 한 DeleteItem 은 일반적으로 무시 되지 않습니다. DeleteItem 추가 메모리 또는 기타 리소스가 각 목록 상자 또는 콤보 상자 항목을 저장 하는 경우 재정의 될 수 있습니다.
자체 그리기 컨트롤/메뉴의 예
MFC 일반 샘플 CTRLTEST self-draw 메뉴 (색 표시)와 self-draw 목록 상자 (또한 보여주는 색)의 샘플을 제공 합니다.
자체 그리기 버튼의 가장 일반적인 예는 비트맵 단추 (다른 상태에 대 한 하나, 둘, 또는 세 개의 비트맵 이미지를 보여 주는 단추). 이것은 MFC 클래스 CBitmapButton 에서 제공。
동적 하위 클래스화
서브클래싱 다른 WndProc 창 WndProc 교체 하 고 기본 (슈퍼) 기능에 대 한 오래 된 WndProc 호출에 대 한 Windows 용어입니다.
이 c + + 클래스 파생 (c + + 용어 사용 단어 "기본" 및 "하위" 및 "슈퍼" Windows 개체 모델 사용 하는 동안에 "파생")와 혼동 해서는 안. C + + 동적 서브클래싱 유사한 기능을 지원 하지 않는 제외 하 고 MFC 및 Windows 서브클래싱와 c + + 파생은 기능적으로 매우 유사 하며,。
CWnd 클래스 ( CWnd에서 파생 된) c + + 개체와 Windows 창 개체 (일컬어 HWND) 사이의 연결을 제공。
세 가지 일반적인 이러한 관련:
이 마지막 경우 멤버 함수 함께 이루어집니다.:
두 루틴 기존 windows HWND CWnd 개체를 연결합니다. SubclassWindow HWND 를 직접 걸리고 SubclassDlgItem 컨트롤 ID와 부모 창 (일반적으로 대화 상자)를 사용 하는 도우미입니다. SubclassDlgItem c + + 개체 대화 서식 파일에서 만든 대화 상자 컨트롤에 연결을 위해 설계 되었습니다.
참조 하십시오에서 SubclassWindow 및 SubclassDlgItem 을 사용 하는 경우의 몇 가지 예 CTRLTEST 예제。
기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)