MFC 의 컨트롤을 동적 생성한 경우 버튼 클릭등의 이벤트핸들링은 정적 생성한 경우와는 달리, OnCommand 와 OnNotify 에서 수신하며, 이를 위한 컨트롤 생성시 동적 생성한 컨트롤의 owner 가 이벤트 수신할 CWnd* 로 설정되어야 한다.
OnCommand, OnNotify 의 wParam 으로 Create 시 기록한 nID 가 전달된다.
OnNotify 인 경우에는 nID가 wParam 과 동시에 lParam 으로 전달되는 구조체 NMHDR 의 멤버 idFrom에도 nID가 기록되어 전달된다.
아래 코드는 CListCtrl 의 경우의 동적 생성시 이벤트 핸들링을 위한 코드 예를보인다.
CTreeCtrl 뿐만 아니라 모든 컨트롤의 동적 생성한 것들은 이와 동일한 방식으로 이벤트 핸들링한다.
// this 클래스에서 CListCtrl 을 아래처럼 동적 생성했다.
CListCtrl * p_list = new CListCtrl();
p_list->Create(
//DWORD dwStyle.
, //const RECT& rect
,this //CWnd* pParentWnd
,1023 //UINT nID) , 여기에 기록된 숫자가 아래 이벤트 수신시 wParam 으로 전달됨.
);
p_list->SetOwner(this); // Owner 가 this 로 설정되지 않으면 this 에서는아래 이벤트 수신안됨.
// this 클래스에서 p_list 에서의 이벤트들(버튼 클릭 Command, 마우스 move 등의 Notify ) 수신하려면,
// 아래와 같은 2개의 이벤트 수신 함수에서 수신가능.
// wParam 으로는 동적생성시 Create 함수에서 설정한 nID 값이 전달됨.
BOOL this_class::OnCommand(WPARAM wParam, LPARAM lParam)
{
Beep(1000, 200);
// TODO: Add your specialized code here and/or call the base class
return CMFCOutlookBar::OnCommand(wParam, lParam);
}
BOOL this_class::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
Beep(1500, 20);
// TODO: Add your specialized code here and/or call the base class
return CMFCOutlookBar::OnNotify(wParam, lParam, pResult);
}
OnNotify(), OnCommand() 는 CWnd 에 정의된 것이며, 위 예제의 this_class는 CWnd 에서 상속된 클래스이고, this_class 에서는 오버라이딩하여 사용하는것.
참고.
CListBox 를 동적 생성시 Create 호출시 인자 dwStyle 에서 LBS_NOTIFY 설정해줘야 this에서 이벤트 수신가능.
연관
첫 등록 : 2020.09.24
최종 수정 :
단축 주소 : https://igotit.tistory.com/2623
'VisualStudio.C++.C# > 코딩팁,함수활용,단편' 카테고리의 다른 글
C++. Win32 API. MFC. SetCapture(), ReleaseCapture() (0) | 2020.09.25 |
---|---|
CWnd::OnNotify, OnCommand (0) | 2020.09.24 |
MFC. CListCtrl. 리스트 컨트롤. (0) | 2020.09.24 |
MFC. Understanding CDockablePane. 최고의 설명글. (0) | 2020.09.20 |
MFC. 컴파일 경고 무시 #pragma, 속성설정. (0) | 2020.09.14 |
댓글