1.CList 用于存储每条路上的车辆,便于进行控制
2.路灯画在OnCreate 中,在ontimer 中进行控制
3.有专门的函数画车和画路,在ontimer 函数中调用
4.有几个函数实现车辆对路灯的判断和过马路以及控制车距功能(只有直行,拐弯还没做,传递指针为参数)
刚开始做的时候还没发现,等做完所有车辆直行后,发现运行一段时间后画面就白了,没反应了。
在网上搜了很多,有说指针问题的,可是我的指针用的很少的,只有过马路功能用的指针为参数,其他基本没用到指针。 求MFC 大神指教一下~~~~~
13 个解决方案
#1
也许是绘制的效率问题,资源问题。OnTimer定时多长时间执行一次?你有没有测试过你的代码性能
#2
仔细检查代码,估计存在资源泄漏
#3
正常情况下1000ms 刷新一次就好了, 但是测试的时候不想等那么久, 就调成了500ms,刚刚试了下1000ms,也是一样的结果。我其实也是刚学MFC 还不知道怎么测试代码的性能,很多东西都是摸索着写的。资源的话我就用了一个位图,表示车辆,然后画车的函数就用这个位图重复创建显示车辆。
#4
额,我才刚学MFC, 还不知道资源漏洞是怎么造成的,请问一下,资源漏洞一般会出现在哪些操作中呢?
#5
资源包括内存没有释放,gdi对象没有释放等等
#6
我刚刚找了找 我在oncreate 中写了这些画交通灯的代码,不知道是不是这的问题,您帮我看看?
int CTrafficView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CEdit* pEdit1 = new CEdit;
pEdit1->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(130, 180, 150, 200), this, 3);
SetDlgItemText(3, "绿");
CEdit* pEdit2 = new CEdit;
pEdit2->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(830, 180, 850, 200), this, 7);
SetDlgItemText(7, "绿");
CEdit* pEdit3 = new CEdit;
pEdit3->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(150, 80, 170, 100), this, 1);
SetDlgItemText(1, "绿");
CEdit* pEdit4 = new CEdit;
pEdit4->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(850, 80, 870, 100), this, 5);
SetDlgItemText(5, "绿");
CEdit* pEdit5 = new CEdit;
pEdit5->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(230, 200, 250, 220), this, 4);
SetDlgItemText(4, "绿");
CEdit* pEdit6 = new CEdit;
pEdit6->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(930, 200, 950, 220), this, 8);
SetDlgItemText(8, "绿");
CEdit* pEdit7 = new CEdit;
pEdit7->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(950, 100, 970, 120), this, 6);
SetDlgItemText(6, "绿");
CEdit* pEdit8 = new CEdit;
pEdit8->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(250, 100, 270, 120), this, 2);
SetTimer(1,500,NULL);
// SetTimer(2,1000,NULL);
return 0;
}
#7
OnCreate都是一次性的代码,不会重复申请。
你的OnTimer代码才是主要的,需要看一下是否有问题
你的OnTimer代码才是主要的,需要看一下是否有问题
#8
++
OnCreate即使泄漏也不会影响大局
#9
我刚刚找了下ontimer ,把所有准备注销的车辆对象都加上了析构操作,但是还是没解决额,不知道有没有其他的地方没找到,还希望您能帮忙看看啊。这里面很多重复的操作,等功能实现完了还要再抽象一下,先麻烦您啦~
void CTrafficView::OnTimer(UINT nIDEvent)
{
count++;
// TODO: Add your message handler code here and/or call default
if(count%14==0)
{
SetDlgItemText(2, "绿");
SetDlgItemText(3, "绿");
SetDlgItemText(6, "绿");
SetDlgItemText(7, "绿");
SetDlgItemText(1, "红");
SetDlgItemText(5, "红");
SetDlgItemText(4, "红");
SetDlgItemText(8, "红");
}
if(count%14==12)
{
SetDlgItemText(2, "红");
SetDlgItemText(3, "红");
SetDlgItemText(7, "红");
SetDlgItemText(6, "红");
SetDlgItemText(1, "绿");
SetDlgItemText(5, "绿");
SetDlgItemText(4, "绿");
SetDlgItemText(8, "绿");
}
/**************1号路*************************/
if(count%3==0) //每3秒产生一辆车
{
if(road1.GetCount()<rn1) //如果这条路上车还没满 添加一辆车
{
CCar car(0,175,5,false);
road1.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcr(3,&road1,130); //用于控制road1 中的车辆驶过路口
/**************6号路*************************/
if(count%3==0) //每3秒产生一辆车
{
if(road6.GetCount()<rn1) //如果这条路上车还没满 添加一辆车
{
CCar car(1080,102,2,false);
road6.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrXm(6,&road6,950);
/********************2号路*******************************/
if((!road4.IsEmpty())&&(road4.GetHead().x<=150))
{
road4.GetHead().~CCar();
road4.RemoveHead(); //1号路最前端车辆驶出1号路,从list中除去
CCar car(150,102,2,false);
road2.AddTail(car);
}
POSITION pos2 = road2.GetHeadPosition();
for(;pos2!=NULL;road2.GetNext(pos2))
{
road2.GetAt(pos2).x-=10;
}
if((!road2.IsEmpty())&&(road2.GetHead().x<=0))
{
road2.GetHead().~CCar();
road2.RemoveHead(); //2号路最前端车辆驶出2号路,从list中除去
}
/********************3号路*******************************/
if(road1.GetHead().x>=230)
{
road1.GetHead().~CCar();
road1.RemoveHead(); //3号路最前端车辆驶出3号路,从list中除去
CCar car(230,175,5,false);
road3.AddTail(car);
}
checkAcr(7,&road3,830);
/********************4号路*******************************/
if(road6.GetHead().x<850)
{
road6.GetHead().~CCar();
road6.RemoveHead(); //4号路最前端车辆驶出4号路,从list中除去
CCar car(850,102,2,false);
road4.AddTail(car);
}
checkAcrXm(2,&road4,250);
/********************5号路*******************************/
if((!road3.IsEmpty())&&(road3.GetHead().x>=930))
{
road3.GetHead().~CCar();
road3.RemoveHead(); //5号路最前端车辆驶出5号路,从list中除去
CCar car(930,175,5,false);
road5.AddTail(car);
}
POSITION pos5 = road5.GetHeadPosition();
for(;pos5!=NULL;road5.GetNext(pos5))
{
road5.GetAt(pos5).x+=10;
}
if((!road5.IsEmpty())&&(road5.GetHead().x>=1080))
{
road5.GetHead().~CCar();
road5.RemoveHead(); //6号路最前端车辆驶出6号路,从list中除去
}
/********************7号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road7.GetCount()<rn7) //如果这条路上车还没满 添加一辆车
{
CCar car(152,0,9,false);
road7.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYp(1,&road7,80);
/********************8号路*******************************/
if((!road10.IsEmpty())&&(road10.GetHead().y<=100))
{
road10.GetHead().~CCar();
road10.RemoveHead(); //7号路最前端车辆驶出7号路,从list中除去
CCar car(228,100,8,false);
road8.AddTail(car);
}
POSITION pos8 = road8.GetHeadPosition();
for(;pos8!=NULL;road8.GetNext(pos8))
{
road8.GetAt(pos8).y-=20;
}
if((!road8.IsEmpty())&&(road8.GetHead().y<=0))
{
road8.GetHead().~CCar();
road8.RemoveHead(); //8号路最前端车辆驶出8号路,从list中除去
}
/********************9号路*******************************/
if((!road7.IsEmpty())&&(road7.GetHead().y>180))
{
road7.GetHead().~CCar();
road7.RemoveHead(); //7号路最前端车辆驶出7号路,从list中除去
CCar car(152,180,9,false);
road9.AddTail(car);
}
POSITION pos9 = road9.GetHeadPosition();
for(;pos9!=NULL;road9.GetNext(pos9))
{
road9.GetAt(pos9).y+=20;
}
if((!road9.IsEmpty())&&(road9.GetHead().y>=600))
{
road9.GetHead().~CCar();
road9.RemoveHead(); //9号路最前端车辆驶出9号路,从list中除去
}
/********************10号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road10.GetCount()<rn10) //如果这条路上车还没满 添加一辆车
{
CCar car(228,600,8,false);
road10.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYm(4,&road10,200);
/********************11号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road11.GetCount()<rn7) //如果这条路上车还没满 添加一辆车
{
CCar car(852,0,13,false);
road11.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYp(5,&road11,80);
/********************12号路*******************************/
if((!road14.IsEmpty())&&(road14.GetHead().y<=100))
{
road14.GetHead().~CCar();
road14.RemoveHead(); //11号路最前端车辆驶出7号路,从list中除去
CCar car(928,100,12,false);
road12.AddTail(car);
}
POSITION pos12 = road12.GetHeadPosition();
for(;pos12!=NULL;road12.GetNext(pos12))
{
road12.GetAt(pos12).y-=20;
}
if((!road12.IsEmpty())&&(road12.GetHead().y<=0))
{
road12.GetHead().~CCar();
road12.RemoveHead(); //1号路最前端车辆驶出1号路,从list中除去
}
/********************13号路*******************************/
if((!road11.IsEmpty())&&(road11.GetHead().y>180))
{
road11.GetHead().~CCar();
road11.RemoveHead(); //11号路最前端车辆驶出11号路,从list中除去
CCar car(852,180,13,false);
road13.AddTail(car);
}
POSITION pos13 = road13.GetHeadPosition();
for(;pos13!=NULL;road13.GetNext(pos13))
{
road13.GetAt(pos13).y+=20;
}
if((!road13.IsEmpty())&&(road13.GetHead().y>=600))
{
road13.GetHead().~CCar();
road13.RemoveHead(); //13号路最前端车辆驶出13号路,从list中除去
}
/********************14号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road14.GetCount()<rn10) //如果这条路上车还没满 添加一辆车
{
CCar car(928,600,12,false);
road14.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYm(8,&road14,200);
Invalidate();
CView::OnTimer(nIDEvent);
}
#10
OnDraw中干了什么呢?
OnTimer中都是汽车的增减,没有使用new申请空间,似乎没什么问题
OnTimer中都是汽车的增减,没有使用new申请空间,似乎没什么问题
#11
我ondraw中什么都没做 都放到onpaint 中了。。。在onpaint 中调用画车的函数把所有路上的车画了出来,别的也没干什么。 我怀疑我是不是问题出在画车的函数中呢,我好想只有选中,没有删除哎 ,因为画车 的函数是单独放在一个方法里,在onpaint 中调用,没有CDC 句柄,就在网上找了下面这种实现方式, 不知道是不是产生问题的地方啊。才学1个星期多一点 ,最近在赶这个课程设计,很多东西都是模模糊糊的,还望指点一下啊。
void CTrafficView::drawCar(int x, int y)
{
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);
HDC MemDC;
CBitmap bit;
MemDC =CreateCompatibleDC(0);
bit.LoadBitmap(IDB_BITMAP1);
SelectObject(MemDC,bit);
CClientDC dc(this);
BitBlt(dc.m_hDC,x,y,bmpInfo.bmWidth,bmpInfo.bmHeight,MemDC,0,0,SRCCOPY);
// MemDC.SelectObject(pOldBitmap);
// MemDC.DeleteDC(); //删除DC
// bmpInfo.DeleteObject();
}
#12
你这里需要把bmp,bit,MemDC,dc都释放掉。
#13
果然是drawcar 函数的问题,终于解决了,感谢你们!
代码贴出来和大家分享一下~
void CTrafficView::drawCar(int x, int y)
{
// load IDB_BITMAP1 from our resources
CDC *pDC;
pDC=GetDC();
CBitmap bmp;
if (bmp.LoadBitmap(IDB_BITMAP1))
{
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);
CRect rect;
GetClientRect(&rect);
pDC->BitBlt(x, y, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
0, 0, SRCCOPY);
dcMemory.SelectObject(pOldBitmap);
}
else
TRACE0("ERROR: Where's IDB_BITMAP1?\n");
ReleaseDC(pDC);
}
#1
也许是绘制的效率问题,资源问题。OnTimer定时多长时间执行一次?你有没有测试过你的代码性能
#2
仔细检查代码,估计存在资源泄漏
#3
正常情况下1000ms 刷新一次就好了, 但是测试的时候不想等那么久, 就调成了500ms,刚刚试了下1000ms,也是一样的结果。我其实也是刚学MFC 还不知道怎么测试代码的性能,很多东西都是摸索着写的。资源的话我就用了一个位图,表示车辆,然后画车的函数就用这个位图重复创建显示车辆。
#4
额,我才刚学MFC, 还不知道资源漏洞是怎么造成的,请问一下,资源漏洞一般会出现在哪些操作中呢?
#5
资源包括内存没有释放,gdi对象没有释放等等
#6
我刚刚找了找 我在oncreate 中写了这些画交通灯的代码,不知道是不是这的问题,您帮我看看?
int CTrafficView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CEdit* pEdit1 = new CEdit;
pEdit1->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(130, 180, 150, 200), this, 3);
SetDlgItemText(3, "绿");
CEdit* pEdit2 = new CEdit;
pEdit2->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(830, 180, 850, 200), this, 7);
SetDlgItemText(7, "绿");
CEdit* pEdit3 = new CEdit;
pEdit3->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(150, 80, 170, 100), this, 1);
SetDlgItemText(1, "绿");
CEdit* pEdit4 = new CEdit;
pEdit4->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(850, 80, 870, 100), this, 5);
SetDlgItemText(5, "绿");
CEdit* pEdit5 = new CEdit;
pEdit5->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(230, 200, 250, 220), this, 4);
SetDlgItemText(4, "绿");
CEdit* pEdit6 = new CEdit;
pEdit6->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(930, 200, 950, 220), this, 8);
SetDlgItemText(8, "绿");
CEdit* pEdit7 = new CEdit;
pEdit7->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(950, 100, 970, 120), this, 6);
SetDlgItemText(6, "绿");
CEdit* pEdit8 = new CEdit;
pEdit8->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER | ES_READONLY ,
CRect(250, 100, 270, 120), this, 2);
SetTimer(1,500,NULL);
// SetTimer(2,1000,NULL);
return 0;
}
#7
OnCreate都是一次性的代码,不会重复申请。
你的OnTimer代码才是主要的,需要看一下是否有问题
你的OnTimer代码才是主要的,需要看一下是否有问题
#8
++
OnCreate即使泄漏也不会影响大局
#9
我刚刚找了下ontimer ,把所有准备注销的车辆对象都加上了析构操作,但是还是没解决额,不知道有没有其他的地方没找到,还希望您能帮忙看看啊。这里面很多重复的操作,等功能实现完了还要再抽象一下,先麻烦您啦~
void CTrafficView::OnTimer(UINT nIDEvent)
{
count++;
// TODO: Add your message handler code here and/or call default
if(count%14==0)
{
SetDlgItemText(2, "绿");
SetDlgItemText(3, "绿");
SetDlgItemText(6, "绿");
SetDlgItemText(7, "绿");
SetDlgItemText(1, "红");
SetDlgItemText(5, "红");
SetDlgItemText(4, "红");
SetDlgItemText(8, "红");
}
if(count%14==12)
{
SetDlgItemText(2, "红");
SetDlgItemText(3, "红");
SetDlgItemText(7, "红");
SetDlgItemText(6, "红");
SetDlgItemText(1, "绿");
SetDlgItemText(5, "绿");
SetDlgItemText(4, "绿");
SetDlgItemText(8, "绿");
}
/**************1号路*************************/
if(count%3==0) //每3秒产生一辆车
{
if(road1.GetCount()<rn1) //如果这条路上车还没满 添加一辆车
{
CCar car(0,175,5,false);
road1.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcr(3,&road1,130); //用于控制road1 中的车辆驶过路口
/**************6号路*************************/
if(count%3==0) //每3秒产生一辆车
{
if(road6.GetCount()<rn1) //如果这条路上车还没满 添加一辆车
{
CCar car(1080,102,2,false);
road6.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrXm(6,&road6,950);
/********************2号路*******************************/
if((!road4.IsEmpty())&&(road4.GetHead().x<=150))
{
road4.GetHead().~CCar();
road4.RemoveHead(); //1号路最前端车辆驶出1号路,从list中除去
CCar car(150,102,2,false);
road2.AddTail(car);
}
POSITION pos2 = road2.GetHeadPosition();
for(;pos2!=NULL;road2.GetNext(pos2))
{
road2.GetAt(pos2).x-=10;
}
if((!road2.IsEmpty())&&(road2.GetHead().x<=0))
{
road2.GetHead().~CCar();
road2.RemoveHead(); //2号路最前端车辆驶出2号路,从list中除去
}
/********************3号路*******************************/
if(road1.GetHead().x>=230)
{
road1.GetHead().~CCar();
road1.RemoveHead(); //3号路最前端车辆驶出3号路,从list中除去
CCar car(230,175,5,false);
road3.AddTail(car);
}
checkAcr(7,&road3,830);
/********************4号路*******************************/
if(road6.GetHead().x<850)
{
road6.GetHead().~CCar();
road6.RemoveHead(); //4号路最前端车辆驶出4号路,从list中除去
CCar car(850,102,2,false);
road4.AddTail(car);
}
checkAcrXm(2,&road4,250);
/********************5号路*******************************/
if((!road3.IsEmpty())&&(road3.GetHead().x>=930))
{
road3.GetHead().~CCar();
road3.RemoveHead(); //5号路最前端车辆驶出5号路,从list中除去
CCar car(930,175,5,false);
road5.AddTail(car);
}
POSITION pos5 = road5.GetHeadPosition();
for(;pos5!=NULL;road5.GetNext(pos5))
{
road5.GetAt(pos5).x+=10;
}
if((!road5.IsEmpty())&&(road5.GetHead().x>=1080))
{
road5.GetHead().~CCar();
road5.RemoveHead(); //6号路最前端车辆驶出6号路,从list中除去
}
/********************7号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road7.GetCount()<rn7) //如果这条路上车还没满 添加一辆车
{
CCar car(152,0,9,false);
road7.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYp(1,&road7,80);
/********************8号路*******************************/
if((!road10.IsEmpty())&&(road10.GetHead().y<=100))
{
road10.GetHead().~CCar();
road10.RemoveHead(); //7号路最前端车辆驶出7号路,从list中除去
CCar car(228,100,8,false);
road8.AddTail(car);
}
POSITION pos8 = road8.GetHeadPosition();
for(;pos8!=NULL;road8.GetNext(pos8))
{
road8.GetAt(pos8).y-=20;
}
if((!road8.IsEmpty())&&(road8.GetHead().y<=0))
{
road8.GetHead().~CCar();
road8.RemoveHead(); //8号路最前端车辆驶出8号路,从list中除去
}
/********************9号路*******************************/
if((!road7.IsEmpty())&&(road7.GetHead().y>180))
{
road7.GetHead().~CCar();
road7.RemoveHead(); //7号路最前端车辆驶出7号路,从list中除去
CCar car(152,180,9,false);
road9.AddTail(car);
}
POSITION pos9 = road9.GetHeadPosition();
for(;pos9!=NULL;road9.GetNext(pos9))
{
road9.GetAt(pos9).y+=20;
}
if((!road9.IsEmpty())&&(road9.GetHead().y>=600))
{
road9.GetHead().~CCar();
road9.RemoveHead(); //9号路最前端车辆驶出9号路,从list中除去
}
/********************10号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road10.GetCount()<rn10) //如果这条路上车还没满 添加一辆车
{
CCar car(228,600,8,false);
road10.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYm(4,&road10,200);
/********************11号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road11.GetCount()<rn7) //如果这条路上车还没满 添加一辆车
{
CCar car(852,0,13,false);
road11.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYp(5,&road11,80);
/********************12号路*******************************/
if((!road14.IsEmpty())&&(road14.GetHead().y<=100))
{
road14.GetHead().~CCar();
road14.RemoveHead(); //11号路最前端车辆驶出7号路,从list中除去
CCar car(928,100,12,false);
road12.AddTail(car);
}
POSITION pos12 = road12.GetHeadPosition();
for(;pos12!=NULL;road12.GetNext(pos12))
{
road12.GetAt(pos12).y-=20;
}
if((!road12.IsEmpty())&&(road12.GetHead().y<=0))
{
road12.GetHead().~CCar();
road12.RemoveHead(); //1号路最前端车辆驶出1号路,从list中除去
}
/********************13号路*******************************/
if((!road11.IsEmpty())&&(road11.GetHead().y>180))
{
road11.GetHead().~CCar();
road11.RemoveHead(); //11号路最前端车辆驶出11号路,从list中除去
CCar car(852,180,13,false);
road13.AddTail(car);
}
POSITION pos13 = road13.GetHeadPosition();
for(;pos13!=NULL;road13.GetNext(pos13))
{
road13.GetAt(pos13).y+=20;
}
if((!road13.IsEmpty())&&(road13.GetHead().y>=600))
{
road13.GetHead().~CCar();
road13.RemoveHead(); //13号路最前端车辆驶出13号路,从list中除去
}
/********************14号路*******************************/
if(count%9==0) //每9秒产生一辆车
{
if(road14.GetCount()<rn10) //如果这条路上车还没满 添加一辆车
{
CCar car(928,600,12,false);
road14.AddTail(car); //向list中添加一辆车,添加在末尾
}
}
checkAcrYm(8,&road14,200);
Invalidate();
CView::OnTimer(nIDEvent);
}
#10
OnDraw中干了什么呢?
OnTimer中都是汽车的增减,没有使用new申请空间,似乎没什么问题
OnTimer中都是汽车的增减,没有使用new申请空间,似乎没什么问题
#11
我ondraw中什么都没做 都放到onpaint 中了。。。在onpaint 中调用画车的函数把所有路上的车画了出来,别的也没干什么。 我怀疑我是不是问题出在画车的函数中呢,我好想只有选中,没有删除哎 ,因为画车 的函数是单独放在一个方法里,在onpaint 中调用,没有CDC 句柄,就在网上找了下面这种实现方式, 不知道是不是产生问题的地方啊。才学1个星期多一点 ,最近在赶这个课程设计,很多东西都是模模糊糊的,还望指点一下啊。
void CTrafficView::drawCar(int x, int y)
{
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);
HDC MemDC;
CBitmap bit;
MemDC =CreateCompatibleDC(0);
bit.LoadBitmap(IDB_BITMAP1);
SelectObject(MemDC,bit);
CClientDC dc(this);
BitBlt(dc.m_hDC,x,y,bmpInfo.bmWidth,bmpInfo.bmHeight,MemDC,0,0,SRCCOPY);
// MemDC.SelectObject(pOldBitmap);
// MemDC.DeleteDC(); //删除DC
// bmpInfo.DeleteObject();
}
#12
你这里需要把bmp,bit,MemDC,dc都释放掉。
#13
果然是drawcar 函数的问题,终于解决了,感谢你们!
代码贴出来和大家分享一下~
void CTrafficView::drawCar(int x, int y)
{
// load IDB_BITMAP1 from our resources
CDC *pDC;
pDC=GetDC();
CBitmap bmp;
if (bmp.LoadBitmap(IDB_BITMAP1))
{
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);
CRect rect;
GetClientRect(&rect);
pDC->BitBlt(x, y, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
0, 0, SRCCOPY);
dcMemory.SelectObject(pOldBitmap);
}
else
TRACE0("ERROR: Where's IDB_BITMAP1?\n");
ReleaseDC(pDC);
}