[GDI] ์ด๋ฏธ์ง์ ์์ง์ด๋ ์ง์ ๊ทธ๋ฆฌ๊ธฐ
์ด๋ฏธ์ง์ ํน์ ํ(Row) ๋๋ ์ด(Column)์์ ํ๋กํ์ผ(Profile) ๋ฐ์ดํฐ๋ฅผ ํ๋ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์ต๋๋ค.
์ฃผ๋ก ์กฐ๋ช ๋๋ ์นด๋ฉ๋ผ์ ๊ท ์ผ๋, ์ด๋ฌผ ์ ๋ฌด ๋ฑ์ ๋ณด๊ธฐ ์ํจ์ธ๋ฐ์.
๋จ์ํ ์๋ํธ ์ปจํธ๋กค(Edit control)์ ๋ผ์ธ์ ์์น ๊ฐ์ ์ ๋ ฅํด์ ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์์ง๋ง,
์ฌ์ฉ์ ์ ์ฅ์์๋ ์คํฌ๋กค๋ฐ ๋๋ ์ฌ๋ผ์ด๋ ์ปจํธ๋กค์ ์ด์ฉํ์ฌ ํ๋กํ์ผ ๋ผ์ธ์ ์์ง์ด๋ ๋ฐฉ๋ฒ์ด ๋์ฑ ์ฌ์ฉํ๊ธฐ ํธ๋ฆฌํฉ๋๋ค.
์ด๋ฒ ๊ธ์์๋ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ฌ๋ผ์ด๋ ์ปจํธ๋กค๋ก Vertical Line์ ์์ง์ด๋ ์์ ๋ฅผ ๋ณด์ฌ๋๋ฆฌ๋ ค๊ณ ํฉ๋๋ค.
โป ์์ ์ฝ๋๋ ํ๋จ์ ์ฒจ๋ถ๋์ด ์์ต๋๋ค.
์ดํด๋ฅผ ๋๊ธฐ ์ํด ์๋ ๋งํฌ๋ฅผ ๊ผญ ์ฝ์ด์ฃผ์ธ์.
๋ฐ๋ผํ๊ธฐ
Dialog Base์ ํ๋ก์ ํธ๋ฅผ ์์ฑํด์ฃผ์ธ์. ์ด๋ฆ์ 'DoubleBuffering'์ผ๋ก ์ง์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ UI ๋ฐฐ์น๋ ๊ฐ๋จํ๊ฒ Button / Picture Control / Slider Control(Horizontal) ์ด๋ ๊ฒ 3๊ฐ๋ง ์ถ๊ฐํฉ๋๋ค.

