TRACKMOUSEEVENT 구조체

 희한하게 검색해보니, TRACKMOUSEEVENT구조체를 이용하는 팁이 하나도 안올라와 있더군요. 그래서 팁 비슷하게 올려봅니다.
예를 든다면, 윈도우에서 마우스 포인터의 위치가 클라이언트에 있는지 아닌지를 알려주는 간단한 팁입니다.
일단 TRACKMOUSEEVENT 구조체를 보면 다음과 같이 정의 되어 있습니다.

typedef struct tagTRACKMOUSEEVENT {
    DWORD cbSize; // 구조체의 크기
    DWORD dwFlags; // TME_HOVER, TME_LEAVE등 지정할 수 있다.
    HWND  hwndTrack; // 실지로 이벤트를 받을 윈도우 핸들
    DWORD dwHoverTime; // 밀리세칸단위의 hover 타임아웃을 지정한다.
} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT; 

사용할 함수는 BOOL _TrackMouseEvent(LPTRACKMOUSEEVENT lptrack);
윈도우 95에서는 안되고, 98이상에서만 되고, NT에서는 당근이 됩니다.

그럼 간단하게 예를 들어보겠습니다. 
먼저 WM_MOUSEMOVE 이벤트를 정의합니다.
int m_Flag = 1;

..CMyDlg::OnMouseMove(...)
{
    MouseEvent(); //새로 정의할 함수입니다.
}

void CMyDlg::MouseEvent()
{
   TRACKMOUSEEVENT tme;
   tme.cbSize = sizeof(TRACKMOUSEEVENT);
   if(m_Flag == 0)  tme.dwFlags = TME_LEAVE;
   else tme.dwFlags = TME_HOVER;
   tme.hwndTrack = m_hWnd; // 현재 자신의 윈도우 핸들 지정
   tme.dwHoverTime = 10; //10 밀리세칸으로 지정

   _TrackMouseEvent( &tme );
}

여기서 tme.dwFlags=TME_HOVER 이렇게 정의해놓으면, 즉 마우스가 클라이언트영역으로 들어올때, WM_MOUSEHOVER 이벤트를 발산시킵니다. 발산? 그럼 여기에 맞게, 이벤트 부분을 정의합니다.
먼저 헤더에 다음과 같이 정의합니다.
afx_msg UINT OnMouseHover(WPARAM, LPARAM);
그리고 cpp에다가 ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
이렇게 선언합니다.
그리고, 함수를 정의합니다.

UINT MyDlg::OnMouseHover(WPARAM, LPARAM)
{
   m_Flag = 0;
   m_edit.ShowWindow(TRUE);
   return 0;
}
마찬가지로 OnMouseLeave도 같은 방식으로 정의해줍니다.
UINT MyDlg::OnMouseLeave(WPARAM, LPARAM)
{  m_Flag = 1;
   m_edit.ShowWindow(FALSE);
   return 0;
}
위와 같이 정의하시고, 컴파일해보십시오.
아마 클라이언트로 마우스가 위치되면, 에디트박스가 보이고
그렇지 않으면, 에디트가 사라질겁니다.
반응속도도 빠르고, 깜빡임도 없고, 무리없이 잘돌아가더군요.
이걸로, hotButton기능을 구현해봐도 되겠더라고요.
참고로 SetCapture, ReleaseCapture도 이런 기능을 충분히 구현해주지만, 모든 이벤트를 잡아먹어버리는 그런식의 기능은 않습니다. 참 편리합니다만 더 나은 방법이 있으면, 더 글을 올려주세요.

 

http://www.devpia.com/Forum/BoardView.aspx?no=1025&ref=545&forumname=VC_LEC&stype=VCF&KeyW=TRACKMOUSEEVENT&KeyR=titlecontent

Posted by +깡통+