다음을 통해 공유


MFC 컨트롤을 ActiveX: Windows 컨트롤 서브클래싱

이 문서는 ActiveX 컨트롤을 만들려면 공용 Windows 컨트롤 서브클래싱에 대 한 프로세스를 설명 합니다.기존 Windows 서브클래싱 제어는 ActiveX 컨트롤을 개발 하는 빠른 방법입니다.새 컨트롤 그리기 및 마우스 클릭에 응답 하는 것과 같은 서브클래싱된 Windows 컨트롤의 기능을 갖습니다.ActiveX는 MFC 컨트롤 샘플 단추 Windows 컨트롤 서브클래싱 예입니다.

Windows 컨트롤을 서브클래싱하려면 다음 작업을 수행 합니다.

  • Colecontrol의 IsSubclassedControl 및 PreCreateWindow 멤버 함수를 재정의 합니다.

  • OnDraw 멤버 함수 수정

  • 컨트롤에 리플렉션된 ActiveX 제어 메시지 (OCM)를 처리 합니다.

    [!참고]

    사용 서브클래싱 할 컨트롤을 선택 하면이 작업의 대부분 ActiveX 컨트롤 마법사가 완료 되는 부모 창 클래스를 선택 드롭다운 목록에는 제어 설정 페이지.

컨트롤 서브클래싱에 대 한 자세한 내용은 기술 자료 문서를 q243454을 참조 하십시오.

IsSubclassedControl 및 PreCreateWindow 재정의

재정의할 수 PreCreateWindowIsSubclassedControl, 코드의 다음 줄을 추가 protected 선언 구역:

    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    BOOL IsSubclassedControl();

컨트롤 구현 파일에서 (.CPP) 두 개의 재정의 된 함수를 구현 하는 코드의 다음 줄을 추가 합니다.

// CMyAxSubCtrl::PreCreateWindow - Modify parameters for CreateWindowEx

BOOL CMyAxSubCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.lpszClass = _T("BUTTON");
    return COleControl::PreCreateWindow(cs);
}

// CMyAxSubCtrl::IsSubclassedControl - This is a subclassed control

BOOL CMyAxSubCtrl::IsSubclassedControl()
{
    return TRUE;
}

이 예에서 Windows 단추 컨트롤, 통지에 지정 된 PreCreateWindow.그러나 모든 표준 Windows 컨트롤을 서브클래싱 할 수 있습니다.표준 Windows 컨트롤에 대 한 자세한 내용은 컨트롤.

Windows 컨트롤 서브클래싱 되 면 특정 창 스타일 지정을 수행할 수 있습니다 (WS_) 또는 확장 창 스타일 (WS_EX_) 컨트롤의 창을 만드는 데 사용할 수 있는 플래그입니다.이러한 매개 변수에 대해 값을 설정할 수 있습니다는 PreCreateWindow 멤버 함수를 수정 하 여 해당 cs.stylecs.dwExStyle 구조 필드.이러한 필드에 대 한 수정 사용 하 여 변경 해야는 OR 클래스에서 설정 된 기본 플래그를 유지 하는 작업을 COleControl.예를 들어, BUTTON 컨트롤 서브클래싱 되어 컨트롤 및 컨트롤 확인란으로 표시 하려는 경우 구현에 다음 코드 줄을 삽입 CSampleCtrl::PreCreateWindow에서 return 문 앞:

cs.style |= BS_CHECKBOX;

이 작업이 추가 BS_CHECKBOX 플래그를 스타일 기본 스타일 플래그를 두고 (WS_CHILD) 클래스의 COleControl 그대로.

OnDraw 멤버 함수 수정

서브클래싱된 컨트롤 해당 Windows 컨트롤로 동일한 모양을 유지 하려면 원하는 경우는 OnDraw 멤버 함수에 컨트롤에 대 한 호출을 포함 해야는 DoSuperclassPaint 멤버 함수는 다음 예제에서와 같이:

void CMyAxSubCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
    if (!pdc)
        return;

    DoSuperclassPaint(pdc, rcBounds);
}

DoSuperclassPaint 에 의해 구현 된 멤버 함수를 COleControl, Windows 컨트롤의 창 프로시저를 사용 하 여 지정 된 디바이스 컨텍스트, 경계 사각형 내에 컨트롤을 그립니다.심지어 사용 하지 않으면이 컨트롤이 표시 됩니다.

[!참고]

DoSuperclassPaint 멤버 함수는 디바이스 컨텍스트로 전달 될 수 있도록 해당 컨트롤 형식에만 함께 동작 하지는 wParamWM_PAINT 메시지.이 표준 Windows 컨트롤 중 일부도 SCROLLBAR단추, 및 모든 일반 컨트롤.이 동작이 지원 되지 않는 컨트롤의 경우, 비활성 컨트롤을 제대로 표시 하는 코드를 직접 제공 해야 합니다.

