一个五子棋程序
在构造函数中载入棋子位图!!
CGobangView::CGobangView()
{
// TODO: add construction code here
m_hcurBlack = AfxGetApp ()->LoadCursor (IDC_CURSOR2);
m_hcurWhite = AfxGetApp ()->LoadCursor (IDC_CURSOR1); m_bmpWhite.LoadBitmap (IDB_WHITE);
m_bmpBlack.LoadBitmap (IDB_BLACK); //清理棋盘 数组值为0表示没有棋子
for (int i=0; i<15; i++)
for (int j=0; j<15; j++)
wzq[i][j] = 0;

//白棋先下
m_bWhite = TRUE;

在OnDraw函数中实现绘图棋子的绘制
void CGobangView::OnDraw(CDC* pDC)
{
CGobangDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
// Draw background
CBrush brush;
brush.CreateSolidBrush (RGB(0, 255, 255));
CRect rect;
GetClientRect (&rect);
pDC->FillRect (&rect, &brush);

/* //画棋盘
CPen pen;
CPen *pOldPen;
pen.CreatePen (PS_SOLID, 1, RGB (0, 0, 0));
pOldPen = pDC->SelectObject (&pen);
*/
for (int i=0; i<15; i++)
{
// 行
pDC->MoveTo (50, 50 + i*20);
pDC->LineTo (330, 50 + i*20);
// 列
pDC->MoveTo (50 + i*20, 50);
pDC->LineTo (50 + i*20, 330);
} // 重画时显示存在的棋子 数组值为1表示白棋  -1表示黑棋
CDC dc;
if (dc.CreateCompatibleDC (pDC) == FALSE)
MessageBox ("Can't create DC");
for (int n=0; n<15; n++)
for (int m=0; m<15; m++)
if (wzq[n][m] == 1)
{
dc.SelectObject (m_bmpWhite);
pDC->BitBlt (n*20+40, m*20+40, 160, 160, &dc, 0, 0, SRCCOPY);
} else if (wzq[n][m] == -1)
{
dc.SelectObject (m_bmpBlack);
pDC->BitBlt (n*20+40, m*20+40, 160, 160, &dc, 0, 0, SRCCOPY);
}
}
现在问题来了 程序在胜利的时候弹出一个消息框提示胜利 (消息框式用MessageBox调用的 后来换了成对话框资源也一样)我拖动消息框时 后面的主窗口棋盘上的子会乱绘制(如果是白的胜利的话全变黑的 如果是黑的胜利的话全变白的)
不是在拖动时会发生重绘吗 那按我的代码应该黑的是黑的 白的是白的啊 我用菜单的”关于“对话框拖动就不会有问题 反正发生别的重绘时棋盘上的子还是保持原样 不会有问题 只有这个胜利提示消息框拖动就会导致棋盘上的子乱绘  谁知道什么情况吗 我都快烦死了!!

解决方案 »

  1.   

    我估计是不是胜利以后wzq数组内容发生了变化了?
      

  2.   

    支持5楼
    一方胜利后,你是如何处理的?
    很可能改变了wzq数组,
      

  3.   

    要重点检查一下胜利后相关数组的赋值,MESSAGEBOX弹出移动会触发ONDRAW事件重新调用
      

  4.   

    MESSAGEBOX弹出移动后断点进OnDraw看看数组值是否改变,先测试看看再说问题,说不定就是这个问题,试一下又不要多长时间
      

  5.   

    我在OnDraw里设断点调试 程序直接死掉 不能操作 只能退出调试啊 
      

  6.   

    提示胜利消息框的时候,查一下 wzq[][]的内容。
    这个错误与窗口描画没有关系,用该是逻辑错误 或 内存错误。