MFC 마우스 이벤트 처리 관련 질문입니다.

조회수 315회

WM_LBUTTONDOWN, WM_MOUSEMOVE, WM_RBUTTONDOWN 등 모든 마우스 이벤트 처리할 때 동일한 위치라면 이벤트가 발생한 마우스의 좌표 값이 같은데

WM_MOUSEWHEEL 만 이벤트가 발생한 마우스의 좌표가 다르네요. 왜 그런지 궁금합니다.

클릭이벤트

void CPr2View::OnLButtonDown(UINT nFlags, CPoint point)
{
    m_strPointText.Format(_T("%d %d "), point.x, point.y);
    OutputDebugString(m_strPointText);
    Invalidate();

    CView::OnLButtonDown(nFlags, point);
}

휠 이벤트

BOOL CPr2View::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
    if (zDelta < 0)
    {
        m_strPointText.Format(_T("%d %d "), pt.x, pt.y);
        OutputDebugString(m_strPointText);
    }
    else
    {
        m_strPointText.Format(_T("%d %d "), pt.x, pt.y);
        OutputDebugString(m_strPointText);
    }

    return CView::OnMouseWheel(nFlags, zDelta, pt);
}

결과는 실행된 창에 동일한 위치에서 좌클릭, 휠을 움직였을때 (49, 617) (267, 902) 로 좌표값이 다르게 나옵니다.

동일하게 우클릭, 마우스 이동 등 휠 이벤트를 제외한 나머지는 모두 (49, 617)로 좌클릭했을 때와 동일한 좌표가 나왔습니다.

또 이 좌표 값을 동일하게 맞추려면 어떻게 해야 할까요?


1 답변

  • OnLButtonDown(UINT nFlags, CPoint point)의 point는 클라이언트 영역에서의 좌표이고, BOOL CPr2View::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)에서 pt는 스크린(모니터) 절대 좌표입니다.

    BOOL CPr2View::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 함수의 첫번째 줄에 아래의 한줄을 추가해 주시면 스크린 좌표를 클라이언트 좌표로 바꾸어 주고 동일한 좌표값을 볼수 있습니다.

    ScreenToClient(&pt);
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)