다음을 통해 공유


TN061: ON_NOTIFY 및 WM_NOTIFY 메시지

[!참고]

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

이 기술 노트에 새 배경 정보를 제공 WM_NOTIFY 권장 (및 가장 일반적인) 처리 방법에 설명 하 고 메시지 WM_NOTIFY MFC 응용 프로그램에서 메시지.

Windows 3.x에서 알림 메시지

Windows 3.x에서 컨트롤 모 마우스 클릭과 같은 이벤트의 알림 콘텐츠 및 선택 및 배경 그림을 컨트롤에 부모에 메시지를 전송 하 여 변경 합니다.간단한 공지가 전송으로 특별 한 WM_COMMAND 메시지 알림 코드 (같은 BN_CLICKED) 포장에 ID를 제어 하 고 wParam 및 컨트롤의 핸들을 lParam.이때 이후 wParam 및 lParam 는 완전 한 추가 데이터를 전달 하는 방법이 없습니다-이러한 메시지에만 간단한 알림 수 있습니다.예를 들어 있는 BN_CLICKED 알림 단추를 클릭할 때 마우스 커서의 위치에 대 한 정보를 보낼 수 있는 방법이 없습니다.

Windows 3.x에서 컨트롤 추가 데이터를 포함 하는 알림 메시지를 보낼 필요가 때 특수 메시지를 비롯 한 다양 한 사용 WM_CTLCOLOR, WM_VSCROLL, WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEM등.이러한 메시지는 보낸 컨트롤에 다시 반영 될 수 있습니다.자세한 내용은 TN062: Windows 컨트롤에 대 한 메시지 리플렉션.

W i n 32에서 알림 메시지

Windows 3.1에 있던 컨트롤에 대 한 Win32 API 대부분 Windows 3.x에서 사용 된 알림 메시지를 사용 합니다.그러나 Win32 또한 정교 하 고 복잡 한 컨트롤의 여러 Windows 3.x에서 지원 되는 추가 합니다.자주 이러한 컨트롤 알림 메시지에 추가 데이터 보내기 해야 합니다.새 추가 하는 대신 WM_ * Win32 API의 디자이너와 같은 추가 데이터를 필요로 하는 각 새 알림 하나의 메시지를 추가 하기로 선택에 대 한 메시지 WM_NOTIFY, 추가 데이터 양을 표준화 된 방식으로 전달 수 있습니다.

WM_NOTIFY 메시지에 메시지를 보내는 컨트롤의 ID를 포함 wParam 구조체를 가리키는 포인터 lParam.이 구조 되는 NMHDR 구조 나가 몇 가지 큰 구조는 NMHDR 첫 번째 멤버인 구조.이때 이후로 NMHDR 구성원입니다 첫 번째,이 구조에 대 한 포인터를 포인터를 사용할 수 있습니다는 NMHDR 또는 포인터로 캐스팅 하는 방법에 따라 더 큰 구조.

대부분의 경우 더 큰 구조를 가리키는 포인터 및 사용 하는 경우이 속성을 캐스팅 해야 합니다.일반적인 알림과 같은 소수의 알림에 (이름이 시작으로 NM_) 및 tool tip 컨트롤이 TTN_SHOWTTN_POP 알림이 되는 NMHDR 실제로 사용 하는 구조.

NMHDR 구조 또는 초기 멤버는 핸들 및 메시지 알림 코드를 보내는 컨트롤의 ID를 포함 (같은 TTN_SHOW).형식에는 NMHDR 구조 다음과 같습니다:

typedef struct tagNMHDR {
    HWND hwndFrom;
    UINT idFrom;
    UINT code;
} NMHDR;

TTN_SHOW 메시지를 코드 멤버를 설정 합니다 TTN_SHOW.

