mfc_mouse_click_2 - 8BitsCoding/RobotMentor GitHub Wiki


이미지

μ΄λ²ˆμ—λŠ” 이런 별 λͺ¨μ–‘μ˜ λ‹€κ°ν˜•μ„ 클릭 ν›„ λ“œλž˜κ·Έλ‘œ μ΄λ™ν•˜κ²Œ ν•˜κ³  μ‹Άλ‹€.

// Dlg.h
CRect m_rect;
char m_is_clicked = 0;
CPoint m_prev_pos;
CRgn m_star_rgn, m_Ellipse_rgn;
CBrush m_fill_brush;

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
BOOL CMFCApplication5Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 이 λŒ€ν™” μƒμžμ˜ μ•„μ΄μ½˜μ„ μ„€μ •ν•©λ‹ˆλ‹€.  μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ μ£Ό 창이 λŒ€ν™” μƒμžκ°€ 아닐 κ²½μš°μ—λŠ”
	//  ν”„λ ˆμž„μ›Œν¬κ°€ 이 μž‘μ—…μ„ μžλ™μœΌλ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
	SetIcon(m_hIcon, TRUE);			// 큰 μ•„μ΄μ½˜μ„ μ„€μ •ν•©λ‹ˆλ‹€.
	SetIcon(m_hIcon, FALSE);		// μž‘μ€ μ•„μ΄μ½˜μ„ μ„€μ •ν•©λ‹ˆλ‹€.

	// TODO: 여기에 μΆ”κ°€ μ΄ˆκΈ°ν™” μž‘μ—…μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

	m_rect.SetRect(10, 10, 100, 100);

	POINT star_pos[11] = { {101, 0}, {77, 77}, {0, 77}, {62, 125},
	{39, 201}, {101, 153}, {163, 201}, {138, 125}, {201, 77}, {124, 77}, {101, 0} };

	m_star_rgn.CreatePolygonRgn(star_pos, 11, ALTERNATE);
	// ALTERNATE : 별λͺ¨μ–‘ λ‚΄λΆ€λ₯Ό 클릭해도 λ¨ΉλŠ”λ‹€.

	m_fill_brush.CreateSolidBrush(RGB(0, 0, 0));
	// m_fill_brush : λ³„μ˜ ν…Œλ‘λ¦¬λ₯Ό κ·Έλ¦¬λŠ”λ° μ‚¬μš©ν•  λΈŒλŸ¬μ‰¬

	m_Ellipse_rgn.CreateEllipticRgn(210, 10, 300, 100);

	return TRUE;  // 포컀슀λ₯Ό μ»¨νŠΈλ‘€μ— μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ TRUEλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
}
void CMFCApplication5Dlg::OnPaint()
{
	CPaintDC dc(this); // 그리기λ₯Ό μœ„ν•œ λ””λ°”μ΄μŠ€ μ»¨ν…μŠ€νŠΈμž…λ‹ˆλ‹€.

	if (IsIconic())
	{
        // ...
	}
	else
	{
		// 원 그리기
		dc.PaintRgn(&m_Ellipse_rgn);

		// 별λͺ¨μ–‘ 그리기
		dc.PaintRgn(&m_star_rgn);
		dc.FrameRgn(&m_star_rgn, &m_fill_brush, 1, 1);
		// FrameRgn : λ„ν˜•μ˜ ν…Œλ‘λ¦¬ 색을 μ§€μ •
		// (λ¦¬μ¦Œμ§€μ •, λΈŒλŸ¬μ‰¬μ§€μ •, λΈŒλŸ¬μ‰¬μ˜ μ‚¬μ΄μ¦ˆ μ§€μ •(x, y) λͺ‡ ν•„μ…€λ‘œ 그릴지)

		// μ‚¬κ°ν˜• 그리기
		dc.Rectangle(m_rect);

		// CDialogEx::OnPaint();
	}
}
void CMFCApplication5Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	//if (point.x >= m_rect.left && point.y >= m_rect.top && 
	//	point.x <= m_rect.right && point.y <= m_rect.bottom)
	if(m_rect.PtInRect(point))
	{
		m_is_clicked = 1;		// μ‚¬κ°ν˜•
	}
	else if (m_star_rgn.PtInRegion(point)) {
		m_is_clicked = 2;		// 별
	}
	else if (m_Ellipse_rgn.PtInRegion(point)) {
		m_is_clicked = 3;		// 원
	}

	if (m_is_clicked)
	{
		m_prev_pos = point;
		SetCapture();
	}

	CDialogEx::OnLButtonDown(nFlags, point);
}

void CMFCApplication5Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	if (m_is_clicked) {
		m_is_clicked = 0;
		ReleaseCapture();
	}

	CDialogEx::OnLButtonUp(nFlags, point);
}
void CMFCApplication5Dlg::OnMouseMove(UINT nFlags, CPoint point)
{
	if (m_is_clicked) {
		CPoint move_pos;
		move_pos = point - m_prev_pos;
		if (m_is_clicked == 1) {
			m_rect = m_rect + move_pos;
			/*
			m_rect.left += move_pos.x;
			m_rect.top += move_pos.y;
			m_rect.right += move_pos.x;
			m_rect.bottom += move_pos.y;
			*/
		}
		else if (m_is_clicked == 2) {
			// μ•ˆλ¨ -> m_star_rgn = m_star_rgn + move_pos;
			m_star_rgn.OffsetRgn(move_pos);
		}
		else if (m_is_clicked == 3) {
			m_Ellipse_rgn.OffsetRgn(move_pos);
		}

		m_prev_pos = point;
		Invalidate();
	}

	CDialogEx::OnMouseMove(nFlags, point);
}