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