mfc_Paint_2 - 8BitsCoding/RobotMentor GitHub Wiki

์ง์„ , ๋„ค๋ชจ ๊ทธ๋ฆฌ๊ธฐ

๋ผ๋””์˜ค ๋ฒ„ํŠผ์„ ํ†ตํ•ด์„œ ์ž์œ ์„  ๊ทธ๋ฆฌ๊ธฐ, ์ง์„  ๊ทธ๋ฆฌ๊ธฐ, ๋„ค๋ชจ ๊ทธ๋ฆฌ๊ธฐ ์ธ์ง€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€๊ฒฝํ•˜์ž.

์ด๋ฏธ์ง€

// Dlg.h
CButton m_pen_radio;
CButton m_line_radio;
CButton m_rect_radiao;
// OnInitDialog()
m_pen_radio.SetCheck(1);
// OnClickPEN
m_draw_wnd.SetDrawType(PEN_MODE);
// OnClickLINE
m_draw_wnd.SetDrawType(LINE_MODE);
// OnClickRECT
m_draw_wnd.SetDrawType(RECT_MODE);
// DrawWnd.h

#define PEN_MODE
#define LINE_MODE
#define RECT_MODE

private:
    char m_draw_type = 1;       // 1-์—ฐํ•„ / 2-์„  / 3-์‚ฌ๊ฐํ˜•

public:
    void SetDrawType(char a_type) {
        m_draw_type = a_type;
    }
// 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);
        p_image_dc.MoveTo(m_prev_point);        // ์‹œ์ž‘ ์ 
        p_image_dc.LineTo(point);               // ๋ ์ 
        m_prev_point = point;
        m_image.ReleaseDC();
        m_image.Draw(dc, 0, 0);
    } else if(m_draw_type == LINE_MODE) {
        m_image.Draw(dc, 0, 0);
        dc.MoveTo(m_prev_point);        // ์‹œ์ž‘ ์ 
        dc.LineTo(point);               // ๋ ์ 
    } else if(m_draw_type == RECT_MODE) {
        m_image.Draw(dc, 0, 0);

        CGdiObject *p_old_brush = dc.SelectStockObject(NULL_BRUSH);
        dc.Rectangle(m_prev_point.x, m_prev_point.y, point.x, point.y);
        dc.SelectObject(p_old_brush);
    } else {

    }


}
else {

}
// LBUTTON UP
if(m_is_clicked) {
    if(m_draw_type == LINE_MODE) {
        CDC * p_image_dc = CDC::FromHandle(m_image_GetDC());
        p_image_dc->MoveTo(m_prev_point);
        p_image_dc->LineTo(point);
        p_image.ReleaseDC();
    } else if (m_draw_type == RECT_MODE) {
        CDC * p_image_dc = CDC::FromHandle(m_image_GetDC());
        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);
        p_image_dc->SelectObject(p_old_brush);
        p_image.ReleaseDC();
    }
    m_is_clicked = 0;
    ReleaseCapture();
}

์ด๋ฏธ์ง€


์„ ๊ณผ ๋„ค๋ชจ๋ฅผ ๊ทธ๋ฆด๋•Œ ๊นœ๋นก์ž„์„ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด??

private:
    CImage m_image, m_temp_image;

m_temp_image๋ฅผ ์ถ”๊ฐ€

// OnCreate
CRect r;
GetClientRect(r);

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

CDC * p_image_dc = CDC::FromHandle(m_image.GetDC());
p_image_dc->Rectangle(r);
m_image.ReleaseDC();
// 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);
        p_image_dc.MoveTo(m_prev_point);        // ์‹œ์ž‘ ์ 
        p_image_dc.LineTo(point);               // ๋ ์ 
        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);

        p_temp_dc->MoveTo(m_prev_point);        // ์‹œ์ž‘ ์ 
        p_temp_dc->LineTo(point);               // ๋ ์ 
        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);

        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);

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

    }


}
else {

}