mfc_Paint_3 - 8BitsCoding/RobotMentor GitHub Wiki

색상을 선택할 수 있게 ν•΄λ³΄μž.

리슀트 λ°•μŠ€λ₯Ό μΆ”κ°€ν•˜μ—¬ 색상을 μ„ νƒν•˜κ²Œ ν•΄λ³΄μž.

리슀트 λ°•μŠ€μ˜ μ˜΅μ…˜μ€ MultiColumn : True, OwnerDraw : Fixed둜 λ‘”λ‹€.

리슀트 λ°•μŠ€λŠ” 이전에 κ΅¬ν˜„ν•΄ λ‘” THListBoxλ₯Ό μ‚¬μš©ν•œλ‹€.

// Dlg.h
#include "TH_ListBox.h"

#ifdef _DEBUG
    #pragma comment(lib, "DSH_TH_LixBox.lib");
#else
    #pragma comment(lib, "RST_TH_LixBox.lib");
#endif

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);
        CRect r(ap_rect->left + 2, ap_rect->top + 2, ap_rect->right - 2, ap_rect->botom - 2);
        ap_dc->FillSolidRect(r, color);
    }
}
// Dlg.h
private:
    MyColorList m_color_list;
// OnInitDialog
m_color_list.SubclassDlgItem(IDC_COLOR_LIST, this);

이미지


색상을 μ„ νƒν•˜λ©΄ κ·Έ 색상을 λ°˜μ˜ν•˜κ²Œ λ³€κ²½

// Dlg.h
private:
    char m_draw_type = 1;
    char m_is_clicked = 0;
    CPoint m_prev_point;
    CImage m_image, m_temp_image;

    CPen m_my_pen;
DrawWnd::DrawWnd() : m_my_pen(PS_SOLID, 1, RGB(0, 0, 0))
{

}
// DrawWnd::OnDestroy
m_my_pen.DeleteObject();
// SetPenStyle(COLORREF a_color)
m_my_pen.DeleteObject();
m_my_pen.CreatePen(PS_SOLID, 1, a_color);

그림용 νŒ¬μ„ μ€€λΉ„ν•œλ‹€.

// OnLbnSelchangeColorList
int index = m_color_list.GetCurSel();
if(LB_ERR != index) {
    m_draw_wnd.SetPenStype(m_color_list.GetItemData(index));
}
// DrawWnd::MOUSE_MOVE
if(m_is_clicked == 1) {
    CClientDC dc(this);

    if(m_draw_type == PEN_MODE) {
        HDC h_image_dc = m_image.GetDC();
        CDC * p_image_dc = CDC::FromHandle(h_image_dc);

        CPen * p_old_pen = p_image_dc->SelectObject(&m_my_pen);
        p_image_dc.MoveTo(m_prev_point);        // μ‹œμž‘ 점
        p_image_dc.LineTo(point);               // 끝 점
        p_image_dc->SelectObject(p_old_pen);

        m_prev_point = point;
        m_image.ReleaseDC();
        m_image.Draw(dc, 0, 0);
    } else if(m_draw_type == LINE_MODE) {
        CDC * p_temp_dc = CDC::FromHandle(m_temp_image.GetDC());
        m_image.Draw(*p_temp_dc, 0, 0);

        CPen * p_old_pen = p_temp_dc->SelectObject(&m_my_pen);
        p_temp_dc->MoveTo(m_prev_point);        // μ‹œμž‘ 점
        p_temp_dc->LineTo(point);               // 끝 점
        p_temp_dc->SelectObject(p_old_pen);
        m_temp_image.ReleaseDC();
        m_temp_image.Draw(dc, 0, 0);
    } else if(m_draw_type == RECT_MODE) {
        CDC * p_temp_dc = CDC::FromHandle(m_temp_image.GetDC());

        m_image.Draw(*p_temp_dc, 0, 0);

        CPen * p_old_pen = p_temp_dc->SelectObject(&m_my_pen);
        CGdiObject *p_old_brush = p_temp_dc->SelectStockObject(NULL_BRUSH);
        p_temp_dc->Rectangle(m_prev_point.x, m_prev_point.y, point.x, point.y);
        p_temp_dc->SelectObject(p_old_brush);
        p_temp_dc->SelectObject(p_old_pen);

        m_temp_image.ReleaseDC();
        m_temp_image.Draw(dc, 0, 0);
    } else {

    }


}
else {

}

