[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์ง๋ ํฌ์คํ ์ ์ด์ด GDI+, ๋๋ธ ๋ฒํผ๋ง ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ๊ทธ๋ฆด ๊ฒ์ธ์ง์ ๋ํ ๋ด์ฉ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค. [MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #1 [MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #2 ๋ํ์ ์ด๋ป๊ฒ ๊ทธ๋ฆด ๊ฒ์ธ๊ฐ ์ฌ์ค ์ฒ์์๋ vector๋ฅผ ์ฌ์ฉํ์ฌ IFigure๋ฅผ ์ฐจ๋ก๋๋ก ๊ทธ๋ฆฌ๋๋ก ๊ตฌํํ์์ต๋๋ค. ์ด๋ ๊ฒ ๊ตฌํํ๋ฉด, ์ฌ๋ฌ ๋ํ์ ์์ฐจ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ๋ ํ ํน์ ๋ํ ํธ์ง์ด ๊ฐ๋ฅํด์ง๋๋ค. ๋๋ ์ญ์ ๋ ๊ฐ๋ฅํ๊ฒ ์ฃ ? ๋ค๋ก ๋๋๋ฆฌ๊ธฐ ์์ ๋ ๊ฐ๋ฅํด ๋ณด์ ๋๋ค. ํ์ง๋ง CropBox๋ฅผ ์ฌ์ฉํ์ฌ ๋ํ์ด ํธ์ง๋ ๊ฒฝ์ฐ, vector์ ์๋ ๋ํ์ ๋ค์ ๊ทธ๋ฆฌ๊ฒ ๋๋ฉด ์๋ณต ๋๊ฒ ์ฃ ? ๊ทธ๋์ ๋ณธ๋ฌธ์ ๊ทธ๋ฆผํ ํ๋ก์ ํธ์์๋ vector๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ๊ทธ๋๊ทธ๋ ์ถ๊ฐํ ๋ํ์ ์ด๋ฏธ์ง์ ๋ง ๊ทธ๋ฆฌ๊ธฐ ํํ๋ก ๊ตฌํํโฆ -
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #2
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #2
2021.01.04์ง๋ ํฌ์คํ ์ ์ด์ด ๊ทธ๋ฆผํ ํ๋ก์ ํธ๋ฅผ ์ด๋ป๊ฒ ์ค๊ณํ๋์ง ์ค๋ช ํ๊ฒ ์ต๋๋ค. [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; viโฆ -
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #1
[MFC] ๊ทธ๋ฆผํ(mspaint) ๋ง๋ค๊ธฐ ํ๋ก์ ํธ #1
2020.12.31๊ทธ๋ฆผํ(mspaint) ํ๋ก๊ทธ๋จ์ ๋ง๋ ๋ค? ํน์ ๊ทธ๋ฆผํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด ๋ณธ ๊ฒฝํ์ด ์์ผ์ ๊ฐ์? ์ฃผ์ ๋ก ๋ดค์ ๋ ํ๊ต ๊ณผ์ ๊ฐ์ ๋ณด์ ๋๋ค. ์ค๋ฌด์์๋ ๊ทธ๋ฆผํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๋ผ๋ ์ ๋ฌด๋ ๊ฑฐ์ ์์ ๊ฑฐ๋ผ ์๊ฐ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ํน์, ๊ทธ๋ฆผํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์์ผ์ ๊ฐ์? ์ฌ์ค ์ ๋ ๊ตณ์ด ๋ง๋ค ์๊ฐ์ ์ ํ์ต๋๋ค. ํ์ง๋ง ์ต๊ทผ ๊ทธ๋ฆผํ๊ณผ ์์ฃผ ๋น์ทํ ์ด๋ฏธ์ง ๋ทฐ์ด(image viewer) ๋ชจ๋์ ๊ฐ์ ํ๊ธฐ ์ํด ์ค๊ณ๋ฅผ ์๊ฐํ๋ค๊ฐ, '๊ทธ๋ฆผํ์ ๋ง๋ค์ด ๋ณผ๊น'๋ผ๋ ์๊ฐ์ด ๋ค์ด ๋ง๋ค๊ฒ ๋์ต๋๋ค. ๋ฐฉ๊ธ ์๊ธฐํ ์ด๋ฏธ์ง ๋ทฐ์ด๋ ์นด๋ฉ๋ผ์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฆฌ๊ณ (drawing), ๊ทธ ์์ ๊ฐ์ข ๋ํ(Line, Rectangle, Circle, CrossLine ๋ฑ)์ ๋ง๊ทธ๋ฆด(overlay) ์ ์๋ ๋ชจ๋์ ์๋ฏธํฉ๋๋ค. ํ๋/์ถ์(zโฆ -
[MFC] MFC์์ XLNT๋ฅผ ์ด์ฉํ ์์ (Excel)ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ (์์ ํฌํจ)
[MFC] MFC์์ XLNT๋ฅผ ์ด์ฉํ ์์ (Excel)ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ (์์ ํฌํจ)
2020.05.31์๊ฐ C#์์๋ Microsoft.Office.Interop.Excel dll์ ์ฌ์ฉํ์ฌ ๊ฐํธํ๊ฒ ์์ ํ์ผ์ ์ ๊ทผํ๊ณ , ๋ฐ์ดํฐ ์ฝ๊ณ ์ฐ๊ธฐ๊ฐ ํธ๋ฆฌํฉ๋๋ค. ํ์ง๋ง C++์ด๋ MFC๋ ์ ๊ณต๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค ๋ณด๋ ๋๋ฌด๋๋ ๋ถํธํฉ๋๋ค. ๊ตฌ๊ธ์ ๊ฒ์ํด๋ณด๋ฉด ๋๋ถ๋ถ Automation class(CXLEzAutomation)๋ฅผ ์ฌ์ฉํ ๋ฐฉ๋ฒ๋ค์ด ๋์ค๋๋ฐ์. Github ์ฃผ์๋ ๊ฐ๋ฐ์ ๋งํฌ๊ฐ ์์ด ์ ๋ฐ์ดํธ๋ ๋๋ ๊ฑด์ง, ๋ฒ๊ทธ๋ ์๋์ง ์ ์๊ฐ ์์ต๋๋ค. ๋๋ ์ง์ ํ์ผ์ ์ ๊ทผํ์ฌ ์ปค์คํฐ๋ง์ด์ฆ ๋ ํด๋์ค๋ฅผ ์ ๊ณตํ๋ ๊ฒ์๋ฌผ๋ ๋ณด์๋๋ฐ์. ์ด๊ฒ ์ญ์ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ผ๋ ๊ฐ, ๋ ์ด์ ์ ๋ฐ์ดํธ๊ฐ ์์ด ๋ฒ์ฉ์ฑ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ์ ์ญ์ ์ด๊ฒ ์ ๊ฒ ์๋ํด๋ณด๋ค๊ฐ XLNT ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๊ฒ๋์๊ณ , ๊ฐํธํ๊ฒ ์์ ํ์ผ ์ฝ๊ณ โฆ
๋๊ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.