mfc_SetPixel - 8BitsCoding/RobotMentor GitHub Wiki
450 x 450 ์ ์ฌ๊ฐํ์ SetPixel์ ํตํด์ ๊ทธ๋ ค๋ณด์.
CClientDC dc(this);
for(int y = 0; y < 400; y++) {
for(int x = 0; x < 450; x++) {
dc.SetPixel(x, y, RGB(0, 0, 255));
}
}
๊ทธ๋ ค๋ณด๋ฉด ์๊ฒ ์ง๋ง ์๋๊ฐ ์์ฒญ๋๊ฒ ๋๋ฆฌ๋ค.(๊ทธ๋ ค์ง๋๊ฒ ๋ณด์ผ์ ๋)
์๋๋ฅผ ์ฒดํฌํด๋ณด์.
CClientDC dc(this);
int start_tick = GetTickCount();
for(int y = 0; y < 400; y++) {
for(int x = 0; x < 450; x++) {
dc.SetPixel(x, y, RGB(0, 0, 255));
}
}
AddTimeToList(L"SetPixel ์ฌ์ฉ", GetTickCount() - start_tick);
void AddTimeToList(const wchar_t *ap_msg, int a_time_value)
{
CString str;
str.Format(L"%s : %d", ap_msg, a_time_value);
int index = m_msg_list.InsertString(-1, str);
m_msg_list.SetCurSel(index);
}
์ฐธ๊ณ ํ ์ ์ ํ๋์จ์ด ๊ฐ์์ด ๊ฐ๋ฅํ Direct2D์ ๊ฐ์ API๋ฅผ ์ฐ๋ฉด ์๋๊ฐ ํจ์ฌ ๊ฐ์ ๋๋ค๋ ์ .
๋จ, ํ๋์จ์ด ๊ฐ์์ด ๋ถ๊ฐ๋ฅํ ์ํฉ(์๋ฒ PC)์ ๊ฐ์๊ฒฝ์ฐ๋ ๊ฒฐ๊ตญ GDI๋ฅผ ์จ์ผํ๊ณ ๊ทธ๋ด๋ ์ด๋ป๊ฒ ์ต์ ํ ํ๋์ง์ ๋ํ ๋ฌธ์ ์ด๋ค.
SetPixelV ๋ผ๋ ํจ์๋ ์๋ค๋๋ฐ??
CClientDC dc(this);
for(int y = 0; y < 400; y++) {
for(int x = 0; x < 450; x++) {
dc.SetPixelV(x, y, RGB(0, 0, 255));
}
}
์๋๋ SetPixel๊ณผ ๊ฑฐ์ ์ฐจ์ด๊ฐ ์์...
์ด์งธ์ผ ํ๋????
๋ฉ๋ชจ๋ฆฌDC๋ฅผ ์จ๋ณด์.
// Dlg.h
private:
CImage m_my_image;
// Dlg.cpp
// OnInitDialog()
m_my_image.Create(450, 400, 32);
HDC h_dc = m_my_image.GetDC();
CDC *p_dc = CDC::FromHandle(h_dc);
m_my_image.Create(450, 400, 32);
: 32๋นํธ ์์์ 450 x 400์ ๋นํธ๋งต ์์ฑ
CDC *p_dc = CDC::FromHandle(h_dc);
: h_dc์์ ์์ ๊ฐ์ฒด๋ฅผ ๋ฐ์์์ CDC๋ฅผ ๋ง๋๋๋ฐ ์ด๋ฐ ๋ฐฉ์์ ์ํํ๋ค. ์ธ์ main thread์์ ์์๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
// Dlg.cpp
// OnInitDialog()
m_my_image.Create(450, 400, 32);
HDC h_dc = m_my_image.GetDC();
CDC dc;
dc.Attach(h_dc);
์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋๊ฒ์ด ๋ ์ ๋ฆฌ๋ค.
๋จ, ๋ค์ฐ๊ณ ๋๋ฉด
// OnDestroy()
dc.Detach();
m_my_image.ReleaseDC();
๋ฅผ ๊ผญ ํด์ค์ผ ํ๋ค.
DC๋ก ๊ทธ๋ ค๋ณด์.
CClientDC dc(this);
for(int y = 0; y < 400; y++) {
for(int x = 0; x < 450; x++) {
m_my_dc.SetPixel(x, y, RGB(0, 0, 255));
}
}
m_my_image.Draw(dc, 0, 0);
์๋๊ฐ ์์ฒญ๋๊ฒ ๋นจ๋ผ์ง๋ค. ์ด์ ๋??
SetPixel์ ์ง์ ๋ฌผ๋ฆฌ์ฅ์น์ ๊ทธ๋ฆฌ๋ ๊ฒ๊ณผ dc์ ๊ทธ๋ ค๋๊ณ ํ๋ฒ์ ๋ฟ๋ฆฌ๋ ๊ฒ์ด ์ฐจ์ด์ด๋ค.
๋ ๋น ๋ฅด๊ฒ ํด๋ณด์!
// Dlg.h
private:
unsigned int * mp_image_data;
// OnInitDlg
mp_image_data = (unsigned int *)m_my_image.GetBits();
(unsigned int *)m_my_image.GetBits();
: CImage์ ์์ ์ฃผ์๋ฅผ ๋ฐํ์ด๋ฐ์์ผ๋ก ํ๋ ์ด์ ๋ ๋นํธ๋งต์ด 32๋นํธ(a, r, g, b) ์ด๊ณ ๊ฐ ์์์ 8bits(1byte)๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ
BITMAP์์ ๋ฐ์์ ๋ณด์
// OnInitDlg
GetObject((HBITMAP)m_my_image, sizeof(BITMAP), &m_bmp_info);
mp_image_data = (unsigned int *)m_my_image.GetBits();
mp_image_data += m_bmp_info.bmWidthBytes / sizeof(unsigned int);
GetObject((HBITMAP)m_my_image, sizeof(BITMAP), &m_bmp_info);
: ๋นํธ๋งต ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.
CClientDC dc(this);
unsigned int *p = mp_image_data;
int count = m_bmp_info.bmWidth * m_bmp_info.bmHeight;
for(int i = 0; i < count; i++) {
// *p = 0xAARRGGBB
// CImage์ ์์๋ ์ํ, ๋ ๋, ๊ทธ๋ฆฐ, ๋ธ๋ฃจ ์
*p = 0x00FF0000;
p--;
// ๋นจ๊ฐ์์ ๊ณ์ ๋ฃ๋๋ค.
}
m_my_image.Draw(dc, 0, 0);
์์ฒญ๋ ์๋์ ๊ฐ์ ์ ๊ฐ์ ธ์จ๋ค.(0ms!!!)