mfc_Paint_1 - 8BitsCoding/RobotMentor GitHub Wiki

// Dlg.h
private:
    char m_is_clicked = 0;
    CPoint m_prev_point;
// LBUTTON_DOWN
m_is_clicked = 1;
m_prev_point = point;
// LBUTTON_UP
m_is_clicked = 0;
// MOUSE_MOVE
if(m_is_clicked == 1) {
    CClientDC dc(this);
    dc.MoveTo(m_prev_point);        // ์‹œ์ž‘ ์ 
    dc.LineTo(point);               // ๋ ์ 

    m_prev_point = point;
}
else {

}

์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ํ•ด๋„ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง„๋‹ค.

์ด๋ฏธ์ง€

ํ•˜์ง€๋งŒ ๋ฌธ์ œ์ ์ด ์กด์žฌ

  1. ๋‚ด๊ฐ€ ๊ทธ๋ฆฌ๊ณ ์ž ํ•˜๋Š” ์˜์—ญ์ด ์ •ํ•ด์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค. -> ๊ทธ๋ฆด ์˜์—ญ์„ ์ง€์ •ํ•˜์ž.

  2. ํ™”๋ฉด์ด ๊ฐ€๋ ค์ง€๋ฉด ๊ทธ ๋ถ€๋ถ„์ด ์ง€์›Œ์ ธ ๋ฒ„๋ฆฐ๋‹ค. -> ๊ทธ๋ฆผ์„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์ž


๋‚ด๊ฐ€ ์ž‘์—…ํ•  ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž.

ํด๋ž˜์Šค ๋งˆ๋ฒ•์‚ฌ -> MFC ํด๋ž˜์Šค ์ƒ์„ฑ -> CWnd๋ฅผ ์ƒ์†ํ•˜๋Š” DrawWnd ์ƒ์„ฑ

์ด๋ฏธ์ง€

// DrawWnd.h
private:
    char m_is_clicked = 0;
    CPoint m_prev_point;
// DrawWnd.cpp
BEGIN_MESSAGE_MAP(DrawWnd, CWnd)
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
    ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
// DrawWnd::LBUTTON_DOWN
m_is_clicked = 1;
m_prev_point = point;
// DrawWnd::LBUTTON_UP
m_is_clicked = 0;
// DrawWnd::MOUSE_MOVE
if(m_is_clicked == 1) {
    CClientDC dc(this);
    dc.MoveTo(m_prev_point);        // ์‹œ์ž‘ ์ 
    dc.LineTo(point);               // ๋ ์ 

    m_prev_point = point;
}
else {

}
// Dlg.h
#include "DrawWnd.h"

// ...

private:
    DrawWnd m_draw_wnd;
// OnInitDialog()
m_draw_wnd.Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(10, 10, 300, 200), this, 25000);

์ด๋ฏธ์ง€

๋ฌธ์ œ๋Š” CRect()์„ ์–ธ์‹œ ๋งค๋ฒˆ ๋งค์ง๋„˜๋ฒ„ 10, 10, 300, 200์„ ์ง€์ •ํ•ด ์ค˜์•ผํ•˜๋Š”์ง€??

ํ•ด๊ฒฐ์ฑ…์€ ์žˆ๋‹ค.


๋ฆฌ์†Œ์Šค๋ทฐ -> ๋„๊ตฌ ์ƒ์ž -> ํ”ฝ์ฒ˜ ์ปจํŠธ๋กค ์ถ”๊ฐ€ -> Visible ์˜ต์…˜์„ False๋กœ -> ID๋ฅผ IDC_DRAW_RECT๋กœ

์ด๋ฏธ์ง€

// OnInitDialog()

CRect r;
// CWnd * p = GetDltItem(IDC_DRAW_RECT);
// p->GetWindowRect(r);
GetDlgItem(IDC_DRAW_RECT)->GetWindowRect(r);

m_draw_wnd.Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, r, this, 25000);

์ด๋ฏธ์ง€

์ž‰??? Client์˜์—ญ๊ณผ Window์˜์—ญ์˜ ์ฐจ์ด๋กœ ์ธํ•œ ์ด์ƒํ•œ ์ถœ๋ ฅ...

// OnInitDialog()

CRect r;
// CWnd * p = GetDltItem(IDC_DRAW_RECT);
// p->GetWindowRect(r);
GetDlgItem(IDC_DRAW_RECT)->GetWindowRect(r);
ScreenToClient(r);

m_draw_wnd.Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, r, this, 25000);

์ด๋ฏธ์ง€

์ด๋ ‡๊ฒŒ ๋„ฃ์œผ๋ฉด ๋งค๋ฒˆ ๋งค์ง๋„˜๋ฒ„๋ฅผ ๋„ฃ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.


๋งˆ์šฐ์Šค ์ฒ˜๋ฆฌ๋ฅผ ์ข€ ๋” ํ•ด๋ณด์ž.

// DrawWnd::LBUTTON_DOWN
m_is_clicked = 1;
m_prev_point = point;

SetCapture();

SetCapture(); : ๋‚ด ์œˆ๋„์šฐ๋ฅผ ๋ฒ—์–ด๋‚˜๋„ ๋งˆ์šฐ์Šค ๋ฉ”์‹œ์ง€๋ฅผ ๊ณ„์†(ReleaseCapture()๋ฅผ ๋ฐ›๊ธฐ ์ „ ๊นŒ์ง€) ๋ฐ›๊ฒ ๋‹ค.

// DrawWnd::LBUTTON_UP
m_is_clicked = 0;

ReleaseCapture();

๋ฉ”๋ชจ๋ฆฌ DC๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

// DrawWnd.h
private:
    char m_is_clicked = 0;
    CPoint m_prev_point;
    CImage m_image;

ํด๋ž˜์Šค ๋งˆ๋ฒ•์‚ฌ์—์„œ WM_CREATE ์ถ”๊ฐ€

// OnCreate
CRect r;
GetClientRect(r);

m_image.Crate(r.Width(), r.Height(), 32);

CDC * p_image_dc = CDC::FromHandle(m_image.GetDC());
p_image_dc->Rectangle(r);
m_image.ReleaseDC();
// DrawWnd::MOUSE_MOVE
if(m_is_clicked == 1) {
    CClientDC dc(this);

    HDC h_image_dc = m_image.GetDC();
    CDC * p_image_dc = CDC::FromHandle(h_image_dc);

    p_image_dc.MoveTo(m_prev_point);        // ์‹œ์ž‘ ์ 
    p_image_dc.LineTo(point);               // ๋ ์ 

    m_image.ReleaseDC();

    m_image.Draw(dc, 0, 0);

    m_prev_point = point;
}
else {

}
// OnPaint
m_image.Draw(dc, 0, 0);

์ด๋ฏธ์ง€