VS2008 MFC编程,对话框显示多个图片和图标,运行2个小时,图片和图标不见了,请指教。谢谢。

3xcom 2012-04-09 09:32:45
我在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);
}
...全文
230 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
3xcom 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
类似:
m_ctrlStateFlag8.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1));这样的语句,把:AfxGetApp()->LoadIcon(IDI_ICON1)在程序初始化函数里赋给一个全局变量,比如:av=AfxGetApp()->LoadIcon(IDI_ICON1);这样,在OnTimer函数里就这样:
m_ctrlStateFlag8.S……
[/Quote]


谢谢,我试试。有20个BMP图片和20个ICON图片,根据串口数据不同,显示不同的BMP和ICON图片。
hdg3707 2012-04-09
  • 打赏
  • 举报
回复
你删除m_ctrlTypePicture1这个,就不能显示图片了,相当于把这个控件删除了,所以还是按我说的,定义成全局变量来使用.我第一次用VC编程时就碰到这种情况,所以现在我知道如何处理这种情况
hdg3707 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
hBitmap = (HBITMAP)LoadImage(
AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP2),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS);
}
/////////////////////////////////////////
这个函数要不停调……
[/Quote]
图片1和图片2是固定的,因此你就可以在程序初始化函数里调用一次就行了,把它存在全局变量里,以后直接调用这个变量.
罗平 2012-04-09
  • 打赏
  • 举报
回复
可以在构造函数中加载图片,在析构函数中删除句柄

DeleteObject(m_ctrlTypePicture1);
hdg3707 2012-04-09
  • 打赏
  • 举报
回复
类似:
m_ctrlStateFlag8.SetIcon (AfxGetApp()->LoadIcon(IDI_ICON1));这样的语句,把:AfxGetApp()->LoadIcon(IDI_ICON1)在程序初始化函数里赋给一个全局变量,比如:av=AfxGetApp()->LoadIcon(IDI_ICON1);这样,在OnTimer函数里就这样:
m_ctrlStateFlag8.SetIcon(av);
图形操作要小心点,常常会把资源浪费完,而且不是当时或短时间,需要过一段时间才能看出来,我第一次编MFC的图形时,就是这样,后来全定义成全局变量,只在程序初始化函进行初始化一次,以后直接调用就可以了.当时每编一个程序,一定得长时间试看看不是资源浪费完了,就是不断的刷新屏幕,1到2个小时没问题后才放心了
3xcom 2012-04-09
  • 打赏
  • 举报
回复
这个函数要不停调用,通过串口的数据来判断是显示图片1还是图片2./////显示打错了。
3xcom 2012-04-09
  • 打赏
  • 举报
回复
hBitmap = (HBITMAP)LoadImage(
AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP2),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS);
}
/////////////////////////////////////////
这个函数要不停调用,通过串口的数据来判断是现实图片1还是图片2.


m_ctrlTypePicture1是全局变量,请问如何删除句柄呢?

谢谢各位。
hdg3707 2012-04-09
  • 打赏
  • 举报
回复
hBitmap = (HBITMAP)LoadImage(
AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP2),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS);
}

类似这样的都定义成全局变量,在程序初始化函数执行一次就行了.多次调用可能会有问题.凡是需要一次调用的,不是动态改变的都定义成全局变量,只在程序初始化执行一次就行了.
罗平 2012-04-09
  • 打赏
  • 举报
回复
正如楼上所说,检查资源泄漏。
iamshuke 2012-04-09
  • 打赏
  • 举报
回复
应该是GDI句柄被泄露完了导致的。在CommDataDecode中,只有LoadImage,没有删除,可以DeleteObject m_ctrlTypePicture1.SetBitmap返回的句柄。

你现在的程序,用任务管理器看一下,加入“GDI对象”列,应该能看到GDI对象在不断增加。
3xcom 2012-04-09
  • 打赏
  • 举报
回复
图片显示没有在OnPaint中。
3xcom 2012-04-09
  • 打赏
  • 举报
