2013-11-14 33 views
0

我成功繪製了Van Koch Snowflake,但是在繪製之後它不會立即顯示。我必須最大化,還原下移或移動窗口才能顯示它。輸入是一個帶有「F」,「+」,「 - 」,「[」,「]」的字符串。在MFC中繪製後更新顯示

//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中,但我不能修復它@@

回答

1

你可能想要做你的圖紙後重繪窗口。

這是您最小化和最大化時發生的情況。

您可以閱讀abotu MFC重繪這裏: http://msdn.microsoft.com/en-us/library/0fdz8ey6(v=vs.90).aspx

你應該想嘗試和重繪只是你正在改變,你可以調用無效()在控制的控制,它會重新繪製。