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 +깡통+


날 가지고 놀던 녀석 -_-;;
Posted by +깡통+
MBC 해외걸작 다큐멘터리
어제 이 방송을 보구 잤습니다.

참으로 부럽더군요.
집안에 샘이 흐른다는 것..
세수도 하고 설겆이 하는 곳에서 물고기가 빤히 쳐다보는 ㅎㅎㅎㅎ
아무튼 신기한 물의 나라였습니다.

카바타라고 불리우는 일본의 하수 처리 방식? 이라고 합니다.
일본 전역에서 사용되는 방법이라고 하네요.  깨끗한 하천을 유지하는 방법인것 같습니다.


잡은 물고기 중에서 작은것은 새들을 위해 남겨둡니다.  자연과 더불어 사는 법..


p.s
아마도 오늘 저의 블로그에 찾아오시는 분들은 사토야마 영상을 얻기 위하신듯 합니다.
'토토브라우저'라는 유료 전송 사이트를 통해서 다운로드 받으실 수 있습니다.
물의 정원 사토야마 영상미가 땡기네요.  그리고 꼭 가보고 싶은 곳이 되었습니다.
Posted by +깡통+