MouseMsg

유혜정·2022년 4월 14일
0

창에 문구 띄우기

-----view.cpp

void CMouseMsgView::OnDraw(CDC* pDC)
{
	CMouseMsgDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
	pDC->TextOut(100, 100, _T("안녕하세요")); // _T : char, wchar_t 구별하지 않고 사용하기 위해
}

Doc과 View로 나누기

-----view.cpp

void CMouseMsgView::OnDraw(CDC* pDC)
{
	CMouseMsgDoc* pDoc = GetDocument(); // Doc.h에 정의된 내용 가져오는 함수
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
	pDC->TextOut(pDoc->m_x, pDoc->m_y, pDoc->m_strText);
}

-----doc.h

// 특성입니다.
public:
	int m_x;
	int m_y;
	CString m_strText;

-----doc.cpp

BOOL CMouseMsgDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: 여기에 재초기화 코드를 추가합니다.
	// SDI 문서는 이 문서를 다시 사용합니다.

	m_x = 100;
	m_y = 100;
	m_strText = _T("안녕하세요");

	return TRUE;
}

마우스 클릭에 따라 문구가 움직이기

-----view.cpp

void CMouseMsgView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	CMouseMsgDoc* pDoc = GetDocument();
	pDoc->m_x = point.x;
	pDoc->m_y = point.y;

	Invalidate(); // 현재 화면을 다시 그려라
	// WM_PAINT 메세지가 현재 나의 윈도우에 전달됨 -> OnDraw() 호출

	CView::OnLButtonDown(nFlags, point);
}

변경된 내용 저장하기

변경사항 있을 때 저장 문구 출력

문구를 옮긴 후, 해당 변경사항을 파악하여 윈도우를 닫을 때 저장문구 보이게 하기

-----view.cpp

void CMouseMsgView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	CMouseMsgDoc* pDoc = GetDocument();
	pDoc->m_x = point.x;
	pDoc->m_y = point.y;

	pDoc->SetModifiedFlag(); //문서가 수정되었다고 설정됨

	Invalidate(); // 현재 화면을 다시 그려라
	// WM_PAINT 메세지가 현재 나의 윈도우에 전달됨 -> OnDraw() 호출
    // RedrawWindow();와 같은 기능

	CView::OnLButtonDown(nFlags, point);
}


저장하는 문구가 나타나게 됨

변경된 데이터 실제로 저장 및 열기

// CMouseMsgDoc serialization

void CMouseMsgDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring()) // 저장
	{
		// TODO: 여기에 저장 코드를 추가합니다.
		ar << m_x;
		ar << m_y;
		ar << m_strText;
	}
	else // 불러오기
	{
		// TODO: 여기에 로딩 코드를 추가합니다.
		ar >> m_x;
		ar >> m_y;
		ar >> m_strText;
	}
}

코드 변경 후 해당 파일 내용 확인

코드 실행 후 '열기'해서 해당 파일 열면, 저장한 내용으로 출력됨

저장된 데이터 해석

기본 세팅 값

  • m_x : int, 100
  • m_y : int, 100
  • m_strText : wchar_t(unicode), abcdef

해당 내용 저장 후 데이터 확인

데이터 해석

  • 64 00 00 00 : m_x의 데이터 ( dex : 100)
  • 64 00 00 00 : m_y의 데이터 ( dex : 100)
  • 06 : m_strText의 데이터 길이
  • 61 00 62 00 63 00 64 00 65 00 66 00 : m_strText의 데이터 ( unicode : abcdef )
    - 만약 multibyte 라면 1byte 씩, '06 61 62 63 64 65 66' 로 저장됨

마우스에 문구가 따라다니기

기본적인 기능

void CMouseMsgView::OnMouseMove(UINT nFlags, CPoint point)
{
	if ((nFlags & MK_LBUTTON) == MK_LBUTTON) { // 왼쪽 마우스 눌러진 상탱에서 움직임
		CMouseMsgDoc* pDoc = GetDocument();
		pDoc->m_x = point.x;
		pDoc->m_y = point.y;

		pDoc->SetModifiedFlag(); //문서가 수정되었다고 설정됨

		Invalidate();
	}
	CView::OnMouseMove(nFlags, point);
}

