c++ - 在 MFC 中绘制后更新显示

标签 c++ opengl mfc

我成功绘制了 Van Koch 雪花,但绘制后它没有立即显示。我必须最大化、向下还原或移动窗 Eloquent 能显示它。 input 是一个带有“F”、“+”、“-”、“[”、“]”的字符串。

//VanKoch Koch Snowflake
CString VanKochSnowflake("F++F++F");
CString VanKochSnowflakeRule("F-F++F-F");

//alpha Van Kochk
double alphaVanKockSnowflake =0;
double alphaVanKockSnowflake1 =PI/3;

Line dt;
void DrawLine(DiemThuc &p,double alpha, double d)
{
    DiemThuc pNew;
    pNew.x=p.x+cos(alpha)*d;
    pNew.y=p.y+sin(alpha)*d;
    dt.Draw(p.x,p.y,pNew.x,pNew.y);
    p.x=pNew.x;
    p.y=pNew.y;
}
void DrawFractalString(CString str)
{

    stack<double> Posx;
    stack<double> Posy;
    stack<double> Stacka;
    for(int i=0;i<str.GetLength();i++)
    {
        switch (str[i])
        {
        case 'F':case'L':case'R':
                DrawLine(p,alpha,d);break;
        case '+':
                alpha+=alpha1;break;
        case '-':
                alpha-=alpha1;break;
        case '[':
            {
                Posx.push(p.x);
                Posy.push(p.y);
                Stacka.push(alpha);
            }break;
        case ']':
            {
                p.x=Posx.top();Posx.pop();
                p.y=Posy.top();Posy.pop();
                alpha=Stacka.top();Stacka.pop();
            }break;
        default:
            break;
        }

    }

}
void Cbaitap1View::ThayTheChuoi()
{

    for(int i=1;i<=n;i++)
    {
        CString new_str("");
        for(int j=0;j<str.GetLength();j++)
        {
            sub = str[j];
            if(sub =='F' && state!=4 && state!=5)
                new_str += str_Rule;
            else
                if(sub=='L')
                    new_str+=str_Rule1;
                else
                    if(sub=='R')
                        new_str+=str_Rule2;
                    else
                        new_str += sub;
        }
        str=new_str;
    }   

}

void Cbaitap1View::OnDraw(CDC* /*pDC*/)
{
    Cbaitap1Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    wglMakeCurrent(m_hDC,m_hRC);
    glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(1,1,1,0);
    glColor3f(0,1,0);
    glPointSize(1);
    switch (state)
    {
        case 1:
            {
                n=D.SoN; 
                d=5;
                str = VanKochSnowflake;
                str_Rule = VanKochSnowflakeRule;
                alpha = alphaVanKockSnowflake;
                alpha1 = alphaVanKockSnowflake1;

                ThayTheChuoi();
                if(p.x!=0 && p.y!=0)
                    DrawFractalString(str);
            }break;
default:
            break;
    }

    glEnd();
    glFlush();
    SwapBuffers(::GetDC(GetSafeHwnd()));
    wglMakeCurrent(NULL,NULL);

}

void Cbaitap1View::OnVedt()
{

    D.DoModal();
    state=1;

    // TODO: Add your command handler code here
}

OnDraw 中我认为是错误的,但我无法修复它@@

最佳答案

您可能想在完成绘图后重绘窗口。

这是最小化和最大化时发生的情况。

你可以在这里阅读 abotu mfc 重绘: http://msdn.microsoft.com/en-us/library/0fdz8ey6(v=vs.90).aspx

如果您想尝试重绘您正在更改的控件,您可以在控件上调用 invalidate() ,它会重绘。

关于c++ - 在 MFC 中绘制后更新显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19974988/

相关文章:

c++ - 为什么在编译 mfc 应用程序时会出现此错误?

c++ - VS2010的std::shared_ptr和boost::shared_ptr的区别

c++ - 是否需要使用互斥锁来锁定 thread_local 变量?

c++ - 如何在不运行 'make install' 的情况下使用 OpenCV?

c++ - 在 XPlane 窗口之上强制 Qt 窗口

c++ - 我想为在树下选择的任何 child 获取树结构的完整路径。有没有可以使用的直接API?

c++ - 在CListCtrl上设置排序指示器正在清除列标题

c++ - 我需要/如何释放 wstring、wstringstream、 vector

c++ - OpenGL检测点击另一个对象内的对象

c++ - GLSL 330 矩阵计算错误{无编译错误}