[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