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

이 기술 노트 메시지 반사를, MFC 4.0의 새로운 기능에 설명합니다. 그것은 또한 메시지 리플렉션을 사용 하 여 간단한 재사용 가능한 컨트롤을 만들기 위한 지침을 포함。

이 기술 노트는 ActiveX 컨트롤 (이전의 OLE 컨트롤)에 적용 메시지 반사를 설명 하지 않습니다. 문서를 참조 하십시오 ActiveX 컨트롤: Windows 컨트롤을 서브클래싱하 면 Visual c + + 프로그래머 가이드。

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

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

Windows 및 MFC 버전 4.0 이전에 종종 대화 상자의 부모 창이입니다 이러한 메시지를 처리 하는 작업을 담당 합니다. 이 메시지를 처리 하기 위한 코드 부모 창 클래스에 필요 하 고 해당 메시지를 처리 해야 하는 모든 클래스에서 중복 될 수 있음을 의미 합니다. 위의 경우에서 배경 사용자 정의 컨트롤을 원하는 모든 대화 상자 컨트롤 컬러 알림 메시지를 처리 해야 합니다. Control 클래스는 자체 배경색을 처리할 것 이라고 쓸 수 있으면 코드를 재사용 하기 훨씬 쉬울 것。

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

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

메시지 반사는 MFC 버전 4.0 이전에 작성 된 코드에 대 한 역방향 호환。

특정 메시지에 대 한 처리기를 제공 해야 또는 무시 됩니다 메시지를 부모 창 클래스의 범위에 대 한 자신의 처리기에서 기본 클래스 처리기 함수를 호출 하지 않습니다 제공 동일한 메시지에 대 한 메시지 처리기를 반영 합니다. 예를 들어, 대화 상자 클래스에 WM_CTLCOLOR 를 처리 하는 경우 귀하의 처리 덮어 리플렉션된 메시지 처리기。

부모 창 클래스에서 특정 WM_NOTIFY 메시지 또는 WM_NOTIFY 메시지 범위에 대 한 처리기를 제공 하는 경우 해당 메시지를 전송 하는 자식 컨트롤에는 ON_NOTIFY_REFLECT()를 통해 반영 된 메시지 처리기를 하는 경우에 처리기 호출 됩니다. ON_NOTIFY_REFLECT_EX() 를 사용 하 여 메시지 맵에서 메시지 처리기 수도 부모 창 메시지를 처리할 수 없습니다. 처리기에서 TRUE를 반환 하는 경우 메시지 FALSE 허용 하지 않는 그것을 처리 하기 위해 부모를 반환 하는 호출 하는 동안 뿐만 아니라, 부모에 의해 처리 됩니다. 참고 알림 메시지 전에 리플렉션된 메시지 처리。

WM_NOTIFY 메시지를 보낼 때 컨트롤 처리 첫 번째 기회가 제공 됩니다. 다른 리플렉션된 메시지를 전송 하는 경우 부모 창에 그것을 처리 하는 첫 번째 기회와 컨트롤 리플렉션된 메시지를 받게 됩니다. 이렇게 하려면 처리기 함수 및 컨트롤의 클래스 메시지 맵에서 적절 한 항목이 필요 합니다.

리플렉션된 메시지에 대 한 메시지 맵 매크로 일반 알림 것 보다 약간 다른: 그것은 _REFLECT 의 일반적인 이름에 추가 합니다. 예를 들어, 부모에서 WM_NOTIFY 메시지를 처리 하려면 상위의 메시지 맵에 ON_NOTIFY 매크로 사용 하면. 자식 컨트롤에 리플렉션된 메시지를 처리 하려면 ON_NOTIFY_REFLECT 매크로 사용 하 여 자식 컨트롤의 메시지 맵에 있습니다. 어떤 경우에 매개 변수는 다른, 뿐만 아니라. 참고 ClassWizard 수 있습니다 일반적으로 당신에 대 한 메시지 맵 항목을 추가 하 고 올바른 매개 변수를 가진 뼈대 함수 구현을 제공합니다。

참조 TN061: ON_NOTIFY WM_NOTIFY 메시지 새로운 WM_NOTIFY 메시지에 대 한 정보。

메시지 맵 항목 및 리플렉션된 메시지 처리기 함수 프로토타입

메시지 맵 매크로 및 함수 프로토타입 아래 테이블에 나열 된 사용 하는 여 반사 컨트롤 알림 메시지를 처리 하려면。

ClassWizard 일반적으로 당신을 위해 이러한 메시지 맵 항목을 추가 하 고 뼈대 함수 구현을 제공할 수 있습니다. 참조 메시지를 반영에 대 한 처리기를 정의 하는 방법에 대 한 내용은 Visual c + + 프로그래머 가이드 에 반영 하는 메시지의 메시지 처리기 정의。

메시지 이름에서 반영 된 매크로 이름으로 변환 하려면 ON_ 앞에 추가 하 고 _REFLECT를 추가 합니다. 예를 들어, WM_CTLCOLOR ON_WM_CTLCOLOR_REFLECT됩니다. (메시지를 반영 하십시오 아래 테이블의 매크로 항목에 반대의 변환을 할.)

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

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

매개 변수의 의미 및 함수 반환 값 함수 이름 또는 함수 이름에 앞으로 나와. 예를 들어, CtlColor 은 OnCtlColor에서 설명 됩니다. 여러 리플렉션된 메시지 처리기 부모 창에서 유사한 처리기 보다 적은 매개 변수가 필요합니다. 그냥 문서에 형식 매개 변수의 이름으로 아래 테이블에 있는 이름과 일치。

