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_REFLECT 및 ON_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 다른 색을 표시 하는 컨트롤.
재사용 가능한 컨트롤을 만드는 예제를 실행 하려면
새 대화 상자에서 기존 응용 프로그램을 만듭니다.자세한 내용은 대화 상자 편집기 항목입니다.
재사용 가능한 컨트롤을 개발 하는 응용 프로그램이 있어야 합니다.기존 응용 프로그램 사용할 수 없는 경우 응용 프로그램 마법사를 사용 하 여 대화 상자 기반 응용 프로그램을 만듭니다.
라는 새 클래스를 만들려면 클래스 마법사를 사용 하는 프로젝트와 Visual C++로 로드 CYellowEdit 기반 CEdit.
세 멤버 변수를 추가 하면 CYellowEdit 클래스입니다.처음 두 될 COLORREF 텍스트 색과 배경색을 보유 하는 변수입니다.세 수는 CBrush 의 배경을 칠할 브러시를 보유 하는 개체입니다.CBrush 개체를 사용 하면 한 번, 단지 그 후에 참조 하는 브러시를 만들려면 및 브러시 자동으로 때 파괴 하는 CYellowEdit 컨트롤 손상 됨.
생성자는 다음과 같이 작성 하 여 멤버 변수를 초기화 합니다.
CYellowEdit::CYellowEdit() { m_clrText = RGB( 0, 0, 0 ); m_clrBkgnd = RGB( 255, 255, 0 ); m_brBkgnd.CreateSolidBrush( m_clrBkgnd ); }
클래스 마법사를 사용 하 여 반사에 대 한 처리기 추가 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; }
함수 본문을 다음 코드로 바꿉니다.텍스트 배경색, 텍스트 색, 컨트롤의 나머지 부분에 대 한 배경 색 코드를 지정합니다.
pDC->SetTextColor( m_clrText ); // text pDC->SetBkColor( m_clrBkgnd ); // text bkgnd return m_brBkgnd; // ctl bkgnd
편집 컨트롤을 대화 상자에 만들기 다음 멤버 변수를 연결할 동안 ctrl 키를 누른 채로 편집 컨트롤을 두 번 눌러.멤버 변수 추가 대화 상자에서 변수 이름을 마치고, 다음 "CYellowEdit" 변수 유형에 대 한 범주 "제어"를 선택 합니다.반드시 대화 상자에서 탭 순서를 설정 해야 합니다.또한 헤더 파일을 포함 해야 합니다는 CYellowEdit 헤더 파일 대화 상자를 제어 합니다.
응용 프로그램을 빌드하고 실행합니다.편집 컨트롤에는 노란 배경색이 적용 됩니다.