WINCE 下的wine32程序
void UserBackCoinDlg::OnPaint(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ PAINTSTRUCT paint; 
HDC hDC = ::BeginPaint(hWndDlg, &paint);  RECT rcClient;
::GetClientRect(hWndDlg, &rcClient);  // 取得客户区大小 WCHAR strFileName[128];
switch (m_nBackBmpIndex)
{
case 0:
swprintf(strFileName, _T("%sPicture\\userbackcoin.bmp"), g_strAppPath);
break;
case 1:
swprintf(strFileName, _T("%sPicture\\backingcoin.bmp"), g_strAppPath);
break;
case 2:
swprintf(strFileName, _T("%sPicture\\cannotbackcoinanymore.bmp"), g_strAppPath);
break;
case 3:
swprintf(strFileName, _T("%sPicture\\backcoinerror.bmp"), g_strAppPath);
break;
case 4:
swprintf(strFileName, _T("%sPicture\\backcoinblock.bmp"), g_strAppPath);
case 5:
swprintf(strFileName, _T("%sPicture\\powererror.bmp"), g_strAppPath);
break;
}         HBITMAP hBitmap = (HBITMAP)SHLoadDIBitmap(strFileName);
HDC hBackDC = NULL;
hBackDC = CreateCompatibleDC(NULL);
SelectObject(hBackDC, hBitmap); ::BitBlt(m_hMemDC,
 0, 0, 
 rcClient.right, rcClient.bottom,  
 hBackDC,
 0, 0, 
 SRCCOPY); ::BitBlt(hDC,
 0, 0, 
 rcClient.right, rcClient.bottom,  
 m_hMemDC,
 0, 0, 
 SRCCOPY);
DeleteObject(hBitmap);
DeleteDC(hBackDC); 
::EndPaint(hWndDlg, &paint);
}为什么刷新100下左右,没图像了,有时候是白的有时候是黑的。
GDI没泄露吧?

解决方案 »

  1.   

    楼主你的hBackDC 创建有错误,BitBlt函数使用也有错误,这个不是你自己写的吧,自己在查下资料吧
      

  2.   

    hBitmap应该先从hBackDC里选出来,再DeleteObject吧
      

  3.   

    hBackDC 创建有错误,BitBlt函数使用也有错误
      

  4.   

    呵呵 当然可以撒一般都 这么用bitbit和dc的 CPaintDC dc(this);

    CRect rctClient; //对话框客户区大小
    GetClientRect(&rctClient);
    m_rctDraw = rctClient; CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    CBitmap memBitmap;
    memBitmap.CreateCompatibleBitmap(&dc,rctClient.Width(),rctClient.Height());
    memDC.SelectObject(&memBitmap);
    CFont font;
    font.CreateFont(g_font.GraphFontSize,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,
    ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,g_font.GraphFontName);
    //自绘内容
    dc.BitBlt(0,0,m_rctDraw.Width(),m_rctDraw.Height(),&memDC,0,0,SRCCOPY); }
    brush.DeleteObject();
    font.DeleteObject();
    memBitmap.DeleteObject();
    memDC.DeleteDC();
      

  5.   

    我的绘图是采用win32的方式绘的,不是MFC。
    将一个位图选到设备上以后,删除时要先把它选出来,在删吗?
      

  6.   


    不是选出来
    而是做一下恢复
    另外
    win32我不熟
    不过好像没见你释放hDC
      

  7.   

    m_hMemDC是在对话框退出时释放的。
    hBackDc已经释放掉了。
    dc = beginpaint();
    endpaint();这个dc也要释放吗?
      

  8.   


    具体的我不清楚
    在MFC中这个相当于CPaintDC吧
    这个是自动处理的
    不用我们关心
    不过它释没释放我也不太清楚
    感觉应该释放吧
      

  9.   

    楼主,你WINCE的工程运行在什么硬件上?
    我有个2440,64RAM 的,给个工程我运行看看会不会运行一会儿就不够内存.
      

  10.   

    我这边就是没内存,是GDI泄漏,现已基本找到原因。
      

  11.   

    楼主,找到原因后,在这提醒一下,我也是WINCE的.64硬盘,64内存,400M的2440
      

  12.   

    先删除DC再来删除bitmap,如果先删除bitmap会失败 建议楼主以后多做一些检验
      

  13.   

    楼主,我是用MFC的,GDI对象在释构时应该会自动释放内存,我是建的内存DC较多时,有时会创建内存DC失败,但之前建的内存DC明明已经没有再用并释构了,但还是失败.我也正在找原因.
      

  14.   

    GDI资源是有限的,用完应该及时释放掉,ivyfengwcm说的没错。我就是先删位图然后再删dc的,而且没有检验是否删除成功。
     
      

  15.   

    原来是这样,学习了.
    是因为那个 位图 被DC选了,所以没有删成功,等于删DC后就没有删位图是吗?
    我一直用MFC,都没有释放GDI对象的概念.