이 기술 노트 새로운 WM_NOTIFY 메시지에 배경 정보를 제공 하 고 MFC 응용 프로그램에서 WM_NOTIFY 메시지 처리의 권장 (그리고 가장 일반적인) 방법을 설명합니다。
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 컨트롤에 대 한 메시지 리플렉션。
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 컨트롤의 모든 일반적인 합니다. 이러한 알림을 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。
컨트롤 집합에 대 한 동일한 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)