맵 항목 함수 프로토타입
ON_CONTROL_REFLECT ( wNotifyCode, memberFxn ) void afx_msgmemberFxn ( );
ON_NOTIFY_REFLECT ( wNotifyCode, memberFxn ) void afx_msgmemberFxn(NMHDR * pNotifyStruct, LRESULT * 결과 );
ON_UPDATE_COMMAND_UI_REFLECT ( memberFxn ) void afx_msgmemberFxn(CCmdUI * pCmdUI );
ON_WM_CTLCOLOR_REFLECT) afx_msg HBRUSH CtlColor (CDC * pDC, UINT nCtlColor );
ON_WM_DRAWITEM_REFLECT) afx_msg DrawItem 무효 (LPDRAWITEMSTRUCT lpDrawItemStruct );
ON_WM_MEASUREITEM_REFLECT) afx_msg MeasureItem 무효 (LPMEASUREITEMSTRUCT lpMeasureItemStruct );
ON_WM_DELETEITEM_REFLECT) afx_msg DeleteItem 무효 (LPDELETEITEMSTRUCT lpDeleteItemStruct );
ON_WM_COMPAREITEM_REFLECT) afx_msg int CompareItem (LPCOMPAREITEMSTRUCT lpCompareItemStruct );
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 HScroll 무효 (UINT nSBCode, UINT Npo );
ON_WM_VSCROLL_REFLECT) afx_msg VScroll 무효 (UINT nSBCode, UINT Npo );
ON_WM_PARENTNOTIFY_REFLECT) afx_msg ParentNotify 무효 (UINT 메시지, LPARAM lParam );

ON_NOTIFY_REFLECT 및 ON_CONTROL_REFLECT 매크로 둘 이상의 개체 (예: 컨트롤 및 부모) 지정된 된 메시지를 처리할 수 있게 하는 변형。

맵 항목 함수 프로토타입
ON_NOTIFY_REFLECT_EX ( wNotifyCode, memberFxn ) BOOL afx_msgmemberFxn(NMHDR * pNotifyStruct, LRESULT * 결과 );
ON_CONTROL_REFLECT_EX ( wNotifyCode, memberFxn ) BOOL afx_msgmemberFxn ( );

처리 리플렉션 메시지: 재사용 가능한 컨트롤의 예

이 간단한 예제 라는 재사용 가능한 컨트롤을 만듭니다 CYellowEdit . 컨트롤 노란색 배경에 검정 텍스트를 표시 한다는 점을 제외 하면 일반 편집 제어와 동일 하 게 작동 합니다. 수 있도록 하는 멤버 함수를 추가 하는 것은 쉬울 것 이다는 CYellowEdit 다른 색을 표시 하는 컨트롤。

이 예제를 실행 하려면 다음 단계를 수행 합니다.:

  1. 기존 응용 프로그램에서 새 대화 상자를 만듭니다. 자세한 내용은 참조 Visual c + + 사용자 가이드 에서 대화 상자 편집기。

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

  2. Visual c + +에 로드 된 프로젝트와 ClassWizard 라는 새 클래스를 만들기를 사용 하 여 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 처리할 수 있는 메시지 목록에서 메시지 이름 앞에 등호 메시지가 반영 됩니다 나타냅니다. 이에서 설명 하는 Visual c + + 프로그래머 가이드 에 반영 하는 메시지의 메시지 처리기 정의。

    ClassWizard 당신을 위해 다음과 같은 메시지 맵 매크로 해골 기능 추가:

    ON_WM_CTLCOLOR_REFLECT()
    
    / / 참고: 다른 코드 사이 있을 것입니다....
    
    HBRUSH CYellowEdit::CtlColor(CDC* pDC, UINT nCtlColor) {
    / / TODO: 여기 DC의 특성 변경
    
    / / TODO: 경우에 NULL이 아닌 브러시를 반환 합니다
    / / 부모 처리기를 호출 해서는 안
    NULL; 반환
    }
    
  6. 함수 본문을 다음 코드로 바꿉니다. 코드 텍스트 색상, 텍스트 배경 색 및 나머지 컨트롤의 배경색을 지정합니다.
    pDC-gt;SetTextColor (m_clrText);    / / 텍스트
    pDC-> SetBkColor (m_clrBkgnd);    / / 텍스트 bkgnd
    반환 m_brBkgnd;                / / ctl bkgnd
    
  7. 대화 상자에서 편집 컨트롤 만들기 다음 control 키를 누른 채 편집 컨트롤을 두 번 클릭 하 여 멤버 변수를 연결 합니다. 멤버 변수 추가 대화 상자에서 변수 이름을 완료 하 고 변수 형식에 대 한 다음 "CYellowEdit" 범주에 대 한 "제어"를 선택 합니다. 대화 상자에서 탭 순서를 설정 하는 것을 잊지 마세요. 또한,에 대 한 헤더 파일을 포함 해야 합니다 CYellowEdit 대화 상자의 헤더 파일에서 컨트롤。

  8. 빌드 및 응용 프로그램을 실행 합니다. 편집 컨트롤에는 노란색 배경을 해야한다합니다。

  9. 구성 요소 갤러리를 사용 하 여 추가할 수 있습니다 이제 귀하의 CYellowEdit 클래스를 다른 프로젝트 제어。

기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)

Index