mfc_graph - 8BitsCoding/RobotMentor GitHub Wiki
// Dlg.h
private:
CImage m_image;
CDC m_image_dc;
CRect m_rect; // Client μμμ μ₯
CPoint m_center_pos;; // κ°μ΄λ° μ§μ μ μ₯
CBrush m_red_brush;
CPen m_grid_pen, m_sine_pen;
int m_step = 1;
// OnInitDialog()
m_image.Create(m_rect.Width(), m_rect.Height(), 32, 0);
m_image_dc.Attach(m_image.GetDC());
GetClientRect(m_rect);
m_center_pos = m_rect.CenterPoint();
SetBackgroundColor(RGB(0, 0, 0));
m_grid_pen.CreatePen(PS_DOT, 1, RGB(168, 168, 168));
m_sine_pen.CreatePen(PS_SOLID, 2, RGB(0, 200, 255));
m_red_brush.CreateSolidBrush(RGB(255, 0, 0));
m_image_dc.SelectObject(&m_red_brush);
SetTimer(1, 10, NULL);
// Dlg.cpp
#include <math.h>
#define PI 3.141592
// OnPaint
CPaintDC dc(this);
if(IsIconic()) // ...
else
{
m_image_dc.FillSolidRect(m_rect, RGB(0, 0, 0));
CPen *p_old_pen = m_image_dc.SelectObject(&m_grid_pen);
// m_image_dc.SetBkMode(TRANSPARENT);
// μμ§/μνμ μ μ μ μ΄κ³ μ μ μ¬μ΄μ¬μ΄ λ· λ°°κ²½μ(ν°μ)μ΄ λμ€κ² λ¨μΌλ‘ μ μ μ΄ λ§€μ° λ°μμ§λ€.
// λ·λ°°κ²½μμ μ κ±°νλ©΄ λ¨.
// dc.SetBkColor(RGB(0, 0, 0)); μ μ¨λ λμΌνκ² λμνλ€.
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); // μνμ
m_image_dc.SelectObject(&m_sine_pen);
int degree, x, y;
double radian;
for(x = 0; x < m_step; x++)
{
degree = x - m_center_pos.x;
radian = degree * PI / 180;
y = (int)(sin(radian) * -100) + m_center_pos.y; // 100μ κ³±νλ μ΄μ λ -1~ 1μ λ무 μμ κ°μ΄λΌμ κ°μ ν€μ°λ μΌμ νλ€.
if(x) {
m_image_dc.LineTo(x, y);
}
else {
m_image_dc.MoveTo(x, y);
}
}
/*
for(x = 0; x < m_rect.right; x++)
{
degree = x - m_center_pos.x;
radian = degree * PI / 180;
y = (int)(sin(radian) * -100) + m_center_pos.y; // 100μ κ³±νλ μ΄μ λ -1~ 1μ λ무 μμ κ°μ΄λΌμ κ°μ ν€μ°λ μΌμ νλ€.
if(x) {
m_image_dc.LineTo(x, y);
}
else {
m_image_dc.MoveTo(x, y);
}
}
*/
m_image_dc.Ellipse(x - 20, y - 20, x + 20, y + 20);
m_image_dc.SelectObject(p_old_pen);
m_image.Draw(dc, 0, 0);
}
// OnDestroy
m_grid_pen.DeleteObject();
m_sine_pen.DeleteObject();
m_image_dc.Detach();
m_image.ReleaseDC();
KillTimer(1);
// OnTimer
if(nIDEvent == 1)
{
if(m_step < m_rect_right) m_step++;
else m_step = 1;
Invalidate(FALSE);
}
// OnPaint
CPaintDC dc(this);
if(IsIconic()) // ...
else
{
m_image.Draw(dc, 0, 0);
}
// OnTimer
if(nIDEvent == 1)
{
m_image_dc.FillSolidRect(m_rect, RGB(0, 0, 0));
CPen *p_old_pen = m_image_dc.SelectObject(&m_grid_pen);
// m_image_dc.SetBkMode(TRANSPARENT);
// μμ§/μνμ μ μ μ μ΄κ³ μ μ μ¬μ΄μ¬μ΄ λ· λ°°κ²½μ(ν°μ)μ΄ λμ€κ² λ¨μΌλ‘ μ μ μ΄ λ§€μ° λ°μμ§λ€.
// λ·λ°°κ²½μμ μ κ±°νλ©΄ λ¨.
// dc.SetBkColor(RGB(0, 0, 0)); μ μ¨λ λμΌνκ² λμνλ€.
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); // μνμ
m_image_dc.SelectObject(&m_sine_pen);
int degree, x, y;
double radian;
for(x = 0; x < m_step; x++)
{
degree = x - m_center_pos.x;
radian = degree * PI / 180;
y = (int)(sin(radian) * -100) + m_center_pos.y; // 100μ κ³±νλ μ΄μ λ -1~ 1μ λ무 μμ κ°μ΄λΌμ κ°μ ν€μ°λ μΌμ νλ€.
if(x) {
m_image_dc.LineTo(x, y);
}
else {
m_image_dc.MoveTo(x, y);
}
}
/*
for(x = 0; x < m_rect.right; x++)
{
degree = x - m_center_pos.x;
radian = degree * PI / 180;
y = (int)(sin(radian) * -100) + m_center_pos.y; // 100μ κ³±νλ μ΄μ λ -1~ 1μ λ무 μμ κ°μ΄λΌμ κ°μ ν€μ°λ μΌμ νλ€.
if(x) {
m_image_dc.LineTo(x, y);
}
else {
m_image_dc.MoveTo(x, y);
}
}
*/
m_image_dc.Ellipse(x - 20, y - 20, x + 20, y + 20);
m_image_dc.SelectObject(p_old_pen);
if(m_step < m_rect_right) m_step++;
else m_step = 1;
Invalidate(FALSE);
}
κ³μ°κ³Ό κ΄λ ¨λ μ°μ°μ Timerμμνλκ² μ 리
OnPaintμ κ²½μ° μ€μ νλ‘κ·Έλ¨μ΄ μλ‘κ·Έλ €μ§νκ²½μ΄ λλ©΄ μ νμμλ μ°μ°μ λͺ¨λ μνν΄μΌνκΈ° λλ¬Έμ΄λ€.