struct Image
{
CBitmap bmp;
bool hasPiece;//该位置是否有棋子
};int Left = 0, Top = 0;//本次点击位置
int TempLeft = 0, TempTop = 0;//临时保存上次点击的位置
CTest2Dlg::Image img[9][10];//棋盘数组(象棋棋盘,9 * 10个点)
CBitmap TempBmp;//临时保存上次保存位图
bool isFirst = true; //是否第一次点击棋盘
void CTest2Dlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default

CDialog::OnLButtonDown(nFlags, point);
if(point.x > 460 || point.y > 500) return;//点击位置在棋盘外 Left = (point.x - 21) / 50;
Top = 9 - point.y / 50;
if(!img[Left][Top].hasPiece && isFirst) return;//第一次点击,且点击处无棋子 isFirst = false; if(!isFirst && !img[Left][Top].hasPiece)//非第一次点击,并且点击处无棋子,则移动棋子
{
img[Left][Top].bmp.Attach(img[TempLeft][TempTop].bmp);
img[Left][Top].hasPiece = true; img[Left][Top].isBlack = false; img[TempLeft][TempTop].hasPiece = false;img[TempLeft][TempTop].isBlack = NULL;
img[TempLeft][TempTop].bmp.Detach();//不知道这地方怎么写,估计是本处出错。
isFirst = true; //移动棋子后,初始化为第一次点击
} Invalidate(false);//重绘

TempLeft = Left; TempTop = Top;//备份点击位置
}走其它棋子都没有问题,如本图:http://www.csharp123.cn/upload/2010-03/temp_10030917594335.jpg但走左下角的车时,就出现错误:http://www.csharp123.cn/upload/2010-03/temp_10030918027091.jpg单步调试到call    77D194A4的地方就停着不走了,各位高手帮忙看下,解决了加分。

解决方案 »

  1.   

    刚调试,发现ASSERT(m_hObject == NULL);这里出现了错误。
      

  2.   

    m_hObject为空,是不是位图重复加载了?当加载完位图,没有DeleteObject再次Load时会出现此问题。具体原因你可以看一下栈回溯。
      

  3.   

    竟然一语中的,前面确实多写了个img[0][0].bmp.GetBitmap(&Bitmap);
    栈中是CBitmap::GetBitmap(tagBITMAP * 0x0012f828) 处,加载位图时出错。
    后面循环的时候又加载了一次,把img[0][0].bmp.GetBitmap(&Bitmap);注释掉就没错误了。
    问题解决,谢谢,结帖。