TN061: ON_NOTIFY 및 WM_NOTIFY 메시지

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

Windows 3.x에서 알림 메시지

Windows 3.x에서 컨트롤 알림 마우스 클릭과 같은 이벤트의 부모 변경 내용 및 선택 및 컨트롤 배경 그림에 부모에 게 메시지를 보내. 간단한 알림 알림 코드 (예: BN_CLICKED)와 특수 WM_COMMAND 메시지 전송 및 wParam 및 lParam에 컨트롤의 손잡이로 포장 하는 ID를 제어할. 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 컨트롤에 대 한 메시지 리플렉션。

Win32에서 알림 메시지

Windows 3.1에 존재 하는 컨트롤에 대 한 Win32 API는 Windows 3.x에서 사용 된 알림 메시지의 대부분을 사용 합니다. 그러나, 이러한 컨트롤 알림 메시지와 함께 추가 데이터를 보낼 필요 Win32 또한 지원 Windows 3.x. 자주 그 다양 한 정교 하 고, 복잡 한 컨트롤을 추가 합니다. 추가 데이터를 필요로 하는 각 새로운 통지에 대 한 새로운 WM_ * 메시지를 추가 하는 대신 Win32 API의 디자이너 단지 하나의 메시지를 WM_NOTIFY, 표준화 된 패션에 추가 데이터의 모든 금액을 전달할 수 있는 추가 하기로。

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

대부분의 경우, 더 큰 구조를 가리키는 포인터와 사용 하면 캐스팅 해야 합니다. (이름이 NM_로 시작) 일반적인 알림 및 도구 팁 컨트롤의 TTN_SHOW 및 TTN_POP 알림을와 같은 몇 가지 알림만 실제로 사용 NMHDR 구조。

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

typedef struct tagNMHDR {
 nbsp;? HWND hwndFrom;
 ?? UINT idFrom;
 ?? UINT 코드;
} NMHDR(&N)

TTN_SHOW 메시지에 대 한 코드 멤버 TTN_SHOW 로 설정 됩니다.

대부분의 알림을 첫 번째 멤버로 NMHDR 구조를 포함 하는 더 큰 구조를 포인터를 전달 합니다. 예를 들어, 목록 보기 컨트롤에서 키를 누를 때 목록 뷰 컨트롤의 LVN_KEYDOWN 알림 메시지를 사용 하는 구조를 고려해 야 합니다. 아래와 같이 정의 하는 LV_KEYDOWN 구조를 가리키는 포인터:

typedef struct tagLV_KEYDOWN {
 nbsp;? NMHDR hdr;?? 
 ?? WORD wVKey;? 
 ?? UINT 플래그;? 
} LV_KEYDOWN(&N)

이 구조에서 첫 번째 NMHDR 구성원 이므로 알림 메시지를 전달 하는 포인터 NMHDR 에 대 한 포인터 또는 LV_KEYDOWN 에 대 한 포인터를 캐스팅할 수 note。

모든 새로운 Windows 컨트롤 알림 공통

일부 알림은 새 Windows 컨트롤의 모든 일반적인 합니다. 이러한 알림을 NMHDR 구조를 가리키는 포인터 전달。

알림 코드 때문에 전송
NM_CLICK 사용자 컨트롤에서 마우스 왼쪽된 버튼을 클릭
NM_DBLCLK 컨트롤에서 사용자 두 번 클릭된 왼쪽된 마우스 단추
NM_RCLICK 사용자 컨트롤에서 마우스 오른쪽 버튼을 클릭
NM_RDBLCLK 컨트롤에서 사용자 두 번 클릭된 오른쪽 마우스 버튼
NM_RETURN 사용자 컨트롤에 포커스를 입력 하는 동안 ENTER 키를 누르면
NM_SETFOCUS 입력된 포커스가 주어진 컨트롤
NM_KILLFOCUS 컨트롤은 입력된 포커스를 잃었다
NM_OUTOFMEMORY 제어 완료할 수 없습니다 작업 때문에 사용 가능한 메모리가 부족 하지는

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

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

ClassWizard 속성 시트 또는 Wizardbar를 통해 ClassWizard ON_NOTIFY 메시지 맵 항목을 만들 하 고 뼈대 처리기 함수를 제공할 수 있습니다. Classwizard를 사용 하 여 쉽게이 하 자세한 내용은 참조 Visual c + + 프로그래머 가이드 의 함수에 메시지 매핑。

ON_NOTIFY 메시지 맵 매크로 다음 구문:

ON_NOTIFY ( wNotifyCode, id, memberFxn )

기울임꼴로 표시 된 매개 변수로 대체 됩니다:

wNotifyCode

LVN_KEYDOWN 와 같은 처리 알림 메시지에 대 한 코드。

id

