다음을 통해 공유


TN062: 메시지 리플렉션 Windows 컨트롤에 대 한

[!참고]

온라인 설명서의을 처음 포함 되었습니다 때문 다음 기술 참고 업데이트 되지 않았습니다.따라서 일부 절차 및 항목 오래 되었거나 잘못 된 수 있습니다.최신 정보는 온라인 설명서 색인에서 관심 있는 주제에 대해 검색 하는 것이 좋습니다.

이 기술 노트 메시지 리플렉션, MFC 4.0의 새로운 기능에 설명합니다.간단한 메시지 리플렉션을 사용 하 여 다시 사용할 수 있는 컨트롤을 만드는 방법을 포함 되어 있습니다.

이 기술 노트는 ActiveX 컨트롤 (이전의 OLE 컨트롤 이라고 함)에 적용 되는 메시지 리플렉션을 다루지 않습니다.문서를 참조 하십시오 ActiveX 컨트롤: Windows 컨트롤 서브클래싱.

메시지 리플렉션 무엇입니까?

Windows 컨트롤 자주 해당 부모 창에 알림 메시지를 보냅니다.예를 들어, 대부분의 컨트롤 색 컨트롤 알림 메시지를 보내기 (WM_CTLCOLOR 또는 그 변종 중 하나) 부모 부모 컨트롤의 배경을 그리기 위한 브러시를 제공할 수 있도록 합니다.

Windows 및 MFC 버전 4.0 이전에 부모 창, 대화 상자에서 이러한 메시지를 처리 하는 데 담당 합니다.이 메시지를 처리 하는 코드는 부모 창 클래스에서 해야 한다고 해당 메시지를 처리 하는 데 필요한 모든 클래스를 복제할 수 있음을 의미 합니다.위와 같은 경우, 컨트롤과 함께 사용자 지정 배경 원하는 모든 대화 상자 색 컨트롤 알림 메시지를 처리 해야 합니다.컨트롤 클래스는 자체 배경색을 처리 합니다 쓸 수 있는 경우 코드를 다시 사용 하는 것이 훨씬 쉽게 됩니다.

MFC 4.0에는 이전 메커니즘은 여전히 작동-부모 windows 알림 메시지를 처리할 수 있습니다.그러나 뿐만 아니라, MFC 4.0 재사용 "메시지 리플렉션" 이라는 기능을 제공 하 여 쉽게 이러한 알림 메시지 자식 컨트롤 창 또는 부모 창, 또는 둘 다에서 처리 될 수 있습니다.컨트롤 배경 색 예제에서 반사를 처리 하 여 자신의 배경색을 설정 하는 컨트롤 클래스는 이제 작성할 수 있습니다 WM_CTLCOLOR 메시지-부모에 의존 하지 않고.(메시지 리플렉션 MFC에서 구현 되므로 Windows에서 부모 창 클래스에서 파생 되어야 합니다 않는 것을 참고 CWnd 메시지 리플렉션 작업에 대 한 합니다.)

이전 버전의 MFC 하지 메시지 리플렉션 비슷한 가상 함수를 제공 하 여 소유자가 그린 목록 상자에 대 한 메시지와 같은 몇 가지 메시지 (WM_DRAWITEM등).새 메시지 리플렉션 메커니즘 일반화 하 고 일관 되 게 됩니다.

메시지 리플렉션 4.0 이전 버전의 MFC에 대해 작성 된 코드와 호환 됩니다.

자신의 처리기에서 기본 클래스 처리기 함수를 호출 하지 않는 경우 다양 한 메시지를 부모 창 클래스에서 재정의 되는 특정 메시지에 대 한 처리기를 제공한 경우 같은 메시지에 대해 메시지 처리기 반영.예를 들어, 처리 하 여 WM_CTLCOLOR 대화 상자 클래스를 하 여 처리 된 리플 렉 트 된 메시지 처리기를 재정의 합니다.

부모 창 클래스를 특정에 대 한 처리기를 제공 하면 WM_NOTIFY 메시지 또는 범위를 WM_NOTIFY 메시지 처리기 호출 됩니다만 해당 메시지를 보내는 자식 컨트롤 통해 리플 렉 트 된 메시지 처리기가 없는 경우 ON_NOTIFY_REFLECT().사용 하는 경우 ON_NOTIFY_REFLECT_EX() 메시지 맵에서 메시지 처리기 있거나 부모 창에서 메시지를 처리할 수 없습니다.처리기에서 반환 하는 경우 FALSE를 반환 하는 호출 하는 동안 메시지의 부모에서 처리 됩니다 TRUE 처리할 수 있는 부모를 허용 하지 않습니다.리플 렉 트 된 메시지 전에 알림 메시지 처리 되는 참고.

