实在搞不懂了。 有没有高手能帮忙看下啊。感谢了。快崩溃了。MFC APPCRASH
解决方案 »
- windows程序设计画线问题 在线等
- 如何在VC中调用结构体?
- 关于TAPI的事@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- 各位高手,指点指点小妹吧,我写完了一个C,S,但我不知会有什么问题,比如线程安全等
- 将Cstring类中的内容转16进制(急急急)
- 三阶次样条如何转化成三次贝塞尔曲线?
- 我要将数据用图形方式显示出来,请问那有已写好的类可以用,100分献上
- 在ActiveX控件中引入窗体技术时报错
- 为什么LockBits给bitmapdata结构scan0分配的内存在unlockbits后不会自动释放。
- dc的设备描述表和兼容的设备描述表有什么区别
- 同一进程中的所有线程又只能使用同一个索引??????与前面的话不矛盾吗?????
- 用MFC做的俄罗斯方块经常会APPCRASH
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) ;
}
2。// 换 brush 必须 先还原。
paintDC.SelectObject(oldBrush);
这是规矩。 同时 防止 内存泄露。
一旦一个 Object 被 选入后 是 delete 不 掉的。
3。你的代码 还需 优化, 闪烁厉害。
编译器有 3个 报警。return true;