공지가 전송 되는 컨트롤의 자식 식별자。

memberFxn

이 알림을 보낼 때 호출 될 멤버 함수。

멤버 함수는 다음과 같은 프로토 타입으로 선언 해야 합니다.:

afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * 결과 );

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

pNotifyStruct

위의 섹션에 설명 된 대로 알림 구조에 대 한 포인터。

결과

결과 코드에 대 한 포인터 반환 하기 전에 설정 거 야。

예제

멤버 함수는를 지정 하려면 OnKeydownList1 ID가 인 CListCtrl 에서 LVN_KEYDOWN 메시지를 처리 하기 위해 IDC_LIST1 , Classwizard를 사용 하 여 메시지 맵에 다음을 추가 하는:

ON_NOTIFY (LVN_KEYDOWN, IDC_LIST1, OnKeydownList1)

위의 예제에서 Classwizard에서 제공 하는 함수는:

void CMessageReflectionDlg::OnKeydownList1 (NMHDR * pNMHDR, LRESULT * pResult)
{
   LV_KEYDOWN * pLVKeyDow (LV_KEYDOWN *) pNMHDR; =
   / / TODO: 컨트롤 알림 처리기 추가
   / / nbsp;? 여기에 코드
   
   * pResult = 0;
}(&N)

참고 ClassWizard 자동으로 적절 한 형식에 대 한 포인터를 제공 합니다. 알림 구조를 통해 액세스할 수 있습니다 pNMHDR 또는pLVKeyDow。

ON_NOTIFY_RANGE

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

시작을 지정 하 고 자식 식별자 범위를 종료 하 여 알림 메시지를 처리 하는 자식 id의 연속 범위를 지정 하는 ON_NOTIFY_RANGE를 사용할 때。

ClassWizard ON_NOTIFY_RANGE;을 처리 하지 않습니다. 그것을 사용 하려면 메시지 지도 편집 해야。

메시지 맵 항목 및 ON_NOTIFY_RANGE 에 대 한 함수 프로토타입을 같습니다.:

ON_NOTIFY_RANGE ( wNotifyCode, id, idLast, memberFxn )

기울임꼴로 표시 된 매개 변수로 대체 됩니다:

wNotifyCode

LVN_KEYDOWN 와 같은 처리 알림 메시지에 대 한 코드。

id

식별자의 연속 된 범위에서 첫 번째 식별자。

idLast

식별자의 연속 된 범위에서 마지막 식별자。

memberFxn

이 알림을 보낼 때 호출 될 멤버 함수。

멤버 함수는 다음과 같은 프로토 타입으로 선언 해야 합니다.:

afx_msgvoidmemberFxn(UINT idNMHDR*pNotifyStruct,LRESULT*결과);

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

id

알림을 보낸 컨트롤의 자식 식별자。

pNotifyStruct

위에서 설명한 알림 구조에 대 한 포인터。

결과

결과 코드에 대 한 포인터 반환 하기 전에 설정 거 야。

ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE

알림 메시지를 처리 하기 위해 라우팅에 있는 하나 이상의 개체를 하는 경우 보다는 ON_NOTIFY (또는 ON_NOTIFY_RANGE) ON_NOTIFY_EX (또는 ON_NOTIFY_EX_RANGE)를 사용할 수 있습니다. EX 버전 및 정규 버전 간의 유일한 차이점은 메시지 처리를 계속할지 여부를 나타내는 BOOL 을 반환 하는 멤버 함수를 EX 버전에 대 한 호출 합니다. 하나 이상의 개체에 동일한 메시지를 처리할 수 있습니다이 함수에서 FALSE 를 반환。

ON_NOTIFY_EX 또는 ON_NOTIFY_EX_RANGE; ClassWizard 처리 하지 않는다 메시지 맵에 편집 해야 하는 그들 중 하나를 사용 하려는 경우。

메시지 맵 항목 및 ON_NOTIFY_EX 및 ON_NOTIFY_EX_RANGE 에 대 한 함수 프로토타입을 다음과 같습니다. 매개 변수의 의미에 대 한 비 동일-EX 버전。

ON_NOTIFY_EX ( nCode, id, memberFxn )

ON_NOTIFY_EX_RANGE ( wNotifyCode, id, idLast,memberFxn )

위의 두 가지 모두에 대 한 프로토 타입은 동일:

afx_msgBOOLmemberFxn(UINT idNMHDR*pNotifyStruct,LRESULT*결과);

두 경우 모두에서 id 알림을 보낸 컨트롤의 자식 식별자를 보유 하고있다.

귀하의 함수 알림 메시지를 완전히 처리 또는 FALSE 이면 명령 라우팅 개체를 다른 메시지를 처리 하는 기회가 있어야 하는 경우 TRUE 를 반환 해야 합니다.

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

Index