대부분의 알림에 포함 된 큰 구조체에 포인터를 전달 된 NMHDR 구조체의 첫 번째 구성원으로.예를 들어, list view 컨트롤에서의 사용 되는 구조를 고려 LVN_KEYDOWN list view 컨트롤에서 키를 누를 때 보내는 알림 메시지입니다.포인터가 가리키는 있는 LV_KEYDOWN 구조는 아래와 같이 정의 됩니다:

typedef struct tagLV_KEYDOWN {
    NMHDR hdr;   
    WORD wVKey;  
    UINT flags;  
} LV_KEYDOWN;

이때 이후로 NMHDR 멤버인이 구조에서 첫 번째, 알림 메시지를 전달 하는 포인터를 포인터로 캐스팅 될 수는 NMHDR 또는 포인터는 LV_KEYDOWN.

모든 새 Windows 컨트롤 알림 공통

일부 알림은 모든 새 Windows 컨트롤에 공통 됩니다.포인터를 이러한 알림을 전달 된 NMHDR 구조입니다.

알림 코드

때문에 전송 합니다.

NM_CLICK

사용자가 컨트롤을 마우스 왼쪽된 단추로 클릭

NM_DBLCLK

컨트롤에서 사용자가 두 번 클릭된 왼쪽된 마우스 단추

NM_RCLICK

컨트롤을 마우스 오른쪽 단추로 사용자를 클릭합니다.

NM_RDBLCLK

사용자가 두 번된 마우스 오른쪽 단추 컨트롤

NM_RETURN

사용자가 컨트롤에 입력 포커스가 있지만 ENTER 키를 누른

NM_SETFOCUS

입력된 포커스가 주어진 컨트롤

NM_KILLFOCUS

컨트롤이 입력된 포커스를 잃 었

NM_OUTOFMEMORY

메모리가 부족 하 여 없기 때문 제어 작업을 완료할 수 없습니다.

ON_NOTIFY: MFC 응용 프로그램에서 WM_NOTIFY 메시지 처리

함수가 CWnd::OnNotify 알림 메시지를 처리 합니다.기본 구현을 호출 알림 처리기에 대 한 메시지 맵을 확인 합니다.일반적으로 재정의할 하지 않습니다 OnNotify.대신 처리기 함수를 제공 하 고 클래스 소유자 창의 메시지 맵에 해당 처리기에 대 한 메시지 맵 엔트리를 추가 합니다.

클래스 마법사, 클래스 마법사 속성 시트를 통해 만들 수는 ON_NOTIFY 메시지 맵 엔트리 및 기초 처리기 함수를 제공 합니다.클래스 마법사를 사용 하 여이 쉽게에 대 한 자세한 내용은 함수에 메시지 매핑.

ON_NOTIFY 메시지 맵 매크로 다음 구문이 있습니다:

ON_NOTIFY( wNotifyCode, id, memberFxn )

위치 기울임꼴로 표시 된 매개 변수가 대체 됩니다.

  • wNotifyCode
    알림 메시지를 처리 등을 위한 코드 LVN_KEYDOWN.

  • id
    자식에 대 한 알림을 보내는 컨트롤의 식별자입니다.

  • memberFxn
    이 알림 메시지를 보낼 때 호출 될 멤버 함수입니다.

멤버 함수는 다음 프로토타입은 사용 하 여 선언 되어야 합니다.

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

설명

기울임꼴로 표시 된 매개 변수는 위치:

  • pNotifyStruct
    위의 섹션에서 설명한 대로 알림 구조에 대 한 포인터입니다.

  • result
    돌아가기 전에 결과 코드에 대 한 포인터를 설정 합니다.

예제

멤버 함수를 지정할 수 OnKeydownList1 처리할 수 LVN_KEYDOWN 에서 메시지는 CListCtrl 의 ID입니다 IDC_LIST1, 다음에 메시지 맵에 추가 하려면 클래스 마법사를 사용 합니다:

ON_NOTIFY( LVN_KEYDOWN, IDC_LIST1, OnKeydownList1 )