경우는 WM_NOTIFY 메시지를 보낼, 컨트롤 처리에 있는 첫 번째 기회가 제공 됩니다.리플렉션된 메시지를 전송 하는 경우 부모 창 처리에 있는 첫 번째 기회가 있고 컨트롤 리플 렉 트 된 메시지를 받게 됩니다.이렇게 하려면 해당 처리기 함수 및 컨트롤의 클래스 메시지 맵에서 해당 항목을 해야 합니다.

리플 렉 트 된 메시지에 대해 메시지 맵 매크로 대 한 정기적인 알림 약간 다릅니다:가 _REFLECT 의 일반적인 이름에 추가 합니다.예를 들어 처리 하는 WM_NOTIFY 메시지 매크로 사용 하는 부모, ON_NOTIFY 부모의 메시지 맵에.자식 컨트롤에 리플렉션된 메시지를 처리할 수 있는 ON_NOTIFY_REFLECT 에서 자식 컨트롤의 메시지 맵 매크로.경우에 따라 매개 변수 역시 다릅니다.클래스 마법사 수 있습니다 일반적으로 메시지 맵 엔트리를 추가 기초 함수 구현에 올바른 매개 변수를 제공 하는 참고.

참조 TN061: ON_NOTIFY WM_NOTIFY 메시지 에 대 한 내용은 새 WM_NOTIFY 메시지입니다.

메시지 맵 엔트리 및 리플 렉 트 된 메시지 처리기 함수 프로토타입

리플 렉 트 컨트롤 알림 메시지를 처리 하려면 아래 표에 나열 된 함수 프로토타입을 확인 하 고 메시지 맵 매크로 사용 합니다.

일반적으로 클래스 마법사 이러한 메시지 맵 엔트리를 추가 하 고 기본 함수 구현을 제공할 수 있습니다.참조 반영 하는 메시지의 메시지 처리기 정의 리플 렉 트 된 메시지 처리기를 정의 하는 방법에 대 한 내용은.

메시지 이름에서 반영된 된 매크로 이름으로 변환 하려면 앞 ON_ 및 추가 _REFLECT.예를 들어, WM_CTLCOLOR 됩니다 ON_WM_CTLCOLOR_REFLECT.(메서드를 반영할 수 있는 메시지를 보려면 반대의 변환 매크로 항목 아래 표에서 마십시오.)

위의 규칙에는 세 가지 예외는 다음과 같습니다.

  • 매크로 대 한 WM_COMMAND 알림을입니다 ON_CONTROL_REFLECT.

  • 매크로 대 한 WM_NOTIFY 반사 되어 ON_NOTIFY_REFLECT.

  • 매크로 대 한 ON_UPDATE_COMMAND_UI 반사 되어 ON_UPDATE_COMMAND_UI_REFLECT.

특별 한 경우에는 위의 각 처리기 멤버 함수 이름을 지정 해야 합니다.다른 경우에 표준 처리기 함수 이름을 사용 해야 합니다.

함수 이름 또는 함수 이름의 의미 매개 변수 및 함수 반환 값 설명 에서 앞에 추가 합니다.예를 들어, CtlColor 설명 되어 OnCtlColor.리플 렉 트 된 메시지 처리기를 여러 부모 창에서 유사한 처리기 보다 적은 매개 변수를 해야합니다.바로 아래의 표에 설명서의 형식 매개 변수 이름과 일치 합니다.

맵 엔트리

함수 프로토타입

ON_CONTROL_REFLECT( wNotifyCode, memberFxn )

afx_msg void memberFxn ( );

ON_NOTIFY_REFLECT( wNotifyCode, memberFxn )

afx_msg void memberFxn ( NMHDR * pNotifyStruct, LRESULT* result );

ON_UPDATE_COMMAND_UI_REFLECT (memberFxn)

afx_msg void memberFxn ( CCmdUI* pCmdUI );

ON_WM_CTLCOLOR_REFLECT)

afx_msg HBRUSH CtlColor ( CDC* pDC, UINT nCtlColor );

ON_WM_DRAWITEM_REFLECT)

afx_msg 무효가 DrawItem (LPDRAWITEMSTRUCTlpDrawItemStruct);

ON_WM_MEASUREITEM_REFLECT)

afx_msg 무효가 MeasureItem (LPMEASUREITEMSTRUCTlpMeasureItemStruct);

ON_WM_DELETEITEM_REFLECT)

afx_msg 무효가 DeleteItem (LPDELETEITEMSTRUCTlpDeleteItemStruct);

ON_WM_COMPAREITEM_REFLECT)

CompareItem afx_msg int (LPCOMPAREITEMSTRUCTlpCompareItemStruct);

ON_WM_CHARTOITEM_REFLECT)

afx_msg int CharToItem ( UINT nKey, UINT nIndex );

ON_WM_VKEYTOITEM_REFLECT)

afx_msg int VKeyToItem ( UINT nKey, UINT nIndex );

