用Sleep()的吧?用Sleep()时当前应用程序被锁住。

解决方案 »

  1.   

    同意ydogg(灰毛兔) 的观点,把一些可以在后台工作的函数另开一个线程来完成。
      

  2.   

    不好意思,我不能总在网上。我正在试验各位提出的方法,多谢!!源码如下:(好像GetDIBts最费时)   // 屏幕和内存设备描述表 
    HDC            hScrDC, hMemDC;                
        // 位图句柄 
        HBITMAP        hBitmap, hOldBitmap;            
        // 屏幕分辨率 
    int            xScrn, yScrn;                  
        //设备描述表 
        HDC            hDC;                            
        //当前显示分辨率下每个像像素所占字节?
        int            iBits;                          
        //位图中每个像素所占字节  
        WORD           wBitCount;                
        //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 
        DWORD          dwPaletteSize=0, dwBmBitsSize, dwBmpSize; 
    DWORD          dwDIBSize;
        //位图属性结构 
        BITMAP         Bitmap;                
    //全屏区域
        CRect          rcArea;
    //位图信息头结构 
        BITMAPINFOHEADER        bi;            
        //指向位图信息头结构 
        LPBITMAPINFOHEADER      lpbi;          
        // Header for Bitmap file
    BITMAPFILEHEADER        bmfHdr; 
        //定义文件,分配内存句柄,调色板句柄 
        HPALETTE       hPal,hOldPal=NULL;  //为屏幕创建设备描述表 
        hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);     // 获得屏幕分辨率 
        xScrn = GetDeviceCaps(hScrDC, HORZRES); 
        yScrn = GetDeviceCaps(hScrDC, VERTRES);     //设定全屏区域
    rcArea.left=0;
    rcArea.top=0;
    rcArea.right=xScrn;
    rcArea.bottom=yScrn;    //为屏幕设备描述表创建兼容的内存设备描述表 
        hMemDC = CreateCompatibleDC(hScrDC);     // 创建一个与屏幕设备描述表兼容的位图 
        hBitmap = CreateCompatibleBitmap (hScrDC, rcArea.Width (), rcArea.Height ());     // 把新位图选到内存设备描述表中 
        hOldBitmap = (HBITMAP) SelectObject(hMemDC, hBitmap);     // 把屏幕设备描述表拷贝到内存设备描述表中 
        BitBlt(hMemDC, 0, 0, rcArea.Width (), rcArea.Height (), 
                            hScrDC, rcArea.left, rcArea.top, SRCCOPY);     //得到屏幕位图的句柄 
        hBitmap = (HBITMAP) SelectObject(hMemDC, hOldBitmap);     //计算位图每个像素所占字节数 
        iBits = GetDeviceCaps(hScrDC, BITSPIXEL); 
        iBits = iBits * GetDeviceCaps(hScrDC, PLANES); 
        if (iBits <= 1) 
            wBitCount = 1; 
        else if (iBits <= 4) 
            wBitCount = 4; 
        else if (iBits <= 8) 
            wBitCount = 8; 
        else if (iBits <= 24) 
            wBitCount = 24; 
    else
    wBitCount = iBits;     //计算调色板大小 
        if (wBitCount <= 8) 
            dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);     //设置位图信息头结构 
        GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap); 
        bi.biSize = sizeof(BITMAPINFOHEADER); 
        bi.biWidth = Bitmap.bmWidth; 
        bi.biHeight = Bitmap.bmHeight; 
        bi.biPlanes = 1; 
        bi.biBitCount = wBitCount; 
        bi.biCompression = BI_RGB; 
        bi.biSizeImage = 0; 
        bi.biXPelsPerMeter = 0; 
        bi.biYPelsPerMeter = 0; 
        bi.biClrUsed = 0; 
        bi.biClrImportant = 0;     dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32)* 4 *Bitmap.bmHeight;  
        dwBmpSize = dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER);     //为位图内容分配内存 
    lpbi = (LPBITMAPINFOHEADER)new char[dwBmpSize]; 
        *lpbi = bi;     // 处理调色板 
        hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE); 
        if (hPal){ 
            hDC = ::GetDC (NULL); 
            hOldPal = ::SelectPalette(hDC, hPal, FALSE); 
            RealizePalette(hDC); 
    }
        
        // 获取该调色板下新的像素值 
        ::GetDIBits( 
             hDC, 
                     hBitmap, 
     0,
     (UINT) Bitmap.bmHeight, 
                     (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, 
     (BITMAPINFO *)lpbi, 
                     DIB_RGB_COLORS 
                    );     //恢复调色板 
        if (hOldPal){
    SelectPalette(hDC, hOldPal, TRUE); 
            RealizePalette(hDC); 
            ::ReleaseDC(NULL, hDC); 
    } //清除 
        DeleteObject (hBitmap); 
        DeleteDC(hScrDC); 
        DeleteDC(hMemDC); 
        delete []lpbi;