如第一幅图所示,显示了白棋胜的情形.当我将对话框游过白棋时,白棋就变成黑色.而对话框在其他地方游动的时候是不会改变它的颜色的.请问这是为什么?????

解决方案 »

  1.   

    大概是你的操作引起了重繪
    可能有一個bool值代表黑白 分出勝負之後 還沒點掉彈出的對話框 就把所有棋子都初始化為黑色了 當然只是我的推測 你的問題不太詳細
      

  2.   


                  OnDraw(CDC* pDC)     函数里面相关的代码
     
    //重画时显示存在的棋子


    CDC Dc;

    if(Dc.CreateCompatibleDC(pDC)==FALSE)

    AfxMessageBox("Can't create DC");

    for(int n=0;n<19;n++)
    {

    for(int m=0;m<19;m++)
    {

    if(wzq[n][m]==1)


    //显示白棋

    Dc.SelectObject(m_bmwhite);

    pDC->BitBlt(n*20+32,m*20+32,16,16,&Dc,0,0,SRCCOPY); 

    }

    else if(wzq[n][m]==-1)

    {

    //显示黑棋

    Dc.SelectObject(m_bmblack);

    pDC->BitBlt(n*20+32,m*20+32,16,16,&Dc,0,0,SRCCOPY); 

    }
    }
    }

    Dc.DeleteDC() ;  
    下棋操作的函数
       OnLButtonUp(UINT nFlags, CPoint point)
    { // TODO: Add your message handler code here and/or call default

    CDC *pDC=GetDC();

    CDC Dc;

    if(Dc.CreateCompatibleDC(pDC)==FALSE)

    AfxMessageBox("Can't create DC");     

    //是否在棋盘内    

    if(point.x>30&&point.x<410&&point.y>30&&point.y<410)

    {

    int px=(point.x-30)/20;

    int py=(point.y-30)/20;

    //是否已经有棋子

    if(colorwhite&&wzq[px][py]==0)

    {

    Dc.SelectObject(m_bmwhite);

    pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);     

    //表示存在白棋

    wzq[px][py]=1;

    //检查是否结束

    over(point);

    //换黑棋下

    colorwhite=false;

    }

    else if(wzq[px][py]==0)

    {

    Dc.SelectObject(m_bmblack);

    pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);     

    wzq[px][py]=-1;

    over(point);

    colorwhite=true;

    }

    }



    CView::OnLButtonUp(nFlags, point);



    } 检查是否获胜的函数:over(CPoint point)
    {//获取鼠标指向数组位置,即中心位置

    int x=(point.x-30)/20;

    int y=(point.y-30)/20;

    //计算开始判断的坐标 xx,yy

    int xx,yy;

        if(x<4)

    xx=0;

    else

    xx=x-4;

    if(y<4)

    yy=0;

    else

    yy=y-4;



    int i,j,a;

    //横向判断

    for(i=xx;i<15;i++)



    a=0;

    for(j=i;j<i+5;j++)

    {

    a=a+wzq[j][y];              

    //五个都是白棋

    if(a==5)

    {

    AfxMessageBox("白棋胜!");

    OnStart();//重新开始



    return;

    }

    //五个都是黑棋

    if(a==-5)

    {

    AfxMessageBox("黑棋胜!");
    OnStart();


    return;

    }

    }

    }

    //竖向判断

    for(i=yy;i<15;i++)



    a=0;

    for(j=i;j<i+5;j++)

    {

    a=a+wzq[x][j];              

    if(a==5)

    {

    AfxMessageBox("白棋胜!");

    OnStart();

    return;

    }

    if(a==-5)

    {

    AfxMessageBox("黑棋胜!");
    OnStart();


    return;

    }

    }

    }

    //向右下角

    //判断起点位置

    if(x<y)

    {

    if(xx==0)

    yy=y-x;

    }

    else

    {

    if(yy==0)

    xx=x-y;

    }

    //参数over=1时退出循环

    int over=0;

    do

    {

    a=0;

    for(i=0;i<5;i++)

    {

    if((xx+i)<19||(yy+i)<19)

    {

    a=a+wzq[xx+i][yy+i];

    if(a==5)

    {

    AfxMessageBox("白棋胜!");
    OnStart();
    return;

    }

    if(a==-5)

    {

    AfxMessageBox("黑棋胜!");
    OnStart();


    return;

    }

    }

    //到了边界

    else

    over=1;

    }

    xx+=1;

    yy+=1;                         

    }while(over==0);

    //向左下角

        if(y>(18-x))

    {

    if(x>13)

    {

    yy=y-(18-x);

    xx=18;

    }

    else

    {

    yy=y-4;

    xx=x+4;

    }

    }

    else

    {

    if(y<5)

    {

    xx=x+y;

    yy=0;

    }

    else

    {

    yy=y-4;

    xx=x+4;

    }

    }

        over=0;

    do

    {

    a=0;

    for(i=0;i<5;i++)

    {

    if((xx-i)>=0||(yy+i)<19)

    {     

    a=a+wzq[xx-i][yy+i];

    if(a==5)

    {

    AfxMessageBox("白棋胜!");
    OnStart();


    return;

    }

    if(a==-5)

    {

    AfxMessageBox("黑棋胜!");

    OnStart();
    return;

    }

    }

    //到了边界

    else

    over=1;

    }

    xx-=1;

    yy+=1;                         

    }while(over==0);



    }