ON_WM_HSCROLL_REFLECT)

afx_msg void HScroll ( UINT nSBCode, UINT nPos );

ON_WM_VSCROLL_REFLECT)

afx_msg void VScroll ( UINT nSBCode, UINT nPos );

ON_WM_PARENTNOTIFY_REFLECT)

afx_msg void ParentNotify ( UINT message, LPARAM lParam );

ON_NOTIFY_REFLECTON_CONTROL_REFLECT 매크로가 있는 둘 이상의 개체 (예: 컨트롤 및 부모) 지정 된 메시지를 처리 하도록 허용 하는 변형.

맵 엔트리

함수 프로토타입

ON_NOTIFY_REFLECT_EX( wNotifyCode, memberFxn )

afx_msg BOOL memberFxn ( NMHDR * pNotifyStruct, LRESULT* result );

ON_CONTROL_REFLECT_EX( wNotifyCode, memberFxn )

afx_msg BOOL memberFxn ( );

리플렉션 메시지 처리: 다시 사용할 수 있는 컨트롤의 예

라는 재사용 가능한 컨트롤을 만드는 간단한 예제 CYellowEdit.노란색 배경에 검정 텍스트로 표시 됩니다 제외 컨트롤이 일반 편집 컨트롤 동일한 작동 합니다.쉽게 허용 하는 멤버 함수를 추가할 수 있는 CYellowEdit 다른 색을 표시 하는 컨트롤.

재사용 가능한 컨트롤을 만드는 예제를 실행 하려면

  1. 새 대화 상자에서 기존 응용 프로그램을 만듭니다.자세한 내용은 대화 상자 편집기 항목입니다.

    재사용 가능한 컨트롤을 개발 하는 응용 프로그램이 있어야 합니다.기존 응용 프로그램 사용할 수 없는 경우 응용 프로그램 마법사를 사용 하 여 대화 상자 기반 응용 프로그램을 만듭니다.

  2. 라는 새 클래스를 만들려면 클래스 마법사를 사용 하는 프로젝트와 Visual C++로 로드 CYellowEdit 기반 CEdit.

  3. 세 멤버 변수를 추가 하면 CYellowEdit 클래스입니다.처음 두 될 COLORREF 텍스트 색과 배경색을 보유 하는 변수입니다.세 수는 CBrush 의 배경을 칠할 브러시를 보유 하는 개체입니다.CBrush 개체를 사용 하면 한 번, 단지 그 후에 참조 하는 브러시를 만들려면 및 브러시 자동으로 때 파괴 하는 CYellowEdit 컨트롤 손상 됨.

  4. 생성자는 다음과 같이 작성 하 여 멤버 변수를 초기화 합니다.

    CYellowEdit::CYellowEdit()
    {
       m_clrText = RGB( 0, 0, 0 );
       m_clrBkgnd = RGB( 255, 255, 0 );
       m_brBkgnd.CreateSolidBrush( m_clrBkgnd );
    }
    
  5. 클래스 마법사를 사용 하 여 반사에 대 한 처리기 추가 WM_CTLCOLOR 에 메시지를 CYellowEdit 클래스입니다.Note 처리할 수 있는 메시지 목록에서 메시지 이름 앞에 등호 메시지 반영 되었는지 나타냅니다.이 나오는 반영 하는 메시지의 메시지 처리기 정의.

    클래스 마법사 다음 메시지 맵 매크로 및 스 켈 레 톤 함수를 추가합니다.

    ON_WM_CTLCOLOR_REFLECT()
    
    // Note: other code will be in between....
    
    HBRUSH CYellowEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
       // TODO: Change any attributes of the DC here
    
       // TODO: Return a non-NULL brush if the
       //   parent's handler should not be called
       return NULL;
    }
    
  6. 함수 본문을 다음 코드로 바꿉니다.텍스트 배경색, 텍스트 색, 컨트롤의 나머지 부분에 대 한 배경 색 코드를 지정합니다.

       pDC->SetTextColor( m_clrText );   // text
       pDC->SetBkColor( m_clrBkgnd );   // text bkgnd
       return m_brBkgnd;            // ctl bkgnd
    
  7. 편집 컨트롤을 대화 상자에 만들기 다음 멤버 변수를 연결할 동안 ctrl 키를 누른 채로 편집 컨트롤을 두 번 눌러.멤버 변수 추가 대화 상자에서 변수 이름을 마치고, 다음 "CYellowEdit" 변수 유형에 대 한 범주 "제어"를 선택 합니다.반드시 대화 상자에서 탭 순서를 설정 해야 합니다.또한 헤더 파일을 포함 해야 합니다는 CYellowEdit 헤더 파일 대화 상자를 제어 합니다.

  8. 응용 프로그램을 빌드하고 실행합니다.편집 컨트롤에는 노란 배경색이 적용 됩니다.

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트