위 예제에서 클래스 마법사가 제공 하는 함수가입니다.

void CMessageReflectionDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
{
   LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
   // TODO: Add your control notification handler
   //       code here
   
   *pResult = 0;
}

클래스 마법사의 적절 한 형식에 대 한 포인터를 자동으로 제공 하는 참고.알림 구조를 통해 액세스할 수 있습니다 pNMHDR 또는 pLVKeyDow.

ON_NOTIFY_RANGE

동일한 작업을 처리 하는 경우 WM_NOTIFY 메시지 컨트롤 집합이 사용 ON_NOTIFY_RANGE 대신 ON_NOTIFY.예를 들어, 특정 알림 메시지에 대해 동일한 작업을 수행 하려면 단추를 있을 수 있습니다.

사용 하는 경우 ON_NOTIFY_RANGE, 연속 된 범위의 시작 부분을 지정 하 고 끝나는 범위의 자식 식별자 알림 메시지를 처리 하는 자식 식별자를 지정 합니다.

클래스 마법사가 처리 하지 않습니다 ON_NOTIFY_RANGE. 사용 하려면 메시지 지도 직접 편집할 필요가 있습니다.

메시지 맵 엔트리 및 함수 프로토타입 ON_NOTIFY_RANGE 는 다음과 같습니다:

ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )

위치 기울임꼴로 표시 된 매개 변수가 대체 됩니다.

  • wNotifyCode
    알림 메시지를 처리 등을 위한 코드 LVN_KEYDOWN.

  • id
    식별자는 연속 된 범위에서 첫 번째 식별자입니다.

  • idLast
    식별자는 연속 된 범위에서 마지막 식별자입니다.

  • memberFxn
    이 알림 메시지를 보낼 때 호출 될 멤버 함수입니다.

멤버 함수는 다음 프로토타입은 사용 하 여 선언 되어야 합니다.

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

설명

기울임꼴로 표시 된 매개 변수는 위치:

  • id
    알림을 보낸 컨트롤의 자식 id입니다.

  • pNotifyStruct
    위에서 설명한 알림 구조에 대 한 포인터입니다.

  • result
    돌아가기 전에 결과 코드에 대 한 포인터를 설정 합니다.

ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE

알림에서 개체가 두 개 이상 필요한 경우에 라우팅, 메시지를 처리할 수 있습니다 ON_NOTIFY_EX (또는 ON_NOTIFY_EX_RANGE) 대신 ON_NOTIFY (또는 ON_NOTIFY_RANGE).간의 유일한 차이점은 EX 버전과 정식 버전에는 멤버 함수를 호출 하는 EX 버전 반환는 BOOL 않았다는 메시지 처리를 계속 해야 하는지 여부.반환 FALSE 이 함수에서 두 개 이상의 개체에 동일한 메시지를 처리할 수 있습니다.

클래스 마법사가 처리 하지 않습니다 ON_NOTIFY_EX 또는 ON_NOTIFY_EX_RANGE. 그 중 하나를 사용 하려면 메시지 지도 직접 편집 해야 합니다.

메시지 맵 엔트리 및 함수 프로토타입 ON_NOTIFY_EXON_NOTIFY_EX_RANGE 는 다음과 같습니다.매개 변수의 의미를 비는 동일 합니다-EX 버전입니다.

ON_NOTIFY_EX( nCode, id, memberFxn )
ON_NOTIFY_EX_RANGE( wNotifyCode, id, idLast, memberFxn )

프로토타입 위의 두 항목 모두에 대해 동일합니다.

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

설명

두 경우 모두 id 알림을 보낸 컨트롤의 자식 식별자를 포함 합니다.

함수 반환 해야 TRUE 알림 메시지를 완전히 처리 된 경우 또는 FALSE 다른 개체에서 명령 라우팅 메시지를 처리할 수 있는지.

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트