다른 버튼 누른 상태여도 왼쪽 버튼만 누르고 있으면 문구가 따라니게 됨

bool m_bMouseDown 플로우 추가

nFlags를 모를 때, 변수를 하나 만들어서 해당 플로우 만들기

특징

  • 윈도우 밖에서 마우스가 눌러졌을 때 작업되는 것을 방지함
  • 윈도우 밖에서 마우스를 땠을 때 작업되는 것을 방지함
  • 누른 상태에서 마우스를 윈도우 밖으로 나온다면, 누른 상태로 윈도우 안으로 들어가야 함

-----view.h

// 특성입니다.
public:
	CMouseMsgDoc* GetDocument() const;
	bool m_bMouseDown; // 변수 선언


해당 함수 추가하기

-----view.cpp

// CMouseMsgView 생성/소멸

CMouseMsgView::CMouseMsgView() noexcept
{
	// TODO: 여기에 생성 코드를 추가합니다.
	m_bMouseDown = false;
}
///////////////
void CMouseMsgView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	CMouseMsgDoc* pDoc = GetDocument();
	pDoc->m_x = point.x;
	pDoc->m_y = point.y;

	pDoc->SetModifiedFlag(); //문서가 수정되었다고 설정됨

	Invalidate(); // 현재 화면을 다시 그려라
	// WM_PAINT 메세지가 현재 나의 윈도우에 전달됨 -> OnDraw() 호출
	// RedrawWindow();와 같은 기능

	m_bMouseDown = true;

	CView::OnLButtonDown(nFlags, point);
}


void CMouseMsgView::OnMouseMove(UINT nFlags, CPoint point)
{
	// if ((nFlags & MK_LBUTTON) == MK_LBUTTON) { // 왼쪽 마우스 눌러진 상탱에서 움직임
	if(m_bMouseDown) {
		CMouseMsgDoc* pDoc = GetDocument();
		pDoc->m_x = point.x;
		pDoc->m_y = point.y;

		pDoc->SetModifiedFlag(); //문서가 수정되었다고 설정됨

		Invalidate();
	}

	CView::OnMouseMove(nFlags, point);
}


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

	CView::OnLButtonUp(nFlags, point);
}

마우스 캡쳐 기능 추가

해당 윈도우 밖으로 벗어나도 해당 문구가 마우스 좌표로 따라 오게 만들기

-----view.h

void CMouseMsgView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	CMouseMsgDoc* pDoc = GetDocument();
	pDoc->m_x = point.x;
	pDoc->m_y = point.y;

	pDoc->SetModifiedFlag(); //문서가 수정되었다고 설정됨

	Invalidate(); // 현재 화면을 다시 그려라
	// WM_PAINT 메세지가 현재 나의 윈도우에 전달됨 -> OnDraw() 호출
	// RedrawWindow();와 같은 기능

	m_bMouseDown = true;

	SetCapture(); // 윈도우 밖으로 나가도 마우스 좌표를 계속 따라다님

	CView::OnLButtonDown(nFlags, point);
}


void CMouseMsgView::OnMouseMove(UINT nFlags, CPoint point)
{
	//if ((nFlags & MK_LBUTTON) == MK_LBUTTON) { // 왼쪽 마우스 눌러진 상탱에서 움직임
	if(m_bMouseDown) {
		CMouseMsgDoc* pDoc = GetDocument();
		pDoc->m_x = point.x;
		pDoc->m_y = point.y;

		pDoc->SetModifiedFlag(); //문서가 수정되었다고 설정됨
		TRACE("%d %d\n", point.x, point.y); // 디버깅 상황에서 출력

		Invalidate();
	}

	CView::OnMouseMove(nFlags, point);
}


void CMouseMsgView::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	m_bMouseDown = false;
	ReleaseCapture(); // 마우스 좌표를 따라다니는 것을 풀어줌

	CView::OnLButtonUp(nFlags, point);
}
profile
내가 시작한 공부, 공유할 코드

0개의 댓글