mfc_graph_advance_1 - 8BitsCoding/RobotMentor GitHub Wiki

이미지

그림을 그리기 위한 기본 세팅

// Dlg.h
CImage m_image;
CDC m_image_dc;

CRect m_rect;
CPoint m_center_pos;

CPen m_grid_pen, m_green_pen;
// Dlg.cpp
// OnInitDialog

GetClientRect(m_rect);
m_center_pos = m_rect.CenterPoint();
m_image.Crate(m_rect.Width(), m_rect.Height(), 32);
m_imgae_dc.Attach(m_image.GetDC());

m_grid_pen.CretaePen(PS_DOT, 1, RGB(168, 168, 168));
m_green_pen.CreatePen(PS_SOLID, 2, RGB(100, 255, 100));

SetBackgroundColor(RGB(0, 0, 0));
m_image_dc.SetBkColor(RGB(0, 0, 0));
// Destroy
m_image_dc.Detach();
m_image.Release();

m_grid_pen.DeleteObject();
m_green_pen.DeleteObject();
// OnPaint
CPaintDC dc(this);

if(ISIconic())
{
    // ...
}
else
{
    m_image(dc, 0 ,0);
}

x, y 축 그리기

// ShowGrid()
m_image_dc.SelectObject(&m_grid_pen);

m_image_dc.MoveTo(m_center_pos.x, 0);
m_image_dc.LineTo(m_center_pos.x, m_rect.bottom);

m_image_dc.MoveTo(0, m_center_pos.y);
m_image_dc.LineTo(m_rect.right, m_center_pos.y);
// Dlg.cpp
// OnInitDialog

GetClientRect(m_rect);
m_center_pos = m_rect.CenterPoint();
m_image.Crate(m_rect.Width(), m_rect.Height(), 32);
m_imgae_dc.Attach(m_image.GetDC());

m_grid_pen.CretaePen(PS_DOT, 1, RGB(168, 168, 168));
m_green_pen.CreatePen(PS_SOLID, 2, RGB(100, 255, 100));

SetBackgroundColor(RGB(0, 0, 0));
m_image_dc.SetBkColor(RGB(0, 0, 0));

ShowGrid();

원 그리기

// Dlg.cpp
// OnInitDialog

GetClientRect(m_rect);
m_center_pos = m_rect.CenterPoint();
m_image.Crate(m_rect.Width(), m_rect.Height(), 32);
m_imgae_dc.Attach(m_image.GetDC());

m_grid_pen.CretaePen(PS_DOT, 1, RGB(168, 168, 168));
m_green_pen.CreatePen(PS_SOLID, 2, RGB(100, 255, 100));

SetBackgroundColor(RGB(0, 0, 0));
m_image_dc.SetBkColor(RGB(0, 0, 0));

ShowGrid();

m_image_dc.SelectObject(&m_green_pen);
m_image_dc.SelectStockObject(NULL_BRUSH);
m_image_dc.Ellipse(m_center_pos.x - 200, m_cetner_pos.y - 200, m_center_pos.x + 200, m_cetner_pos.y + 200);

이미지


마우스 클릭 시 라인이 따라오게 만들기

// OnMouseMove
if(nFlags & MK_LBUTTON) {
    m_imgae_dc.FillSolidRect(m_rect, RGB(0, 0, 0));

    ShowGrid();

    m_image_dc.SelectObject(&m_green_pen);
    m_image_dc.SelectStockObject(NULL_BRUSH);
    m_image_dc.Ellipse(m_center_pos.x - 200, m_cetner_pos.y - 200, m_center_pos.x + 200, m_cetner_pos.y + 200);

    m_image_dc.MoveTo(m_center_pos);
    m_image_dc.LineTo(point);

    Invalidate(FALSE);
}

이미지


원과 직선의 교차점 표시하기

y = ax, a = tan(radian)

(point.y - m_center_pos.y) / (point.x - m_center_pos.x) = tan(radian)

radian = tan-1((point.y - m_center_pos.y) / (point.x - m_center_pos.x) = tan(radian))

// OnMouseMove
if(nFlags & MK_LBUTTON) {
    m_imgae_dc.FillSolidRect(m_rect, RGB(0, 0, 0));

    ShowGrid();

    m_image_dc.SelectObject(&m_green_pen);
    m_image_dc.SelectStockObject(NULL_BRUSH);
    m_image_dc.Ellipse(m_center_pos.x - 200, m_cetner_pos.y - 200, m_center_pos.x + 200, m_cetner_pos.y + 200);

    m_image_dc.MoveTo(m_center_pos);
    m_image_dc.LineTo(point);

    double radian = atan2(m_center_pos.y - point.y, point.x - m_center_pos.x);


    int ex = (int)(cos(radian) * 200 +m_center_pos.x);
    int ey = (int)(sin(radian) * -200 +m_center_pos.y);

    m_image_dc.SelectObject(&m_ywllow_pen);
    m_image_dc.Ellpise(ex - 10, ey - 10, ex + 10, ey + 10);

    int degree = (int)(radian * 180/ PI);

    if(degree < 0) degree = 360 + degree;

    CString str;
    str.Format(L"기울기 : %d도", degree);
    m_inmage_dc.SetTextColor(RGB(255,255,255));
    m_image_dc.TextOut(point.x, point.y, str);

    Invalidate(FALSE);
}

이미지


내부에 색칠하기

// OnInitDialog
m_pie_brush.CreateHatchBrush(HS_DIAGCROSS, RGB(255, 200, 0));
// OnMouseMove
if(nFlags & MK_LBUTTON) {
    m_imgae_dc.FillSolidRect(m_rect, RGB(0, 0, 0));

    ShowGrid();

    m_image_dc.SelectObject(&m_green_pen);
    m_image_dc.SelectStockObject(NULL_BRUSH);
    m_image_dc.Ellipse(m_center_pos.x - 200, m_cetner_pos.y - 200, m_center_pos.x + 200, m_cetner_pos.y + 200);

    m_image_dc.MoveTo(m_center_pos);
    m_image_dc.LineTo(point);

    double radian = atan2(m_center_pos.y - point.y, point.x - m_center_pos.x);

    int sx = (int)(cos(0) * 200 +m_center_pos.x);
    int sy = (int)(sin(0) * -200 +m_center_pos.y);

    int ex = (int)(cos(radian) * 200 +m_center_pos.x);
    int ey = (int)(sin(radian) * -200 +m_center_pos.y);

    m_image_dc.SelectObject(&m_ywllow_pen);
    m_image_dc.Ellpise(ex - 10, ey - 10, ex + 10, ey + 10);

    m_image_dc.SelectObject(&m_pie_brush);
    m_image_dc.Pie(m_center_pos.x - 180, m_cetner_pos.y - 180, m_center_pos.x + 180, m_cetner_pos.y + 180, sx, sy, ex, ey);

    int degree = (int)(radian * 180/ PI);

    if(degree < 0) degree = 360 + degree;

    CString str;
    str.Format(L"기울기 : %d도", degree);
    m_inmage_dc.SetTextColor(RGB(255,255,255));
    m_image_dc.TextOut(point.x, point.y, str);

    Invalidate(FALSE);
}

이미지