리플렉션된 창 메시지 처리

Windows 컨트롤은 일반적으로 특정 창 메시지를 해당 부모 창에 보냅니다.이러한 일부 메시지 등 WM_COMMAND, 사용자 동작에 대 한 알림을 제공 합니다.등과 같은 WM_CTLCOLOR, 부모 창에서 정보를 가져오는 데 사용 됩니다.ActiveX 컨트롤은 일반적으로 다른 방법을 사용 하 여 부모 창에 전달합니다.알림 이벤트 (이벤트 알림 보내기) 발생 시 킴으로써 전달 되 고 컨테이너의 앰비언트 속성에 액세스 하 여 컨트롤 컨테이너에 대 한 정보를 얻습니다.이러한 통신 기술이 있기 때문에 ActiveX 컨트롤 컨테이너 컨트롤에서 전송 된 모든 창 메시지를 처리 하도록 예상 되지 않습니다.

컨테이너 서브클래싱된 Windows 컨트롤에서 보낸 창 메시지를 수신 하지 못하게 하려면 COleControl 부모 컨트롤의 역할을 하는 추가 창을 만듭니다."리플렉터" 라고 하는이 추가 창은 Windows 서브 클래스 제어 하 고 동일한 크기와 위치가 컨트롤 창으로가 ActiveX 컨트롤 에서만 생성 됩니다.리플렉터 창은 특정 창 메시지를 가로채 고이 컨트롤을 다시 보냅니다.컨트롤을 자체 창 프로시저에서 다음 (예를 들어, 이벤트를 발생 시키는)는 ActiveX 컨트롤에 대 한 적절 한 조치를 취 함으로써 리플렉션된 메시지를 처리할 수 있습니다.참조 반영 하는 창 메시지 Id 가로채 windows 목록은 메시지 및 해당 메시지를 반영 합니다.

필요가 스스로 메시지 리플렉션을 수행 하는 ActiveX 컨트롤 컨테이너를 디자인할 수 있습니다 COleControl 반영자 창 및 런타임 서브클래싱된 Windows 컨트롤에 대 한 오버 헤드를 줄여 만들 수 있습니다.COleControl컨테이너 MessageReflect 앰비언트 속성의 값을 검사 하 여이 기능을 지원 하는지 여부를 감지 TRUE.

리플렉션된 창 메시지를 처리 하기 위해 제어 메시지 맵에 엔트리를 추가 하 고 처리기 함수를 구현 합니다.클래스 뷰 리플 렉 트 된 메시지의 표준 Windows에 의해 정의 되는 메시지 집합에 없기 때문에 이러한 메시지 처리기 추가 지원 하지 않습니다.그러나 처리기를 직접 추가 하는 것은 어렵지 않습니다.

추가할 리플렉션된 창 메시지에 대 한 메시지 처리기 수동으로 다음을 수행 합니다.

  • 컨트롤 클래스에서.H 파일에서 처리기 함수를 선언 합니다.함수의 반환 형식으로 있어야 합니다 LRESULT 형식의 두 매개 변수를 WPARAMLPARAM, 각각.예를 들면 다음과 같습니다.

    class CMyAxSubCtrl : public COleControl
    {
    
    
    ...
    
    
    protected:
        LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam);
    };
    
  • 컨트롤 클래스에서.CPP 파일, 추가 된 ON_MESSAGE 메시지 맵에 엔트리.이 항목의 매개 변수를 처리기 함수의 이름과 메시지 식별자 여야 합니다.예를 들면 다음과 같습니다.

    BEGIN_MESSAGE_MAP(CMyAxSubCtrl, COleControl)
        ON_MESSAGE(OCM_COMMAND, &CMyAxSubCtrl::OnOcmCommand)
    END_MESSAGE_MAP()
    
  • 또한 해당 합니다.CPP 파일 구현에서 OnOcmCommand 리플 렉 트 된 메시지를 처리 하는 멤버 함수입니다.WParamlParam 매개 변수를 같은 원래 메시지 창입니다.

메시지가 처리 되는 방법의 예가 반영에 대 한 ActiveX MFC 컨트롤 샘플을 참조 하십시오. 단추.이 방법을 보여 줍니다는 OnOcmCommand 감지 하는 처리기를 BN_CLICKED 알림 코드 및 응답으로 발사 (보내기) 클릭 이벤트.

참고 항목

개념

MFC 컨트롤을 ActiveX