实在搞不懂了。 有没有高手能帮忙看下啊。感谢了。快崩溃了。MFC APPCRASH

解决方案 »

  1.   

    http://pan.baidu.com/share/link?shareid=224160&uk=3036701836
      

  2.   

    思路。程序是基于对话框的。 CMFCDIALOG里。   点开始按钮的时候开始 游戏m_tetris.Init().创建一个600的定时器。 在定时器里重画游戏方块界面 。 检查游戏是否结束以及能不能消行。  
      

  3.   

    程序在开起来就会APPCRASH。在我的电脑有时候 会这样。我同学电脑 根本没法运行。 我WIN7 32 。我同学WIN7 64
      

  4.   

    1。对于 编译器的 报警, 应该处理。
    2。Brush 释放有问题。
    3。Paint 代码如下:
    void CMFCDlg::OnPaint() 
    {
    CPaintDC paintDC(this) ;
    CPen pen(PS_SOLID,1,RGB(255,255,255));
    HPEN oldPen;
    CBrush brush ;
    HBRUSH oldBrush ;
    brush.CreateSolidBrush(RGB(255,255,255)) ;
    oldPen=(HPEN)paintDC.SelectObject(pen) ;
    oldBrush = (HBRUSH)paintDC.SelectObject(brush.m_hObject) ;
    paintDC.Rectangle(&CRect(12,37,12+12*25,12+21*25)) ;
    // 换 brush 必须 先还原。
    paintDC.SelectObject(oldBrush);
    CBrush newBrush ;
    newBrush.CreateSolidBrush(RGB(255,0,0)) ;
    oldBrush = (HBRUSH)paintDC.SelectObject(newBrush.m_hObject) ;
    int i , j ;
    for (i = 0 ; i < 21 ; i++)
    {
    for (j = 0 ; j < 13 ; j ++)
    {
    if (m_tetris.m_bBigMap[i][j])
    {
    paintDC.Rectangle(CRect(12+j*25,12+i*25,37+j*25,37+i*25)) ;
    }
    }
    }
    paintDC.SelectObject(oldBrush) ;
    paintDC.SelectObject(oldPen) ;
    DeleteObject(pen) ;
    DeleteObject(brush) ;
    DeleteObject(newBrush) ;
    }
    3。同样 DrawMap:
    void CMFCDlg::DrawMap()
    {
    CClientDC dc(this) ;
    CPen pen(PS_SOLID,1,RGB(255,255,255)) ;//白色画笔
    HPEN oldPen ;
    HBRUSH oldBrush ;
    CBrush brush ;
    brush.CreateSolidBrush(RGB(255,255,255));
    oldPen = (HPEN) dc.SelectObject(pen) ;
    oldBrush = (HBRUSH)dc.SelectObject(brush.m_hObject) ;
    dc.Rectangle(CRect(12,12,12+13*25,12+21*25)) ;
    dc.Rectangle(CRect(350,37,350+25*5,37+25*6)) ; dc.SelectObject(oldBrush);
    CBrush newBrush ;
    newBrush.CreateSolidBrush(RGB(255,0,0)) ;
    oldBrush = (HBRUSH)dc.SelectObject(newBrush.m_hObject) ;
    int i , j ;
    for (i = 0 ; i < 21 ; i++) //画大地图
    {
    for (j = 0 ; j < 13 ; j ++)
    {
    if (m_tetris.m_bBigMap[i][j])
    {
    dc.Rectangle(CRect(12+j*25,12+i*25,37+j*25,37+i*25)) ;
    }
    }
    } for (i = 0 ; i < 5 ; i ++)
    {
    for (j = 0 ; j < 5 ; j ++)
    {
    if( m_tetris.m_bCurPiece[m_tetris.direction][i][j] )
    {
    dc.Rectangle(CRect(12+(j+m_tetris.jPos)*25,12+(i+m_tetris.iPos)*25,37+(j+m_tetris.jPos)*25,37+(i+m_tetris.iPos)*25)) ;
    }
    if ( m_tetris.m_bNextPiece[0][i][j] )
    {
    dc.Rectangle(CRect(350+j*25,37+i*25,375+j*25,62+i*25)) ;
    }
    }
    }
    dc.TextOut(360,30+5*25,"下一个方块") ;
    char score[16] ;
    itoa(m_nScore,score,10) ;
    CString s ;
    s = "分数: " ;
    s += score ;
    dc.TextOut(360,30+10*25,s) ;
    //
    dc.SelectObject(oldBrush) ;
    DeleteObject(pen) ;
    DeleteObject(brush) ;
    DeleteObject(newBrush) ;
    }
      

  5.   

    1.我 编译后,一运行就出错。看 callstack 发现是 SelectObject 出错。
    2。// 换 brush 必须 先还原。
    paintDC.SelectObject(oldBrush);
    这是规矩。 同时 防止 内存泄露。
    一旦一个 Object 被 选入后 是 delete 不 掉的。
    3。你的代码 还需 优化, 闪烁厉害。
      

  6.   

    嗯 。谢谢你了。 闪烁的问题 我再另外解决,听说用兼容DC的方法能解决。我试一下。一旦一个 Object 被 选入后 是 delete 不 掉的。  是不是说我后面那句DeleteObject(brush)根本就没有生效 ?
      

  7.   

    有没有一些比较好的关于调试的教程 ?  我只会设置断点,然后F5 ,或者F10,F11。 你说的CallStack我都不懂。  我先百度下CallStack吧。。
      

  8.   

    还是不行啊。我在选用新画刷之前 都恢复旧画刷了 。程序还是会崩溃。 Access Violation.
      

  9.   

    用Debug版,崩溃的时候查看callstack,就排查出错误语句。一般都是野指针和内存越界情况比较多。
      

  10.   

    注意
    编译器有 3个 报警。return true;
      

  11.   

    需要先SelectObject原来的,你才能DeleteObject(),否则DeleteObject失败