[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #4 (์์ ํฌํจ)
์ด์ ๊ทธ๋ฆผํ ํ๋ก์ ํธ์ ๋ง์ง๋ง ํฌ์คํ ์ ๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ MFC์์์ ๋์์ ์ค๋ช ํฉ๋๋ค. ๋ณธ๋ฌธ์ ํ๋จ์๋ ์ํ ์ฝ๋๊ฐ ์ฒจ๋ถ๋์ด ์์ผ๋ ์ฐธ๊ณ ํด์ฃผ์ธ์.
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #1
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #2
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #3
์บ๋ฒ์ค(Canvas) ์ด๊ธฐํ
์บ๋ฒ์ค๋ ํ์ฌ ๊ทธ๋ฆฌ๊ณ ์๋ ๊ฒ(m_canvasDuringDraw
)๊ณผ, ๋ง์ง๋ง์ผ๋ก ๊ทธ๋ฆฐ ๊ฒ์ ๋ฐฑ์
ํ๋ ๊ฒ(m_canvasAfterDrawing
) ๋ ๊ฐ๊ฐ ์๋ค๊ณ ์ค๋ช
ํ์ต๋๋ค. initializeCanvas()
ํจ์๋ ์บ๋ฒ์ค๋ฅผ Dialog ํฌ๊ธฐ๋งํผ ์์ฑํ๊ณ ํ์๊ฒ ์ฑ์ฐ๋ ์์
์ ์ํํฉ๋๋ค. ํจ์ ์ธ์๋ก Width, Height๋ฅผ ๋๊ฒจ ์์ ๋ก์ด ํฌ๊ธฐ๋ก ์์ฑํ๊ฒ ํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์
๋๋ค.
//ExamPaintDlg.h std::shared_ptr<Gdiplus::Bitmap> m_canvasAfterDrawing; std::shared_ptr<Gdiplus::Bitmap> m_canvasDuringDraw; //ExamPaintDlg.cpp void CExamPaintDlg::initializeCanvas() { CRect rect; this->GetClientRect(&rect); m_canvasAfterDrawing = std::make_shared<Bitmap>(rect.Width(), rect.Height()); m_canvasDuringDraw = std::make_shared<Bitmap>(rect.Width(), rect.Height()); Gdiplus::Graphics graphicsOfcanvasAfterDrawing(m_canvasAfterDrawing.get()); Gdiplus::Graphics graphicsOfcanvasDuringDraw(m_canvasAfterDrawing.get()); SolidBrush whiteBrush(Color(255, 255, 255, 255)); graphicsOfcanvasAfterDrawing.FillRectangle(&whiteBrush, 0, 0, rect.Width(), rect.Height()); graphicsOfcanvasDuringDraw.FillRectangle(&whiteBrush, 0, 0, rect.Width(), rect.Height()); }
์ด ํจ์๋ ํ๋ก๊ทธ๋จ ์ต์ด ์คํ ์ ํธ์ถ๋๋ OnInitDialog()
์ New ๋ฉ๋ด๋ฅผ ํด๋ฆญํ์ ๋ ํธ์ถ๋๋ OnFileNew()
์์ ์ฌ์ฉ๋ฉ๋๋ค.
BOOL CExamPaintDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // ... initializeCanvas(); return TRUE; // ํฌ์ปค์ค๋ฅผ ์ปจํธ๋กค์ ์ค์ ํ์ง ์์ผ๋ฉด TRUE๋ฅผ ๋ฐํํฉ๋๋ค. } void CExamPaintDlg::OnFileNew() { initializeCanvas(); Invalidate(FALSE); }
๋ง์ฐ์ค ์ด๋ฒคํธ
์ฌ์ค ๋ง์ฐ์ค ์ด๋ฒคํธ ๋ถ๋ถ์ด ์ ์ผ ๊น๋ค๋กญ์ต๋๋ค. ๋ง์ฐ์ค ์ด๋ฒคํธ๋ ์ผ์ชฝ ๋ฒํผ์ด ๋ด๋ ค๊ฐ์ ๋(LButtonDown)
, ์ผ์ชฝ ๋ฒํผ์ด ์ฌ๋ผ์์ ๋(LButtonUp)
๊ทธ๋ฆฌ๊ณ ๋ง์ฐ์ค๊ฐ ์์ง์ผ ๋(OnMouseMove)
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฐธ๊ณ ๋ก ๋ํ์ ์์ ์ ๊ณผ ๋ ์ ๋ ๊ฐ๋ง ์์ผ๋ฉด ๊ทธ๋ฆด ์ ์์ต๋๋ค.

์ผ์ชฝ ๋ฒํผ์ด ๋๋ ธ์ ๋(LButtonDown)
๋ฒํผ์ด ๋๋ฆฌ๋ฉด ์ขํ(Point)
๋ฅผ ๋ณด๊ดํ๊ณ , ๋์ค์ OnMouseMove()
์์ ํ์ฌ ์ปค์์ ์ด๋ ๋(Offset)
์ ๊ณ์ฐํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.

void CExamPaintDlg::OnLButtonDown(UINT nFlags, CPoint point) { if (m_figure == nullptr) return; m_pointOfLeftDown = point; m_isLButtonUp = false; //๋ํ์ ํด๋ฆญํด์ Moving ์ค์ด๋ผ๋ฉด ๋์ด๊ฐ๋๋ค. if (m_isInBound == true) { CDialogEx::OnLButtonDown(nFlags, point); return; } //๋ํ์ ๊ทธ๋ฆฌ๊ธฐ ์ํ ๋ ์ ์ ์ค์ ํฉ๋๋ค. m_figure->SetPoint(0, point.x, point.y); m_figure->SetPoint(1, point.x, point.y); m_isAddNewObject = true; //๋ง์ง๋ง์ ๊ทธ๋ ค์ง Canvas๋ฅผ ๋ฐฑ์
ํ๋ ๋ถ๋ถ. Gdiplus::Graphics memG(m_canvasAfterDrawing.get()); memG.DrawImage(m_canvasDuringDraw.get(), 0, 0, m_canvasDuringDraw->GetWidth(), m_canvasDuringDraw->GetHeight()); Invalidate(FALSE); CDialogEx::OnLButtonDown(nFlags, point); }
์ผ์ชฝ ๋ฒํผ์ด ์ฌ๋ผ์์ ๋(LButtonUp)
CropBox๋ ์กฐ๊ธ ๊น๋ค๋กญ์ต๋๋ค. ์๋ณธ ์ด๋ฏธ์ง์์ ์๋ผ๋ด๋ ์์ญ์ ์ค์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํ์ฌ ์์น ๊ธฐ์ค์ผ๋ก Crop ์์ญ์ ์ค์ ํ๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
void CExamPaintDlg::OnLButtonUp(UINT nFlags, CPoint point) { if (m_figure == nullptr) return; //CropBox๊ฐ ์ ํ๋์๊ณ ๋ํ์ ์ถ๊ฐํ๋ ์ค์ด๋ผ๋ฉด, //SetCropPoints๋ฅผ ํธ์ถํ์ฌ Crop ์์ญ์ ์ง์ ํฉ๋๋ค. if (m_isCropping == true && m_isAddNewObject == true) { std::shared_ptr<Figure::CropRectangle> crop = std::dynamic_pointer_cast<Figure::CropRectangle>(m_figure); crop->SetCropPoints(); } m_isAddNewObject = false; m_isLButtonUp = true; Invalidate(FALSE); CDialogEx::OnLButtonUp(nFlags, point); }
๋ง์ฐ์ค ์ปค์๊ฐ ์์ง์ผ ๋(OnMouseMove)
๋ง์ฐ์ค ์ปค์์ ๋ฐ๋ฅธ ๋์์ ์๋ฏธ๋ ์๋ ์ฝ๋์ ์ฃผ์์ผ๋ก ์ค๋ช ํฉ๋๋ค.
void CExamPaintDlg::OnMouseMove(UINT nFlags, CPoint point) { if (m_figure == nullptr) return; if (point.x < 0 || point.x > m_canvasDuringDraw->GetWidth() || point.y < 0 || point.y > m_canvasDuringDraw->GetHeight()) return; if (nFlags == MK_LBUTTON && m_isAddNewObject == true) { //์ผ์ชฝ ๋ฒํผ์ด ๋๋ ธ๊ณ ๋ง์ฐ์ค ์ปค์๊ฐ ์์ง์ฌ ๋ํ์ ๊ทธ๋ฆฌ๋ ์ค์ ์๋ฏธ. //๋ํ์ ๊ทธ๋ฆฌ๊ธฐ ์ํ ๋ ๋ฒ์งธ ํฌ์ธํธ๋ฅผ ์ง์ . m_figure->SetPoint(1, point.x, point.y); Invalidate(FALSE); } else if (nFlags == MK_LBUTTON && m_isAddNewObject == false && m_isInBound == true) { //์ผ์ชฝ ๋ฒํผ์ด ๋๋ ธ๊ณ , ๋ฒํผ์ด ํ๋ฒ ์ฌ๋ผ์์๊ณ , ์ปค์๊ฐ ๋ํ ๋ด์ ์์ผ๋ฏ๋ก //๋ํ์ ํด๋ฆญํด์ Dragging ์ค์ด๋ผ๋ ์๋ฏธ. //์์ ์ ๊ณผ ํ์ฌ ์ ๊ณผ์ ์ด๋ ๋์ ๊ณ์ฐ. Point offset; offset.X = point.x - m_pointOfLeftDown.x; offset.Y = point.y - m_pointOfLeftDown.y; m_figure->Drag(offset.X, offset.Y); Invalidate(FALSE); m_pointOfLeftDown.x = point.x; m_pointOfLeftDown.y = point.y; } else { //๋ํ์ ๊ทธ๋ฆฌ๊ฑฐ๋ ์์ง์ด๋ ์ค์ด ์๋๋ฏ๋ก //ํ์ฌ ๋ง์ฐ์ค ์ปค์๊ฐ ๋ํ ์์ ์๋์ง ํ์ธํ๊ณ , //์์น์ ๋ฐ๋ผ ์ปค์๋ฅผ ์ง์ . m_isInBound = m_figure->IsInBound(point.x, point.y); if (m_isInBound == true) SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZEALL)); else SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); } CDialogEx::OnMouseMove(nFlags, point); }
GDI+ ์ด๋ฏธ์ง ๋ถ๋ฌ์ค๊ธฐ/์ ์ฅํ๊ธฐ
์ด๋ฏธ์ง๋ฅผ ํ์ผ๋ก๋ถํฐ ๋ถ๋ฌ์ค๊ณ , ๋ถ๋ฌ์จ ์ด๋ฏธ์ง๋ฅผ m_canvasAfterDrawing
์ ๊ทธ๋ ค์ค๋๋ค.
void CExamPaintDlg::OnFileOpen() { CString filter = _T("Bitmap(*.BMP)|*.BMP|JPEG(*.JPG)|*.JPG|All Files(*.*)|*.*||"); CFileDialog dlg(TRUE, _T(""), _T(""), OFN_HIDEREADONLY, filter); if (dlg.DoModal() == IDOK) { Image* img = Image::FromFile(dlg.GetPathName()); m_canvasAfterDrawing = std::make_shared<Bitmap>(img->GetWidth(), img->GetHeight()); m_canvasDuringDraw = std::make_shared<Bitmap>(img->GetWidth(), img->GetHeight()); Graphics g(m_canvasAfterDrawing.get()); g.DrawImage(img, 0, 0, img->GetWidth(), img->GetHeight()); Invalidate(FALSE); } }
GDI+๋ก ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๋ ๋ถ๋ถ์ด ์กฐ๊ธ ๊น๋ค๋กญ์ต๋๋ค. ์ ์ฅํ๋ ์ด๋ฏธ์ง ํฌ๋งท์ ๋ฐ๋ผ CLSID ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
void CExamPaintDlg::OnFileSave() { CString filter = _T("Bitmap(*.BMP)|*.BMP|JPEG(*.JPG)|*.JPG|PNG Files(*.png)|*.png||"); CFileDialog dlg(FALSE, _T(""), _T(""), OFN_HIDEREADONLY, filter); if (dlg.DoModal() == IDOK) { CLSID clsid; CString extension = dlg.GetFileExt(); if (extension == _T("BMP")) CLSIDFromString(_T("{557cf400-1a04-11d3-9a73-0000f81ef32e}"), &clsid); else if (extension == _T("JPG")) CLSIDFromString(_T("{557cf401-1a04-11d3-9a73-0000f81ef32e}"), &clsid); else if (extension == _T("PNG")) CLSIDFromString(_T("{557cf406-1a04-11d3-9a73-0000f81ef32e}"), &clsid); m_canvasAfterDrawing.get()->Save(dlg.GetPathName(), &clsid, NULL); } }
์ ๋ฆฌ
์ด๋ฒ ๊ทธ๋ฆผํ ํ๋ก์ ํธ ์ ๋ฐ๋ผ์ค์ จ๋์? ์ ๊ฐ ๋ด๋ ์ค๋ช ์ด๋ ์ฝ๋์ ๋ถ์กฑํ ์ ์ด ๋ง์ ๋ณด์ ๋๋ค. ๊ทธ๋๋ ์ฒจ๋ถ๋ ์ํ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋์ถฉ ๊ฐ์ ์กํ๋ฆฌ๋ผ ์๊ฐ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฆฌ๋ง ์ดํดํ๋ฉด MFC๋ C#, ๋ค๋ฅธ UI ํ๋ซํผ์์๋ ๋์ผํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
'Programming > MFC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #3
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #3
2021.01.08 -
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #2
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #2
2021.01.04 -
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #1
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #1
2020.12.31 -
[MFC] MFC์์ XLNT๋ฅผ ์ด์ฉํ ์์ (Excel)ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ (์์ ํฌํจ)
[MFC] MFC์์ XLNT๋ฅผ ์ด์ฉํ ์์ (Excel)ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ (์์ ํฌํจ)
2020.05.31
๋๊ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.