๋ฐ˜์‘ํ˜•

๋”๋ธ” ๋ฒ„ํผ๋ง์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๊ธ€์„ ์ฝ์–ด์ฃผ์„ธ์š”.


์ด๋ฒˆ์—๋Š” GDI ๋”๋ธ” ๋ฒ„ํผ๋ง ์‚ฌ์šฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ํ›„ OnDrawImage()๋ผ๋Š” ํ•จ์ˆ˜์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์‚ฌ์šฉ๋ฒ•

void CDoubleBufferingDlg::OnDrawImage()
{
	// Picture Control DC๋ฅผ ์ƒ์„ฑ.
	// IDC_PC_IMAGE๋Š” Picture Control์˜ Resource ID.
	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);

	// ์ž„์‹œ ๋ฒ„ํผ(memDC)์— ๊ทธ๋ฆฌ๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰.
	// ...
	// ...

	// ์ž„์‹œ ๋ฒ„ํผ๋ฅผ Picture Control์— ๊ทธ๋ฆฐ๋‹ค.
	dc.BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

	// ์ด์ „ ๋น„ํŠธ๋งต์œผ๋กœ ์žฌ์„ค์ •.
	memDC.SelectObject(pOldBitmap);

	// ์ƒ์„ฑํ•œ ๋ฆฌ์†Œ์Šค ํ•ด์ œ.
	memDC.DeleteDC();
	bitmap.DeleteObject();
}


์ด๋ฏธ์ง€๋‚˜ CrossLine, ๋„ํ˜•๊ฐ™์€ ๊ฒƒ์„ ๊ทธ๋ฆด ๋•Œ ํ‘œ์‹œํ•œ ๋ถ€๋ถ„์˜ ์œ„์น˜์—์„œ memDC์— ๊ทธ๋ฆฌ๋ฉด ๋”๋ธ” ๋ฒ„ํผ๋ง์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

OnDrawImage()๋ผ๋Š” ํ•จ์ˆ˜๋Š” OnPaint() ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์œ„์น˜์—์„œ ํ˜ธ์ถœํ•ด๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค.


โ€ป ์ฐธ๊ณ ๋กœ, ์œ„ ์˜ˆ์ œ๋Š” Picture Control ์ด๋ผ๋Š” Control์— ๊ทธ๋ฆฌ๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— CClientDC๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Custom UI ์ž‘์—… ์‹œ OnPaint์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” CPaintDC๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๋ฐ˜์‘ํ˜•