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);
}