mfc_graph - 8BitsCoding/RobotMentor GitHub Wiki

sin ν•¨μˆ˜ 그리기

// 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의 경우 μ‹€μ œ ν”„λ‘œκ·Έλž¨μ΄ μƒˆλ‘œκ·Έλ €μ§ˆν™˜κ²½μ΄ 되면 μ € ν•„μš”μ—†λŠ” 연산을 λͺ¨λ‘ μˆ˜ν–‰ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

⚠️ **GitHub.com Fallback** ⚠️