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 {
}
์ฌ๊ธฐ๊น์ง๋ง ํด๋ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง๋ค.
ํ์ง๋ง ๋ฌธ์ ์ ์ด ์กด์ฌ
๋ด๊ฐ ๊ทธ๋ฆฌ๊ณ ์ ํ๋ ์์ญ์ด ์ ํด์ ธ ์์ด์ผ ํ๋ค. -> ๊ทธ๋ฆด ์์ญ์ ์ง์ ํ์.
ํ๋ฉด์ด ๊ฐ๋ ค์ง๋ฉด ๊ทธ ๋ถ๋ถ์ด ์ง์์ ธ ๋ฒ๋ฆฐ๋ค. -> ๊ทธ๋ฆผ์ ๊ธฐ์ตํ๊ณ ์์
๋ด๊ฐ ์์ ํ ์๋์ฐ๋ฅผ ๋ง๋ค์ด ๋ณด์.
ํด๋์ค ๋ง๋ฒ์ฌ -> 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);