mfc_Paint_5 - 8BitsCoding/RobotMentor GitHub Wiki
๋ง์ฐ์ค ์ผ์ชฝ์ ์ ์์
๋ง์ฐ์ค ์ค๋ฅธ์ชฝ์ ์ฑ์ฐ๊ธฐ ์์์ผ๋ก ๋ณ๊ฒฝ
์ฐธ๊ณ ๋ก ListBox๋ ์ผ์ชฝ ๋ง์ฐ์ค์ ๋ํ ์ฒ๋ฆฌ๋ ๋ด๋นํ๋ ์ค๋ฅธ์ชฝ ๋ง์ฐ์ค์ ๋ํ ์ฒ๋ฆฌ๋ ์ง์ ๋ง๋ค์ด์ ์ฌ์ฉํด์ผํ๋ค.
class MyColorList : public TH_ListBox
{
public:
void DrawUserItem(CDC * ap_dc, RECT * ap_rect, int a_index, void * ap_data, unsigned char a_select_flag, unsigned char a_focus_flag)
{
COLORREF color = GetItemData(a_index);
if(color == 0xFFFFFFFF) {
ap_dc->SetTextColor(RGB(255, 200, 0));
ap_dc->DrawText(L"[X]", 3, ap_rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
} else {
CRect r(ap_rect->left + 2, ap_rect->top + 2, ap_rect->right - 2, ap_rect->bottom - 2);
ap_dc->FillSolidRect(r, color);
}
}
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == WM_RBUTTONDOWN) {
//CPoint pos(LOWWORD(lParam), HIWORD(lParam));
CPoint pos(GET_X_LPARM(lParam), GET_Y_LPARAM(lParam));
BOOL outside_flag = TRUE;
int index = itemFromPoint(pos, outside_flag);
if(outside_flag == FALSE) {
SetCurSel(index);
GetParent()->PostMessage(27001, index);
}
}
return TH_ListBox::WindowProc(message, wParam, lParam);
}
}
if(outside_flag == FALSE)
: ๋ฆฌ์คํธ ๋ฐ์ค ๋ฐ์ ํด๋ฆญํ๋ฉด FALSE๋ก ์๋ ๋ณํ๋๋ค.
ํด๋์ค ๋ง๋ฒ์ฌ๋ฅผ ํตํด์ 27001๋ฉ์์ง๋ฅผ ์ถ๊ฐํ๋ค.
// Dlg.h
afx_msg LRESULT Dlg::On27001(WPARAM wParam, LPARAM lParam)
{
m_brush_color = m_color_list.GetItemData(wParam);
m_draw_wnd.SetBrushColor(m_brush_color);
Invalidate(m_brush_rect);
return 0;
}
๊ทธ๋ฆผ์ ์ฝ๊ณ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์
// OnBnClickPngSaveBtn
whar_t name_filter[] = L"๋ชจ๋ ํ์ผ (*.*) |*.*|PNG ํ์ผ(*.png)|*.png||";
CFileDialog ins_dlg(FALSE, L"png", L"*.png", OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_OVERWRITEPROMPT, name_filter);
ins_dlg.m_ofn.nFilterIndex = 2;
if(IDOK == ins_dlg.DoMoal()) {
m_draw_wnd.SavePngImage(ins_dlg.GetPathName());
}
// DrawWnd
// SavePngImage(const wahr_t * ap_file_path)
m_image.Save(ap_file_path, Gdiplus::ImageFormatPNG);
ํ์ผ ์ ์ฅ ๋ค์ด์ผ๋ก๊ทธ ์์ฑ
// OnBnClickPngLoadBtn
whar_t name_filter[] = L"๋ชจ๋ ํ์ผ (*.*) |*.*|PNG ํ์ผ(*.png)|*.png||";
CFileDialog ins_dlg(TRUE, L"png", L"*.png", OFN_HIDEREADONLY | OFN_NOCHANGEDIR, name_filter);
ins_dlg.m_ofn.nFilterIndex = 2;
if(IDOK == ins_dlg.DoMoal()) {
m_draw_wnd.LoadPngImage(ins_dlg.GetPathName());
}
// LoadPngImage(const whar_t * ap_file_path)
m_image.Destroy();
m_image.ReleaseDC();
m_image.Destroy();
m_image.Load(ap_file_path);
m_image_dc.Attach(m_image.GetDC());
์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์!
์ ์ฒ๋ผ CImage๋ฅผ Destroy ํ ๋ค์ Attachํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ ์ ์ค๋ฅ๊ฐ ๋ฐ์
CImage๊ฐ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ฒ๋ผ DC๋ฅผ ๋์ฉํด์ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ฆฌ๊ณ ํ๋ ์ฉ๋๊ฐ ์๋๋ผ ์ค์ฒด๋ ์ด๋ฏธ์ง๋ง ๋ฐ์์์ ๊ทธ๋ฆฌ๋ ํด๋์ค์ด๊ธฐ๋๋ฌธ
์ด์ ๋ถํฐ๋ CDC๋ฅผ ์ง์ ๋ง๋ค์ด์ ๊ตฌํํ๋๋ก ๋ณ๊ฒฝํ๊ฒ ๋ค
// Dlg.h
private:
์ฐ์ ๊ธฐ์กด์ ์ฝ๋๋ฅผ ๋ณด์
// OnCreate
// ...
CRect r;
GetClientRect(r);
m_image.Create(r.Width(), r.Height(), 32);
m_temp_image.Create(r.Width(), r.Height(), 32);
m_image_dc.Attach(m_image_GetDC());
m_image_dc.FillSolidRect(r, RGB(255, 255, 255));
m_temp_dc.Attach(m_temp_image.GetDC());
m_temp_dc.SelectObject(&m_my_pen);
m_temp_dc.SelectObject(&m_my_brush);
CImage์ธ m_image, m_temp_image๋ฅผ ์์ฑ ํ
GetDC()๋ฅผ ํตํด์ dc์ ๋ณด๋ฅผ CDC์ธ m_image_dc, m_temp_dc์ ๋ฃ๋ ํํ
// OnCreate
// ...
CRect r;
GetClientRect(r);
m_image.Create(r.Width(), r.Height(), 32);
m_temp_image.Create(r.Width(), r.Height(), 32);
CClientDC dc(this);
m_image_dc.CreateCompatibleDC(&dc);
::SelectObject(m_image_dc, m_image);
//m_image_dc.Attach(m_image_GetDC());
m_image_dc.FillSolidRect(r, RGB(255, 255, 255));
m_temp_dc.CreateCompatibleDC(&dc);
::SelectObject(m_temp_dc, m_temp_image);
//m_temp_dc.Attach(m_temp_image.GetDC());
m_temp_dc.SelectObject(&m_my_pen);
m_temp_dc.SelectObject(&m_my_brush);
// OnDestroy
//m_temp_dc.Detach();
//m_temp_image.ReleaseDC();
m_temp_dc.DeleteDC();
//m_image_dc.Detach();
//m_image.ReleaseDC();
m_image_dc.DeleteDC();
m_my_pen.DeleteObject();
m_my_brush.DeleteObject();
// LoadPngImage(const wchar_t * ap_file_path)
{
m_image.Destroy();
m_image.Load(ap_file_path);
::SelectObject(m_image_dc, m_image);
Invalidate();
}
// OnPaint
CPaintDC dc(this);
dc.BitBlt(0, 0, m_image.GetWidth(), m_image.GetHeight(), &m_image_dc, 0, 0, SCROCOPY);
// m_image.Draw(dc, 0, 0);
๋ชจ๋ m_image.Draw๋ฅผ ๋ณ๊ฒฝํด์ผํจ.