一个五子棋程序
在构造函数中载入棋子位图!!
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调用的 后来换了成对话框资源也一样)我拖动消息框时 后面的主窗口棋盘上的子会乱绘制(如果是白的胜利的话全变黑的 如果是黑的胜利的话全变白的)
不是在拖动时会发生重绘吗 那按我的代码应该黑的是黑的 白的是白的啊 我用菜单的”关于“对话框拖动就不会有问题 反正发生别的重绘时棋盘上的子还是保持原样 不会有问题 只有这个胜利提示消息框拖动就会导致棋盘上的子乱绘 谁知道什么情况吗 我都快烦死了!!
在构造函数中载入棋子位图!!
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调用的 后来换了成对话框资源也一样)我拖动消息框时 后面的主窗口棋盘上的子会乱绘制(如果是白的胜利的话全变黑的 如果是黑的胜利的话全变白的)
不是在拖动时会发生重绘吗 那按我的代码应该黑的是黑的 白的是白的啊 我用菜单的”关于“对话框拖动就不会有问题 反正发生别的重绘时棋盘上的子还是保持原样 不会有问题 只有这个胜利提示消息框拖动就会导致棋盘上的子乱绘 谁知道什么情况吗 我都快烦死了!!
一方胜利后,你是如何处理的?
很可能改变了wzq数组,
这个错误与窗口描画没有关系,用该是逻辑错误 或 内存错误。