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๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•จ.

์ด๋ฏธ์ง€