回复
void CSlgoNewStationDlg::CommDataDecode(void)
{

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





for(int i=0;i<20;i++)
CommTimeout[i]+=1;

if(CommTimeout[0]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO1 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[0]=SystemStatus;
/*
hBitmap = (HBITMAP)LoadImage(
AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP4),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS);

m_ctrlTypePicture1.SetBitmap (hBitmap);
*/
}
if(CommTimeout[1]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO2 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[1]=SystemStatus;

}
if(CommTimeout[2]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO3 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[2]=SystemStatus;

}
if(CommTimeout[3]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO4 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[3]=SystemStatus;

}
if(CommTimeout[4]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO5 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[4]=SystemStatus;

}
if(CommTimeout[5]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO6 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[5]=SystemStatus;

}
if(CommTimeout[6]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO7 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[6]=SystemStatus;

}
if(CommTimeout[7]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO8 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[7]=SystemStatus;


}
if(CommTimeout[8]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO9 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[8]=SystemStatus;

}
if(CommTimeout[9]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO10 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[9]=SystemStatus;

}
if(CommTimeout[10]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO11 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[10]=SystemStatus;

}
if(CommTimeout[11]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO12 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[11]=SystemStatus;

}
if(CommTimeout[12]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO13 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[12]=SystemStatus;

}
if(CommTimeout[13]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO14 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[13]=SystemStatus;

}
if(CommTimeout[14]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO15 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[14]=SystemStatus;

}
if(CommTimeout[15]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO16 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[15]=SystemStatus;

}
if(CommTimeout[16]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO17 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[16]=SystemStatus;

}
if(CommTimeout[17]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO18 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[17]=SystemStatus;

}
if(CommTimeout[18]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO19 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[18]=SystemStatus;

}
if(CommTimeout[19]>150)
{
swprintf_s(buf, _T("%s"), szAlarmMsg[5] );
SetDlgItemText(IDC_STATE_NO20 , buf); /// 输注速度
SystemStatus=stop;
AlarmState[19]=SystemStatus;

}


if(Rec1.Receiving== 1)
{

Rec1.Receiving = 0;

switch(Rec1.Addr0)
{

case 0x01:
{

CommTimeout[0]=0;

if(Rec1.Type==0x00)
{
hBitmap = (HBITMAP)LoadImage(
AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP1),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS);

}
else
{
hBitmap = (HBITMAP)LoadImage(
AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP2),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS);
}


m_ctrlTypePicture1.SetBitmap (hBitmap);

if(Rec1.Mode==0x05)
{
swprintf_s(buf, _T("%s"), szInfusionMode[5]);
SetDlgItemText(IDC_SPEED_UNIT1 , buf); /// 患者病床号

}
else
{
swprintf_s(buf, _T("%s"), szInfusionMode[4]);
SetDlgItemText(IDC_SPEED_UNIT1 , buf); /// 患者病床号

}

swprintf_s(buf, _T("%s"), szInfusionMode[Rec1.Mode]);
SetDlgItemText(IDC_INFUSE_MODETX1 , buf); /// 患者病床号

swprintf_s(buf, _T("%s"), szPumpType[Rec1.Type]);
SetDlgItemText(IDC_PUMP_TYPETXT1 , buf); /// 患者病床号

swprintf_s(buf, _T("床号: %3d-%2d"), Rec1.BedNO,Rec1.NumNO);
SetDlgItemText(IDC_PATIENT_NO1 , buf); /// 患者病床号

swprintf_s(buf, _T("%4.1f"), (float)(Rec1.Default1*0XFD+Rec1.Default0));
SetDlgItemText(IDC_DEFAULT_VOL1 , buf); /// 输注预设量

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); /// 输注速度



if(Rec1.AlarmInfo>=RunMask) //运行
{
SystemStatus=run;
AlarmState[0]=SystemStatus;

swprintf_s(buf, _T("%s"), szAlarmMsg[Rec1.AlarmInfo-RunMask] );
SetDlgItemText(IDC_STATE_NO1 , buf); /// 输注速度
}
else if(Rec1.AlarmInfo>=StopMask) //停止
{
SystemStatus=stop;
AlarmState[0]=SystemStatus;

swprintf_s(buf, _T("%s"), szAlarmMsg[Rec1.AlarmInfo-StopMask] );
SetDlgItemText(IDC_STATE_NO1 , buf); /// 输注速度
}
else
{
if(Rec1.AlarmInfo==StopStatus)
SystemStatus=stop;
else if(Rec1.AlarmInfo==RunStatus)
SystemStatus=run;
AlarmState[0]=SystemStatus;
swprintf_s(buf, _T("%s"), szAlarmMsg[Rec1.AlarmInfo] );
SetDlgItemText(IDC_STATE_NO1 , buf); /// 输注速度
}


UpdateData(FALSE);

}
break;

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