다음을 통해 공유


TN014: 사용자 지정 컨트롤

이 참고가 컨트롤을 사용자 지정 하 고 자체 그리기에 대 한 MFC 지원을 설명합니다.또한 동적 서브클래싱에 설명 하 고 사이의 관계를 설명 CWnd 개체 및 HWNDs.

MFC 샘플 응용 프로그램 CTRLTEST 여러 사용자 지정 컨트롤을 사용 하는 방법을 보여 줍니다.MFC 일반 샘플에 대 한 소스 코드를 참조 하십시오. CTRLTEST 및 온라인 도움말.

소유자 그리기 컨트롤/메뉴

Windows를 Windows 메시지를 사용 하 여 소유자 그리기 컨트롤 및 메뉴에 대 한 지원을 제공 합니다.메뉴 또는 컨트롤의 부모 창 이러한 메시지와 호출 함수에 대 한 응답을 받습니다.메뉴 또는 소유자 그리기 컨트롤의 동작과 모양을 사용자 지정 하려면이 함수를 재정의할 수 있습니다.

소유자 그리기 직접 지 원하는 MFC 다음 함수를 사용 합니다.

이러한 함수를 재정의 하 여 사용자 CWnd 동작 사용자 지정 그리기를 구현 하는 클래스를 파생 합니다.

이 방법은 재사용 가능한 코드를 발생 하지 않습니다.두 비슷한 컨트롤에 서로 다른 둘 경우 CWnd 클래스, 두 위치에서 사용자 지정 컨트롤 동작을 구현 해야 합니다.컨트롤이 MFC 지원 아키텍처 자체 그리기이 문제가 해결 되었습니다.

Self-Draw 컨트롤 및 메뉴

MFC 기본 구현을 제공 합니다 (에 있는 CWndCMenu 클래스) 표준 소유자 그리기 메시지.이 기본 구현은 소유자 그리기 매개 변수를 디코딩하고 소유자 그리기 메시지를 컨트롤 또는 메뉴를 위임 합니다.클래스 소유자 창에서 메뉴, 컨트롤의 그리기 코드 존재 하기 때문에 self-draw 이라고 합니다.

Self-draw 컨트롤을 사용 하 여 소유자 그리기 기능을 사용 하 여 컨트롤을 표시할 컨트롤을 재사용 가능한 클래스를 만들 수 있습니다.컨트롤을 그리기 위한 코드 컨트롤 클래스에 없는 부모입니다.이 사용자 지정 컨트롤 프로그래밍 개체 지향 접근 방식입니다.다음 목록은 함수의 self-draw 클래스에 추가 합니다.

  • Self-draw 단추에 대 한:

    CButton:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw this button
    
  • Self-draw 메뉴:

    CMenu:MeasureItem(LPMEASUREITEMSTRUCT);
            // insert code to measure the size of an item in this menu
    CMenu:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw an item in this menu
    
  • Self-draw 목록 상자:

    CListBox:MeasureItem(LPMEASUREITEMSTRUCT);
            // insert code to measure the size of an item in this list box
    CListBox:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw an item in this list box
    
    CListBox:CompareItem(LPCOMPAREITEMSTRUCT);
            // insert code to compare two items in this list box if LBS_SORT
    CListBox:DeleteItem(LPDELETEITEMSTRUCT);
            // insert code to delete an item from this list box
    
  • Self-draw 콤보 상자에 대 한:

    CComboBox:MeasureItem(LPMEASUREITEMSTRUCT);
            // insert code to measure the size of an item in this combo box
    CComboBox:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw an item in this combo box
    
    CComboBox:CompareItem(LPCOMPAREITEMSTRUCT);
            // insert code to compare two items in this combo box if CBS_SORT
    CComboBox:DeleteItem(LPDELETEITEMSTRUCT);
            // insert code to delete an item from this combo box
    

소유자 그리기 구조에 대 한 자세한 내용은 (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCT, 및 DELETEITEMSTRUCT)에 대 한 MFC 설명서를 참조 하십시오. CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareItem, 및 CWnd::OnDeleteItem 각각.

Self-draw 컨트롤 및 메뉴 사용

Self-draw 메뉴를 모두 재정의 해야는 OnMeasureItemOnDrawItem 방법입니다.

Self-draw 목록 상자 및 콤보 상자에 대 한 재정의 해야 OnMeasureItemOnDrawItem.지정 해야는 LBS_OWNERDRAWVARIABLE 스타일 목록 상자에 대 한 또는 CBS_OWNERDRAWVARIABLE 스타일 콤보 상자에서 대화 상자 템플릿을.OWNERDRAWFIXED 스타일 작동 하지 않습니다 self-draw 항목을 self-draw 컨트롤 목록 상자에 연결 하기 전에 고정된 항목 높이 결정 하기 때문에.(사용할 수 있는 메서드 CListBox::SetItemHeightCComboBox::SetItemHeight 이 제한을 극복할 수 있습니다.)

