[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #2
์ง๋ ํฌ์คํ ์ ์ด์ด ๊ทธ๋ฆผํ ํ๋ก์ ํธ๋ฅผ ์ด๋ป๊ฒ ์ค๊ณํ๋์ง ์ค๋ช ํ๊ฒ ์ต๋๋ค.
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #1
Figure Interface ์ค๊ณ
๋จผ์ , ๋ํ ์ธํฐํ์ด์ค
์
๋๋ค. ๋ํ์๋ ์ , ์ฌ๊ฐํ, ์ํ, ๋ค๊ฐํ, ์ผ๊ฐํ, ํ์ดํ ๋ฑ ๋ค์ํ ๊ฒ๋ค์ด ์์ต๋๋ค. ์ธํฐํ์ด์ค๋ก IFigure
๋ฅผ ์ ์ธํ๊ณ , ๋ชจ๋ ๋ํ์ IFigure
๋ฅผ ์์๋ฐ๋๋ก ๋ง๋ญ๋๋ค. ์ธํฐํ์ด์ค์ ๋ชจ๋ ๊ตฌํ์ ์์๋ฐ๋ ๊ฐ ๋ํ ํด๋์ค์์ ํฉ๋๋ค.
์ธํฐํ์ด์ค IFigure
์ ์ ์ธ๋ถ.
class IFigure
{
public:
virtual void Draw(Gdiplus::Graphics* g) = 0;
virtual void Drag(const unsigned int x, const unsigned int y) = 0;
virtual void SetPoint(const unsigned int index, const int x, const int y) = 0;
virtual bool IsInBound(const unsigned int x, const unsigned int y) = 0;
virtual Gdiplus::Rect GetSize() const = 0;
protected:
Gdiplus::Point m_pointOfBegin;
Gdiplus::Point m_pointOfEnd;
};
์ธํฐํ์ด์ค IFigure
๋ฅผ ์์๋ฐ๋ Line
ํด๋์ค์ ์ ์ธ๋ถ.
class Line : public IFigure
{
public:
Line();
~Line();
public:
virtual void SetPoint(const unsigned int index, const int x, const int y) override;
virtual void Draw(Gdiplus::Graphics* g) override;
virtual bool IsInBound(const unsigned int x, const unsigned int y) override;
virtual void Drag(const unsigned int x, const unsigned int y) override;
virtual Gdiplus::Rect GetSize() const override;
};
Line
ํด๋์ค์ Draw()
ํจ์ ์ ์๋ถ.
void Line::Draw(Gdiplus::Graphics* g)
{
Pen pen(Color(255, 255, 0, 0), 1);
g->DrawLine(&pen, m_pointOfBegin.X, m_pointOfBegin.Y, m_pointOfEnd.X, m_pointOfEnd.Y);
}
์ดํด๋์๋์? Rectangle
ํด๋์ค๋ ๋ชจ๋ ๋์ผํ๋ฐ Draw()
ํจ์๋ง ๋ค๋ฆ
๋๋ค.
void Rectangle::Draw(Graphics* g)
{
Pen pen(Color(255, 255, 0, 0), 1);
Rect newRect = Rect(
min(m_pointOfBegin.X, m_pointOfEnd.X),
min(m_pointOfBegin.Y, m_pointOfEnd.Y),
abs(m_pointOfEnd.X - m_pointOfBegin.X),
abs(m_pointOfEnd.Y - m_pointOfBegin.Y));
g->DrawRectangle(&pen, newRect);
}
๊ทธ๋ฐ๋ฐ ๋์ค์ ๋ณด์ฌ์ค ๊ทธ๋ฆผํ ํ๋ก์ ํธ์ ์์ค๋ฅผ ๋ณด๋ฉด, IsInBound()
๋ Drag()
์ธ์ ๋ช ๊ฐ์ง ํจ์์ ์ฝ๋๊ฐ ๋ชจ๋ ๋์ผํ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ๋์ผํ ์ฝ๋๊ฐ ์ฌ๋ฌ ๊ตฐ๋ฐ์ ๋ณด์ธ๋ค๋ฉด, ์ด๋ ๋ค์ ์ค๊ณํ์ฌ ๋์ฑ ๊น๋ํ๊ฒ ์ ๋ฆฌํ ์ ์์ต๋๋ค. IFigure
๋ฅผ ์ธํฐํ์ด์ค๊ฐ ์๋ ์์ ํด๋์ค๋ก ๊ตฌํํ๊ฑฐ๋, IFigure
๋ฅผ ์์๋ฐ๋ ํด๋์ค์ ๊ตฌํํ๊ณ ์ด๋ฅผ ์์๋ฐ๋ ๋ํ ํด๋์ค๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ง์ด์ฃ . ํ์ง๋ง ๋ณธ๋ฌธ์ ํ๋ก์ ํธ๋ ์ฌ์ง๋ฅผ ๋จ๊ฒจ๋๊ณ ์งํํ๊ฒ ์ต๋๋ค.
Main Source์์ ์ถ์ ํด๋์ค์ ์ฌ์ฉ
์๋ฌดํผ, ์ด๋ ๊ฒ ์ถ์ ํด๋์ค๋ก ๊ตฌํํ ์ด์ ๋ ๋ฐ๋ก ์์ต๋๋ค. ๋ฉ์ธ ์์ค์์ ๊ฐ๊ฐ์ ๋ํ ํด๋์ค๋ฅผ ์ ์ํ๊ณ , ์ผ์ด์ค ๋ณ๋ก ์ฝ๋๋ฅผ ๊ตฌํํ๋ค๋ฉด ์์ฒญ ๋ณต์กํ ํ ๋ฐ์. ๊ทธ๋์ ๋ฉ์ธ ์์ค์์๋ ์ถ์ ํด๋์ค๋ง ์ ์ํ๊ณ ์ฌ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ExamPaintDlg.h
์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํฉ๋๋ค. ์ถ์ ํด๋์ค์ธ IFigure
๋ฅผ ์ค๋งํธ ํฌ์ธํฐ๋ก ์ฌ์ฉํ์ต๋๋ค.
std::shared_ptr<Figure::IFigure> m_figure;
ExamPaintDlg.cpp
์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํฉ๋๋ค. ์ ํ๋ ๋ํ์ ๋ฐ๋ผ ๊ฐ ๋ํ ํด๋์ค๋ฅผ ์์ฑํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ถ์ ํด๋์ค์ Draw()
ํจ์๋ฅผ ํธ์ถํ๋ฉด, ์์์ ๋ํ์ ๋ชจ์์ ๊ทธ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
void CExamPaintDlg::OnFiguresLine()
{
m_figure = std::make_shared<Figure::Line>();
}
void CExamPaintDlg::OnFiguresRectangle()
{
m_figure = std::make_shared<Figure::Rectangle>();
}
void CExamPaintDlg::OnFiguresCropbox()
{
m_figure = std::make_shared<Figure::CropRectangle>();
}
void CExamPaintDlg::OnDrawImage()
{
if (m_figure != nullptr)
m_figure->Draw(&memG);
}
๊ทธ๋ฐ๋ฐ CropRectangle
ํด๋์ค์ ๊ฒฝ์ฐ ์กฐ๊ธ ํน๋ณํ ๋์์ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๋ชจ๋ ํ๋์ IFigure
์ ์ ์ํ๋๋ฐ, CropRectangle
์ ์๋ฆฐ ์ด๋ฏธ์ง์ ์์ญ์ ์ง์ ํ๋ค๋ ๊ฐ ์๋ฆฐ ์ด๋ฏธ์ง๋ฅผ ์์ง์ด๋ ๋ฑ์ ๋ค๋ฅธ ๋์์ด ํ์ํฉ๋๋ค.
class CropRectangle : public Rectangle
{
public:
CropRectangle();
~CropRectangle();
public:
virtual bool IsInBound(const unsigned int x, const unsigned int y) override;
virtual void Drag(const unsigned int x, const unsigned int y) override;
virtual Gdiplus::Rect GetSize() const override;
void Draw(Gdiplus::Graphics* g, const bool isDrawBorder);
void Draw(Gdiplus::Graphics* g, Gdiplus::Image* image);
void SetCropPoints();
private:
Point m_pointOfBeginCrop;
Point m_pointOfEndCrop;
};
์ด ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ด ๋ค์ด ์บ์คํ
(Down Casting)
ํ ํจ์ ํธ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค.
std::shared_ptr<Figure::CropRectangle> crop = std::dynamic_pointer_cast<Figure::CropRectangle>(m_figure);
crop->SetCropPoints();
์ค๋งํธ ํฌ์ธํฐ์์๋ std::dynamic_pointer_cast
๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ด ์บ์คํ
์ ํ ์ ์์ต๋๋ค.
์ฝ๋๊ฐ ๋์ค๋ ์ ์ ๋ณต์กํด์ง๋๋ค. ์์ง๊น์ง๋ ์ค๋ช
์ด๋ '๊ทธ๋ ๊ตฌ๋~'ํ๊ณ ๋์ด๊ฐ์
๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ณ์ํด์ GDI+
์ ๋๋ธ ๋ฒํผ๋ง
์ ๊ดํ ์๊ฐ๋ก ๋ด์ฉ์ ์ด์ด๊ฐ๊ฒ ์ต๋๋ค.
'Programming > MFC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #4 (์์ ํฌํจ)
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #4 (์์ ํฌํจ)
2021.01.11 -
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #3
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #3
2021.01.08 -
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #1
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #1
2020.12.31 -
[MFC] MFC์์ XLNT๋ฅผ ์ด์ฉํ ์์ (Excel)ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ (์์ ํฌํจ)
[MFC] MFC์์ XLNT๋ฅผ ์ด์ฉํ ์์ (Excel)ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ (์์ ํฌํจ)
2020.05.31