ํค๋์ ์๋์ ๊ฐ์ด ๋ณ์์ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
// DobuleBufferingDlg.h public : CImage m_img; // ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํ CImage ๊ฐ์ฒด. int m_nPos; // Horizontal Slider Control์ ์์น. float m_fHorizontalRatio; // Picture Control๊ณผ ์ด๋ฏธ์ง์์ ๋ฐฐ์จ. void OnDrawImage(); // Double Buffering ๊ทธ๋ฆฌ๋ ์์
. void DrawVerticalLine(CDC* pDC); // Double Buffering ๋ด Vertical Line์ ๊ทธ๋ฆฌ๋ ์์
. void DrawImage(CDC* pDC); // Double Buffering ๋ด ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ฆฌ๋ ์์
.
๊ทธ๋ฆฌ๊ณ ๋ณ์๋ฅผ ์ด๊ธฐํ ํฉ๋๋ค.
// DoubleBufferingDlg.cpp CDoubleBufferingDlg::CDoubleBufferingDlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_DOUBLEBUFFERING_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_nPos = 0; m_fHorizontalRatio = 0; }
๋ฒํผ์ ๋๋ธ ํด๋ฆญํ์ฌ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์จ ํ ๊ทธ๋ ค์ง๋ Picture Control์ ํฌ๊ธฐ์ ์ด๋ฏธ์ง์ ํฌ๊ธฐ ๋น์จ์ ๊ณ์ฐํ์ฌ, ์ฌ๋ผ์ด๋ ์ปจํธ๋กค์ ๋ฒ์๋ฅผ ์ง์ ํฉ๋๋ค.
// DoubleBufferingDlg.cpp void CDoubleBufferingDlg::OnBnClickedBtnLoadimage() { // ์ด๋ฏธ์ง ๋ถ๋ฌ์ค๊ธฐ. m_img.Load(_T("test.jpg")); // Picture Control ํฌ๊ธฐ ์ป๊ธฐ. CRect rect; GetDlgItem(IDC_PC_IMAGE)->GetClientRect(&rect); // Picture Control ๊ฐ๋ก ํฌ๊ธฐ & ์ด๋ฏธ์ง ๊ฐ๋ก ํฌ๊ธฐ ๋น์จ ๊ณ์ฐํ๊ธฐ. m_fHorizontalRatio = (float)rect.Width() / m_img.GetWidth(); // Slider Control์ ๋ฒ์ ์ง์ ํ๊ธฐ. CSliderCtrl* pCtrl = (CSliderCtrl*)GetDlgItem(IDC_HSL_VERTICALLINE); pCtrl->SetRange(0, m_img.GetWidth()*m_fHorizontalRatio); //Invalidate(); }
์ด๋ฒ์๋ ๋๋ธ ๋ฒํผ๋ง์ผ๋ก ๊ทธ๋ฆฌ๋ ์์ ์ ์ ์ํฉ๋๋ค.
// DoubleBufferingDlg.cpp void CDoubleBufferingDlg::OnDrawImage() { // Picture Control DC๋ฅผ ์์ฑ. CClientDC dc(GetDlgItem(IDC_PC_IMAGE)); // Picture Control ํฌ๊ธฐ๋ฅผ ์ป๋๋ค. CRect rect; GetDlgItem(IDC_PC_IMAGE)->GetClientRect(&rect); CDC memDC; CBitmap *pOldBitmap, bitmap; // Picture Control DC์ ํธํ๋๋ ์๋ก์ด CDC๋ฅผ ์์ฑ. (์์ ๋ฒํผ) memDC.CreateCompatibleDC(&dc); // Picture Control์ ํฌ๊ธฐ์ ๋์ผํ ๋นํธ๋งต์ ์์ฑ. bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()); // ์์ ๋ฒํผ์์ ๋ฐฉ๊ธ ์์ฑํ ๋นํธ๋งต์ ์ ํํ๋ฉด์, ์ด์ ๋นํธ๋งต์ ๋ณด์กด. pOldBitmap = memDC.SelectObject(&bitmap); // ์์ ๋ฒํผ์ ๊ฒ์์์ผ๋ก ์ฑ์. memDC.PatBlt(0, 0, rect.Width(), rect.Height(), BLACKNESS); // ์์ ๋ฒํผ์ ๊ทธ๋ฆฌ๋ ๋์์ ์ํ. DrawImage(&memDC); DrawVerticalLine(&memDC); // ์์ ๋ฒํผ๋ฅผ Picture Control์ ๊ทธ๋ฆฐ๋ค. dc.BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY); // ์ด์ ๋นํธ๋งต์ผ๋ก ์ฌ์ค์ . memDC.SelectObject(pOldBitmap); // ์์ฑํ ๋ฆฌ์์ค ํด์ . memDC.DeleteDC(); bitmap.DeleteObject(); }
DrawImage()์ DrawVerticalLine()๋ ์ ์ํฉ๋๋ค.
// DoubleBufferingDlg.cpp void CDoubleBufferingDlg::DrawVerticalLine(CDC* pDC) { CRect rect; GetDlgItem(IDC_PC_IMAGE)->GetClientRect(&rect); // ๊ตต๊ธฐ 1, ๋นจ๊ฐ์, ์ค์ ์์ฑํ๊ธฐ. CPen *pOldPen, pen; pen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); pOldPen = pDC->SelectObject(&pen); pDC->MoveTo(m_nPos, 0); pDC->LineTo(m_nPos, rect.Height()); pDC->SelectObject(pOldPen); pen.DeleteObject(); } void CDoubleBufferingDlg::DrawImage(CDC* pDC) { CRect rect; GetDlgItem(IDC_PC_IMAGE)->GetClientRect(&rect); m_img.Draw(pDC->GetSafeHdc(), rect); }
๋ง์ง๋ง์ผ๋ก, 'Ctrl+Shift+X' ๋๋ 'Class Wizard'๋ฅผ ์คํํ์ฌ 'OnHScroll' ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค.

๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ค๋ฅผ ์์ ํฉ๋๋ค.
// DoubleBufferingDlg.cpp void CDoubleBufferingDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { CSliderCtrl* pCtrl = (CSliderCtrl*)GetDlgItem(IDC_HSL_VERTICALLINE); if (pScrollBar->GetSafeHwnd() == pCtrl->GetSafeHwnd()) { m_nPos = pCtrl->GetPos(); // OnPaint()์์ ๊ทธ๋ฆฌ๋ ์์
์ ํธ์ถํ๋ ๊ฒฝ์ฐ. //Invalidate(FALSE); // ์ง์ Picture Control์ ๊ทธ๋ฆฌ๋ ์์
์ ํธ์ถํ๋ ๊ฒฝ์ฐ. OnDrawImage(); } CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar); }
๋ชจ๋ ์์ ์ด ์๋ฃ๋์ต๋๋ค. Build๋ฅผ ํ๊ณ ์คํํด ๋ณผ๊น์?
OnPaint()์์ ํธ์ถํ๋ ๊ฒฝ์ฐ

OnDrawImage()๋ฅผ ์ง์ ํธ์ถํ๋ ๊ฒฝ์ฐ

ํน์ ์ฐจ์ด์ ์ด ๋๊ปด์ง์๋์?
OnPaint()์์ ํธ์ถํ๊ฒ ๋๋ฉด Picture Control ํ ๋๋ฆฌ๊ฐ ๋ฆฌํ๋ ์ฌ(Refresh) ๋๋ ๊ฒ์ด ๋ณด์ ๋๋ค.
๋ฐ๋ฉด OnDrawImage()๋ฅผ ์ง์ ํธ์ถํ๊ฒ ๋๋ฉด ๊ทธ๋ฐ ๋ฌธ์ ๊ฐ ์ ํ ์์ต๋๋ค.
๋ณดํต '๊ทธ๋ฆฌ๋ ์์ '์ด๋ผ๊ณ ํ๋ฉด OnPaint()์์ ์ฒ๋ฆฌํ๋ผ๊ณ ํ๋๋ฐ์.
OnPaint()์์ ๊ทธ๋ฆฌ๋ ์์ ์ ํธ์ถํ๋ ค๋ฉด Invalidate()๋ฅผ ํธ์ถํด์ผ ํ๋๋ฐ,
์ด ๊ฒฝ์ฐ ์ ์ฒด ์ปจํธ๋กค๋ค์ ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์ ๊น๋นก์ด๋ ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ ๋ ๋ ๋ฒ์งธ์ ๊ฐ์ด ๊ทธ๋ฆฌ๋ ํจ์๋ฅผ ์ง์ ํธ์ถํ๋ ํธ์ ๋๋ค.
'Programming > MFC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MFC] ์์ ์ ์ค๋ ๋์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ค๋ ๋ (1) | 2019.08.31 |
---|---|
[MFC] SendMessage์ PostMessage์ ์ฐจ์ด (์์ ์ฝ๋ ํฌํจ) (2) | 2019.08.26 |
[MFC] lib, dll ํด๋์ ํ์ผ ๋ชฉ๋ก ์ฝ๊ฒ ์ป๋ ๋ฐฉ๋ฒ (0) | 2019.05.25 |
[GDI+] ๋๋ธ ๋ฒํผ๋ง(Double Buffering) ์ฌ์ฉํ๊ธฐ (0) | 2019.02.28 |
[GDI] ๋๋ธ ๋ฒํผ๋ง(Double Buffering) ์ฌ์ฉํ๊ธฐ (2) | 2019.02.26 |
[GDI] ๋๋ธ ๋ฒํผ๋ง(Double Buffering) ์๊ฐ (0) | 2019.02.24 |
[GDI+] Part 2. ์๋ํจ์ (0) | 2019.01.27 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[MFC] SendMessage์ PostMessage์ ์ฐจ์ด (์์ ์ฝ๋ ํฌํจ)
[MFC] SendMessage์ PostMessage์ ์ฐจ์ด (์์ ์ฝ๋ ํฌํจ)
2019.08.26 -
[MFC] lib, dll ํด๋์ ํ์ผ ๋ชฉ๋ก ์ฝ๊ฒ ์ป๋ ๋ฐฉ๋ฒ
[MFC] lib, dll ํด๋์ ํ์ผ ๋ชฉ๋ก ์ฝ๊ฒ ์ป๋ ๋ฐฉ๋ฒ
2019.05.25 -
[GDI+] ๋๋ธ ๋ฒํผ๋ง(Double Buffering) ์ฌ์ฉํ๊ธฐ
[GDI+] ๋๋ธ ๋ฒํผ๋ง(Double Buffering) ์ฌ์ฉํ๊ธฐ
2019.02.28 -
[GDI] ๋๋ธ ๋ฒํผ๋ง(Double Buffering) ์ฌ์ฉํ๊ธฐ
[GDI] ๋๋ธ ๋ฒํผ๋ง(Double Buffering) ์ฌ์ฉํ๊ธฐ
2019.02.26
๋๊ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.