写的这段截屏代码,调用32次后,hbitmap就返回NULL,这是怎么回事啊?是调用的太快了还是什么原因。//截屏代码,如果参数是为NULL,则全屏截图
HBITMAP GetScreenBmp( LPRECT lprect )
{
HDC hscrdc, hmemdc;  // 屏幕和内存设备描述表
HBITMAP hbitmap, holdbitmap; // 位图句柄
int nx, ny, nx2, ny2;  // 选定区域坐标
int nwidth, nheight;  // 位图宽度和高度
int xscrn, yscrn;  // 屏幕分辨率
//为屏幕创建设备描述表
hscrdc = CreateDC( _T("Display"), NULL, NULL, NULL ); //为屏幕设备描述表创建兼容的内存设备描述表
hmemdc = CreateCompatibleDC( hscrdc ); // 获得屏幕分辨率
xscrn = GetDeviceCaps( hscrdc, HORZRES );
yscrn = GetDeviceCaps( hscrdc, VERTRES ); // 获得选定区域坐标
if ( NULL ==lprect ) //如果为空则全屏截图
{
nx = 0;
ny = 0;
nx2 = xscrn;
ny2 = yscrn;

else
{
nx = lprect->left;
ny = lprect->top;
nx2 = lprect->right;
ny2 = lprect->bottom;
} //确保选定区域是可见的
if ( nx < 0 )
nx = 0;
if ( ny < 0 )
ny = 0;
if ( nx2 > xscrn )
nx2 = xscrn;
if ( ny2 > yscrn )
ny2 = yscrn; nwidth = nx2 - nx;
nheight = ny2 - ny; // 创建一个与屏幕设备描述表兼容的位图 (建立一个空位图准备绘画)
hbitmap = CreateCompatibleBitmap( hscrdc, nwidth, nheight ); // 把新位图选到内存设备描述表中 (将位图放进内存中)
holdbitmap = (HBITMAP)SelectObject( hmemdc, hbitmap ); // 把屏幕设备描述表拷贝到内存设备描述表中 (将屏幕画到位图中)
BitBlt( hmemdc, 0, 0, nwidth, nheight,hscrdc, nx, ny, SRCCOPY ); //得到屏幕位图的句柄 (取出位图)
hbitmap = (HBITMAP)SelectObject( hmemdc, holdbitmap ); //清除 
DeleteDC( hscrdc );
DeleteDC( hmemdc ); // 返回位图句柄
return hbitmap;}//测试代码,调用32次后就失效了,郁闷
void CScreenSpy::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
HBITMAP hBitmap; for ( int i = 0; i < 100; i++ )
{
hBitmap = GetScreenBmp( NULL );

if ( NULL != hBitmap )
{
m_Pic.SetBitmap( hBitmap );
CString str;
str.Format( _T("%d"), i );
SetWindowText( str );
} }

}

解决方案 »

  1.   

    CreateCompatibleBitmap,用完了要DeleteObject。
      

  2.   

    在哪里DeleteObject?
    这样吗?
    for ( int i = 0; i < 100; i++ )
    {
    hBitmap = GetScreenBmp( NULL );

    if ( NULL != hBitmap )
    {
    m_Pic.SetBitmap( hBitmap );
    CString str;
    str.Format( _T("%d"), i );
    SetWindowText( str );
    }
    DeleteObject( hBitmap ); //Delete }
      

  3.   

    成功了,谢谢
    ndy_w
    (carpe diem)
    接分吧!