如果我在OnTimer中一直运行以下代码,会不会导至DC资源耗尽?
void CMyDlg::OnTimer(UINT nIDEvent) 
{
if (GetStatus())
{
HBITMAP hbitEme=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_ON));
((CStatic *)GetDlgItem(IDC_PIC_STATUS))->SetBitmap(hbitEme);
}else
{
HBITMAP hbitEme=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_OFF));
((CStatic *)GetDlgItem(IDC_PIC_STATUS))->SetBitmap(hbitEme);
}
...
} 现在我在一个项目中使用了以上代码,然后让程序一直运行,发现偶尔会出现DC资源耗尽,也就是屏幕乱显示,关闭后再启运又正常了,就好像没有释放DC时长期运行后出现的现象。
不知是否是上面代码的原因,又或许是其它原因。

解决方案 »

  1.   

    LoadBitmap必须对应 DeleteObject 
    不然,肯定出问题!
    你可以查查MSDN
      

  2.   

    可是在代码中,如果我增加了DeleteObject(hbitEme) ;就没有办法显示图像,怎么处理?
      

  3.   

    改成成员变量
    HBITMAP m_hbitEmeOn;
    HBITMAP m_hbitEmeOff;放在初始化函数里,如OnInitDialog
    m_hbitEmeOn=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_ON));
    m_hbitEmeOff=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_OFF));void CMyDlg::OnTimer(UINT nIDEvent)  
    {
    if (GetStatus()) 
    {
    ((CStatic *)GetDlgItem(IDC_PIC_STATUS))->SetBitmap(m_hbitEmeOn);
    }else
    {
    ((CStatic *)GetDlgItem(IDC_PIC_STATUS))->SetBitmap(m_hbitEmeOff);
    }
    ...
    }
      

  4.   

    确实是个好办法,不过我做了两个CStatic 分别为IDC_PIC_STATUS_ON和IDC_PIC_STATUS_OFF并在设计时赋了图像,然后
    if (GetStatus())  
    {
      GetDlgItem(IDC_PIC_STATUS_ON)->ShowWindow(SW_SHOW);
      GetDlgItem(IDC_PIC_STATUS_OFF)->ShowWindow(SW_HIDE);
    }else
    {
      GetDlgItem(IDC_PIC_STATUS_ON)->ShowWindow(SW_HIDE);
      GetDlgItem(IDC_PIC_STATUS_OFF)->ShowWindow(SW_SHOW);
    }
    应该也可以解决,我正在测试,如果还会出现DC资源耗尽,那就需要考虑其它的原因。
    多谢各位。