티스토리 뷰

Visual Studio 2012


버튼에 마우스 커서를 위로 올리거나(Hover) 버튼에서 벗어날 시(Leave)의 마우스 이벤트 추가하기


1. 사용하는 버튼의 클래스 상속 받기 (CMFCBUTTON)


* 클래스 마법사 - 클래스 추가(우측 화살표 클릭) - MFC 클래스..


* 파생 클래스 추가(CMyButton)



2. 메시지 추가


 * WM_MOUSEHOVER, WM_MOUSELEAVE, WM_MOUSEMOVE



3. 소스 추가


* Flag용 변수 추가 및 초기화(m_bCursorOnButton)


// MyButton.h
class CMyButton : public CMFCButton
{
	...
public:
	CMyButton();
	virtual ~CMyButton();
	BOOL m_bCursorOnButton;
	...
};


// MyButton.cpp : 구현 파일입니다.
//
CMyButton::CMyButton()
{
	m_bCursorOnButton=FALSE;
}


* OnMouseMove() 에 TRACKMOUSEEVENT 추가


void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	if( m_bCursorOnButton == FALSE )
	{
		TRACKMOUSEEVENT tme;
		ZeroMemory(&tme,sizeof(TRACKMOUSEEVENT));
		tme.cbSize = sizeof(tme);
		tme.hwndTrack = m_hWnd;
		tme.dwFlags = TME_LEAVE|TME_HOVER;
		tme.dwHoverTime = 1;
		m_bCursorOnButton = _TrackMouseEvent(&tme);
	}
	CMFCButton::OnMouseMove(nFlags, point);
}


* OnMouseLeave(), OnMouseHover()에 코드 추가


void CMyButton::OnMouseLeave()
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	m_bCursorOnButton=FALSE;	//Leave시 Flag False로 만들고 버튼 Hover하면 이벤트 설정되게
	MessageBox("LEAVE","LEAVE",0);
	Invalidate();
	CMFCButton::OnMouseLeave();
}

void CMyButton::OnMouseHover(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	MessageBox("HOVER","HOVER",0);
	Invalidate();
	CMFCButton::OnMouseHover(nFlags, point);
}


4. 테스트


0



* 작동은 하나 HOVER시 일정 시간이 지난 후에 LEAVE동작이 진행됨.

* TRACKMOUSEEVENT 구조로 인해 버튼 위에 마우스 올라갔을 시(HOVER) 구조체에 있는 dwHoveerTime 변수의 설정 시간에 맞춰 HOVER 후에 바로 LEAVE 되는 현상이 있음.

* HOVER가 계속 유지되도록 하는 구문은 좀 더 검색을 해봐야함.. ㅠㅠ


- > 다시 확인해본 결과 Hover될 시에 메시지 창을 띄우면 focus가 메시지창으로 가면서 버튼을 Leave하는 것처럼 인식하여 생기는 현상이였음. 메시지 박스 같은거 말고 다른 방식으로는 정상 작동됨





댓글