读书人

VS2008 MFC编程对话框显示多个图片和

发布时间: 2012-04-13 13:50:24 作者: rapoo

VS2008 MFC编程,对话框显示多个图片和图标,运行2个小时,图片和图标不见了,请指教。谢谢。
我在VS2008中,用MFC编程,一个对话框显示多个BMP图片和ICON图标,程序运行2个小时左右,图片和图标都不见了,其他串口通讯和浮点显示没问题。
请指点,代码如下:
void CSlgoNewStationDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
static int SyringeNum=0;
switch(nIDEvent)
{

case 1:
{

SyringeNum++;
if(SyringeNum>20)
SyringeNum=0;

//m_animIcon1.ShowNextImage();
static int i=0;
//if(SystemStatus==run)
i++;
if(i>=4)
i=0;

if(AlarmState[0]==run)
m_ctrlStateFlag1.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag1.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[1]==run)
m_ctrlStateFlag2.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag2.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[2]==run)
m_ctrlStateFlag3.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag3.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[3]==run)
m_ctrlStateFlag4.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag4.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[4]==run)
m_ctrlStateFlag5.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag5.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[5]==run)
m_ctrlStateFlag6.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag6.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[6]==run)
m_ctrlStateFlag7.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag7.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[7]==run)
m_ctrlStateFlag8.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag8.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[8]==run)
m_ctrlStateFlag9.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag9.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[9]==run)
m_ctrlStateFlag10.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag10.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[10]==run)
m_ctrlStateFlag11.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag11.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[11]==run)
m_ctrlStateFlag12.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag12.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[12]==run)
m_ctrlStateFlag13.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag13.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[13]==run)
m_ctrlStateFlag14.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag14.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[14]==run)
m_ctrlStateFlag15.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag15.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[15]==run)
m_ctrlStateFlag16.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag16.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[16]==run)
m_ctrlStateFlag17.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag17.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[17]==run)
m_ctrlStateFlag18.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag18.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));


if(AlarmState[18]==run)
m_ctrlStateFlag19.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag19.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));
if(AlarmState[19]==run)
m_ctrlStateFlag20.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1+i));
else
m_ctrlStateFlag20.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));

/*
Rec1.Default1 = Rec1.Buffer[9];
Rec1.Default0 = Rec1.Buffer[10];
Rec1.Total1 = Rec1.Buffer[11];
Rec1.Total0 = Rec1.Buffer[12];
Rec1.Speed1 = Rec1.Buffer[13];
Rec1.Speed0 = Rec1.Buffer[14];
*/

//TCHAR buf[32]={0};


//swprintf_s(buf, _T("%4.1f"), ((float)(Rec1.Total1*0XFD+Rec1.Total0)/10.0));
//SetDlgItemText(IDC_TOTAL_VOL1 , buf);/// 输注总量

//swprintf_s(buf, _T("%4.1f"), ((float)(Rec1.Speed1*0XFD+Rec1.Speed0)/10.0));
//SetDlgItemText(IDC_SPEED_RATE1 , buf); /// 输注速度


unsigned char abcd[9];


///FF 3A 75 A2 F1 35 7A 7D FE

//SyringeNum=0x02;

abcd[0]=0XFF;//帧头
abcd[1]=0X00;//地址1
abcd[2]=SyringeNum;//地址0
abcd[3]=0XA2;//命令1
abcd[4]=0XF1;//命令0
abcd[5]=0X35;//速度1
abcd[6]=0X7A;//速度0
abcd[7]=0X7D;//CRC8
abcd[8]=0XFE;//帧尾


// abcd[1]=0x3a;
// abcd[2]=0x75;
abcd[7]=CRC8((unsigned char *)abcd,7);
//if(Open==TRUE)
m_Port.WriteToPort((char *)abcd,9);


}
break;
case 2:
{
CommDataDecode();
}
break;
default:break;
}

CDialog::OnTimer(nIDEvent);
}

[解决办法]
应该是GDI句柄被泄露完了导致的。在CommDataDecode中,只有LoadImage,没有删除,可以DeleteObject m_ctrlTypePicture1.SetBitmap返回的句柄。

你现在的程序,用任务管理器看一下,加入“GDI对象”列,应该能看到GDI对象在不断增加。
[解决办法]
正如楼上所说,检查资源泄漏。
[解决办法]
hBitmap = (HBITMAP)LoadImage(
AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP2),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS);
}

类似这样的都定义成全局变量,在程序初始化函数执行一次就行了.多次调用可能会有问题.凡是需要一次调用的,不是动态改变的都定义成全局变量,只在程序初始化执行一次就行了.

读书人网 >VC/MFC

热点推荐