본문 바로가기

공부/MFC

Visual C++ 2008 MFC Chapter 6 마우스 입력 - 1

마우스 입력 관련 챕터.

 
MouseMsgView.h 의 코드에서 public에 마지막 코드 추가

// MouseMsgView.h : CMouseMsgView 클래스의 인터페이스
//


#pragma once


class CMouseMsgView : public CView
{
protected: // serialization에서만 만들어집니다.
CMouseMsgView();
DECLARE_DYNCREATE(CMouseMsgView)

// 특성입니다.
public:
CMouseMsgDoc* GetDocument() const;

// 작업입니다.
public:
CPoint m_ptMouse; //마우스 포인터의 좌표  << 이 부분이 추가되었다.

 \\\\\\\\\\\\\\\\\\\\\\\\\\
MouseMsgView.cpp
에서는 아래 주석 앞의 부분이 추가되었다.

CMouseMsgView::CMouseMsgView()
{
// TODO: 여기에 생성 코드를 추가합니다.
m_ptMouse = CPoint(0,0); // 이 부분이 추가되었다.
}
 
\\\\\\\\\\\\\\\\\\\\\\\\\\\
다음으로는 CMouseMsgView 의 속성으로 가서 WM_PAINT를 추가하여 자동 코드 입력이 되게 한 후에

다음 과 같이 코딩한다.

void CMouseMsgView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.
CString strData = _T("");
strData.Format(_T("X:%03d, Y:%03d"), m_ptMouse.x, m_ptMouse.y);

dc.TextOut(10,10,strData);

}

 
\\\\\\\\\\\\\\\\\\\\\\\\\\

여기까지 입력하면  이런 화면이 뜬다

 
여기서 x와 y값은 아직 변하질 않는다.

여기에서 다시  CMouseMsgView 속성으로 가서 WM_MOUSEMOVE 를 추가한 후에

다음과 같이 코딩하면 마우스의 위치에 따라 x와 y값이 변하게된다.

 

void CMouseMsgView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

m_ptMouse = point;
RedrawWindow();

CView::OnMouseMove(nFlags, point);
}

=========================

출력화면
 

 

여기서 계속 값이 바뀌지 않고

마우스 왼쪽과 오른쪽 버튼을 동시에 누른채로 이동해야만 해당 값이 변경되어 출력되게 하려면

void CMouseMsgView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

if((nFlags & MK_LBUTTON) == MK_LBUTTON &&
(nFlags & MK_RBUTTON) == MK_RBUTTON)
{//마우스 양 버튼을 클릭한 상태에서 마우스를 움직이면 해당 위치를 받아 값을 변경하고 윈도우를 다시 그리게 한다.
m_ptMouse = point;
RedrawWindow();
}
CView::OnMouseMove(nFlags, point);
}


라고 코딩을 바꾸어 주면 된다.
 

같은 방법으로

OnRButtonDown과 m_ptRight

OnLButtonDown과 m_ptLeft 를 추가할 수 있다.

가장 중요한 코드인 onPaint() 를 적으면 아래와 같다.

 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

void CMouseMsgView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.
CString strData = _T("");
//WM_MOUSEMOVE
strData.Format(_T("X:%03d, Y:%03d"), m_ptMouse.x, m_ptMouse.y);
dc.TextOut(10,10,strData);
//WM_LBUTTONDOWN
strData.Format(_T("WM_LBUTTONDOWN X:%03d, Y:%03d"), m_ptLeft.x, m_ptLeft.y);
dc.TextOutW(10,30,strData);

//WM_RBUTTONDOWN
strData.Format(_T("WM_RBUTTONDOWN X:%03d, Y:%03d"), m_ptRight.x, m_ptRight.x);
dc.TextOutW(10,50,strData);


}

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 

여기에 또 속성 을 통해 마우스 휠의 사용에 따른 메시지를 받아 출력하는 코드를 넣는다.

불친절한 글!


BOOL CMouseMsgView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CString strTmp = _T("");
//WM_MOUSEMOVE
strTmp.Format(TEXT("OnMouseWheel() zDelta : %d\n"), zDelta);
TRACE(strTmp);

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




\\\\\\\\\\\\\\\\\\\

이 코드에서는 TRACE를 사용하였기 때문에 화면에 출력은 되지 않는다.

출력되는 값을 보려면 아래와 같이 디버그 실행-> 우하단 화면에서의 출력 선택 을 하면 휠의 사용방향에 따라 +120이나 -120 이 출력됨을 알 수 있다. (빨리 돌리면 좀 더 높은 값이 나오기도 한다)


출력화면..........

 


여기까지의 코딩 완료 파일.



\\\\\\\\\\\\\\\\\\\\\\