전환 된 OWNERDRAWVARIABLE 스타일 적용 하 여 시스템을 강제로 됩니다는 NOINTEGRALHEIGHT 컨트롤 스타일.컨트롤 변수 크기의 정수는 높이 계산할 수 없습니다 때문에 항목의 기본 스타일을 INTEGRALHEIGHT 무시 됩니다 항상 컨트롤인 NOINTEGRALHEIGHT.항목 높이가 고정 되어 있으면 컨트롤 크기는 정수 보너스 항목 크기를 지정 하 여 그릴에서 일부 항목을 방지할 수 있습니다.

목록 상자 및 콤보 상자와 self-drawing에 LBS_SORT 또는 CBS_SORT 해야 재정의 스타일은 OnCompareItem 메서드.

목록 상자, 콤보 상자, self-drawing에 대 한 OnDeleteItem 일반적으로 재정의 됩니다.재정의 하 여 OnDeleteItem 특수 처리를 수행 하려는 경우.각 목록 상자 또는 콤보 상자 항목으로 추가 메모리 또는 기타 리소스에 저장 될 때 위치 적용 가능한 것이 하나의 사례가입니다.

컨트롤 및 메뉴 Self-Drawing의 예

MFC 일반 샘플 CTRLTEST self-draw 목록 상자 및 self-draw 메뉴의 샘플을 제공 합니다.

가장 대표적인 예로 자체 그리기 단추 비트맵 단추입니다.비트맵 단추 하나, 둘 또는 세 개의 비트맵 이미지의 다양 한 상태를 표시 하는 단추가입니다.이 예제는 MFC 클래스에 제공 됩니다 CBitmapButton.

동적 서브클래싱

때때로 이미 존재 하는 개체의 기능을 변경 합니다.앞의 예제를 작성 하기 전에 컨트롤을 사용자 지정할 수 필요 합니다.동적 서브클래싱 이미 작성 된 컨트롤을 사용자 지정할 수 있습니다.

서브클래싱 되 교체에 대 한 Windows 라는 용어는 WndProc 의 창과 사용자 지정된 WndProc 및 이전 호출 WndProc 기본 기능에 대 한.

이 C++ 클래스 파생으로 혼동 해서는 안됩니다.설명이, C++ 용어에 대 한 기본 클래스 및 파생 클래스 에 유사 슈퍼 및 서브 클래스 Windows 개체 모델에서.C + + 파생 MFC 및 Windows 서브클래싱에는 C++ 동적 서브클래싱을 지원 하지 않는 점을 제외 하 고 기능적으로 유사한입니다.

CWnd 클래스 C++ 개체 간에 연결을 제공 합니다 (파생 CWnd)와 Windows 창 개체 (라고 하는 HWND).

이러한 관련 된 세 가지 일반적인 방법에는 여러 가지 있습니다.

  • CWnd만들고 있는 HWND.파생 된 클래스를 작성 하 여 파생된 클래스의 동작을 수정할 수 있습니다 CWnd.HWND 응용 프로그램을 호출할 때 만들어지는 CWnd::Create.

  • 응용 프로그램 연결을 CWnd 기존 HWND.기존 창 동작 수정 되지 않습니다.위임의 경우 이며 호출 하 여 연결 된 CWnd::Attach 별칭 기존 HWNDCWnd 개체입니다.

  • CWnd기존에 연결 된 HWND 및 파생된 클래스의 동작을 수정할 수 있습니다.우리는 동작 및 런타임에 Windows 개체의 클래스를 변경 해야 하므로 서브클래싱 동적 호출 됩니다.

메서드를 사용 하 여 동적 서브클래싱을 얻을 수 있습니다 CWnd::SubclassWindowCWnd::SubclassDlgItem.

연결할 두 루틴은 CWnd 기존 개체 HWND.SubclassWindow되는 HWND 직접.SubclassDlgItem부모 창과 컨트롤 ID를 사용 하는 도우미 함수가입니다.SubclassDlgItemC++ 개체 대화 상자 템플릿에서 만든 대화 상자 컨트롤에 대 한 연결을 위해 설계 되었습니다.

참조는 CTRLTEST 예를 들어 사용 하는 경우의 몇 가지 예제 SubclassWindowSubclassDlgItem.

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트