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에서 이벤트 수신가능.

 

 

 

 

연관 

 

 

CWnd::OnNotify, OnCommand

CWnd::OnNotify virtual BOOL OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult ); Parameters wParam Identifies the control that sends the message if the message is from a control. Otherwise, ..

igotit.tistory.com

 

 


첫 등록 : 2020.09.24

최종 수정 : 

단축 주소 : https://igotit.tistory.com/2623

 


 

Posted by 리치굿맨

댓글을 달아 주세요