p_image_dc->SelectObject(&m_my_pen); 을 ν†΅ν•˜μ—¬ νŽœμ„ μ—°κ²°ν•œλ‹€.

// OnLButtonUp
if(m_is_clicked) {
    CDC * p_image_dc = CDC::FromHandle(m_image.GetDC());
    if(m_draw_type == LINE_MODE) {
        CPen * p_old_pen = p_image_dc->SelectObject(&m_my_pen);
        p_image_dc->MoveTo(m_prev_point);
        p_image_dc->LineTo(point);
        p_image_dc->SelectObject(p_old_pen);
    } else if (m_draw_type == RECT_MODE) {
        CPen * p_old_pen = p_image_dc->SelectObject(&m_my_pen);
        CGdiObject * p_old_brush = p_image_dc->SelectStockObject(NULL_BRUSH);
        p_image_dc->Rectangle(m_prev_point.x, m_prev_point.y, point.x, point.y);
        m_image_dc->SelectObject(p_old_brush);
        p_image_dc->SelectObject(p_old_pen);
    }
    m_image.ReleaseDC();

    m_is_clicked = 0;
    ReleaseCapture();
}

μ½”λ“œλ₯Ό μ’€ 더 κ°„λ‹¨νžˆ ν•΄λ³΄μž.

// Dlg.h
private:
    char m_draw_type = 1;
    char m_is_clicked = 0;
    CPoint m_prev_point;
    CImage m_image, m_temp_image;
    CPen m_my_pen;

    CDC m_image_dc, m_temp_dc;

CDCλ₯Ό μΆ”κ°€ν•œλ‹€.

// OnCreate
CRect r;
GetClientRect(r);

m_image.Create(r.Width(), r.Height(), 32);
m_temp_image.Create(r.Witdh(), r.Height(), 32);

m_image_dc.Attach(m_image.GetDC());
m_image_dc.FillSolidRect(r, RGB(255, 255, 255));

m_temp_dc.Attach(m_image.GetDC());
// OnDestroy
m_image_dc.Detach();
m_temp_dc.Detach();

m_image.ReleaseDC();
m_temp_image.ReleaseDC();
m_my_pen.DeleteObject();
// SetPenStyle
m_my_pen.DeleteObject();
m_my_pen.CreatePen(PS_SOLID, 1, a_color);

m_image_dc.SelectObject(&m_my_pen);
m_temp_dc.SelectObject(&m_my_pen);
// DrawWnd::MOUSE_MOVE
if(m_is_clicked == 1) {
    CClientDC dc(this);

    if(m_draw_type == PEN_MODE) {
        m_image_dc.MoveTo(m_prev_point);
        m_image_dc.LineTo(point);

        m_prev_point = point;
        m_image.Draw(dc, 0, 0);
    } else if(m_draw_type == LINE_MODE) {
        m_image.Draw(m_temp_dc, 0, 0);

        m_temp_dc.MoveTo(m_prev_point);
        m_temp_dc.LineTo(point);

        m_temp_image.Draw(dc, 0, 0);
    } else if(m_draw_type == RECT_MODE) {
        m_image.Draw(m_temp_dc, 0, 0);

        CGdiObject * p_old_brush = m_temp_dc.SelectStockObject(NULL_BRUSH);
        m_temp_dc.Rectangle(m_prev_point.x, m_prev_point.y, point.x, point.y);
        m_temp_dc.SelectObject(p_old_brush);

        m_temp_image.Draw(dc, 0, 0);
    } else {

    }
}
else {

}
// OnLButtonUp
if(m_is_clicked) {
    CDC * p_image_dc = CDC::FromHandle(m_image.GetDC());
    if(m_draw_type == LINE_MODE) {
        m_image_dc.MoveTo(m_prev_point);
        m_image_dc.LineTo(point);
    } else if (m_draw_type == RECT_MODE) {
        m_image_dc.Rectangle(m_prev_point.x, m_prev_point.y, point.x, point.y);
        m_image_dc.SelectObject(p_old_brush);
    }
    m_is_clicked = 0;
    ReleaseCapture();
}