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_SHOW 및 TTN_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_EX 및 ON_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 다른 개체에서 명령 라우팅 메시지를 처리할 수 있는지.