0

Van Koch Snowflake をうまく描きましたが、描いた直後には表示されません。ウィンドウを最大化するか、元に戻すか、ウィンドウを移動して表示する必要があります。入力は、"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 で間違っていると思うのですが、修正できません @@

4

1 に答える 1

1

描画を行った後、おそらくウィンドウを再描画したいと思うでしょう。

最小化と最大化を行うと、このようになります。

ここで abotu mfc redraw を読むことができます: http://msdn.microsoft.com/en-us/library/0fdz8ey6(v=vs.90).aspx

変更しているコントロールだけを再描画したい場合は、コントロールで invalidate() を呼び出すと、再描画されます。

于 2013-11-14T10:39:57.893 に答える