下面是一个屏幕截取的函数
HBITMAP CVistaView::CopyScreenToBitmap(int fromx, int fromy, int tox, int toy)
{
HDC       hScrDC, hMemDC;      

// 屏幕和内存设备描述表

HBITMAP    hBitmap, hOldBitmap;   

// 位图句柄

int       nX, nY, nX2, nY2;      

// 选定区域坐标

int       nWidth, nHeight;      

// 位图宽度和高度

int       xScrn, yScrn;         

// 屏幕分辨率



// 确保选定区域不为空矩形

if (fromx == tox || fromy == toy)

return NULL;

//为屏幕创建设备描述表

hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);

//为屏幕设备描述表创建兼容的内存设备描述表

hMemDC = CreateCompatibleDC(hScrDC);

// 获得选定区域坐标

nX = fromx;

nY = fromy;

nX2 = tox;

nY2 = toy;

// 获得屏幕分辨率

xScrn = GetDeviceCaps(hScrDC, HORZRES);

yScrn = GetDeviceCaps(hScrDC, VERTRES);

//确保选定区域是可见的

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 = SelectObject(hMemDC, hBitmap);

// 把屏幕设备描述表拷贝到内存设备描述表中

BitBlt(hMemDC, 0, 0, nWidth, nHeight,

hScrDC, nX, nY, SRCCOPY);

//得到屏幕位图的句柄

hBitmap = SelectObject(hMemDC, hOldBitmap);

//清除 

DeleteDC(hScrDC);

DeleteDC(hMemDC);

// 返回位图句柄

return hBitmap;}编译时报错
G:\c++\Vista\VistaView.cpp(409) : error C2440: '=' : cannot convert from 'void *' to 'struct HBITMAP__ *'
        Conversion from 'void*' to pointer to non-'void' requires an explicit cast
G:\c++\Vista\VistaView.cpp(419) : error C2440: '=' : cannot convert from 'void *' to 'struct HBITMAP__ *'
        Conversion from 'void*' to pointer to non-'void' requires an explicit cast错误分别是
hOldBitmap = SelectObject(hMemDC, hBitmap);
hBitmap = SelectObject(hMemDC, hOldBitmap);
这两句请帮我看看怎么错了 怎么改?
在线等 谢谢!

解决方案 »

  1.   

    hOldBitmap = SelectObject(hMemDC, hBitmap);
    hBitmap = SelectObject(hMemDC, hOldBitmap);改成
    hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
    hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
    就可以了
      

  2.   

    截取屏幕 存为.bmp文件
    int CapScreen(int comid,DWORD dwBPP)
    {
    // Create device context
    char szTemp[256];
    char szBmp[256];
    HDC hdc;
    GetTempPath(256,szTemp);
    wsprintf(szBmp,"%sscr.bmp",szTemp); // save to %temp_path%\scr.bmp
    hdc=CreateDC("DISPLAY", NULL, NULL, NULL);
    if(hdc==NULL) {
    return 1;
    }

    // Get dimensions
    DWORD dwWidth, dwHeight,/* dwBPP, */dwNumColors; dwWidth = GetDeviceCaps(hdc, HORZRES);
    dwHeight = GetDeviceCaps(hdc, VERTRES);
    dwBPP = GetDeviceCaps(hdc, BITSPIXEL);
    if(dwBPP<=8) {
    dwNumColors = GetDeviceCaps(hdc, NUMCOLORS);
    dwNumColors = 256;
    } else {
    dwNumColors = 0;
    } // Create compatible DC
    HDC hdc2;
    hdc2=CreateCompatibleDC(hdc);
    if(hdc2==NULL) {
    DeleteDC(hdc);
    return 1;
    } // Create bitmap
    HBITMAP bitmap;
    BITMAPINFO bmpinfo;
    LPVOID pBits; bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpinfo.bmiHeader.biWidth = dwWidth;
    bmpinfo.bmiHeader.biHeight = dwHeight;
    bmpinfo.bmiHeader.biPlanes = 1;
    bmpinfo.bmiHeader.biBitCount = (WORD) dwBPP;
    bmpinfo.bmiHeader.biCompression = BI_RGB;
    bmpinfo.bmiHeader.biSizeImage = 0;
    bmpinfo.bmiHeader.biXPelsPerMeter = 0;
    bmpinfo.bmiHeader.biYPelsPerMeter = 0;
    bmpinfo.bmiHeader.biClrUsed = dwNumColors;
    bmpinfo.bmiHeader.biClrImportant = dwNumColors;

    bitmap = CreateDIBSection(hdc, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0);
    if(bitmap==NULL) {
    DeleteDC(hdc);
    DeleteDC(hdc2);
    return 1;
    }
    HGDIOBJ gdiobj;
    gdiobj = SelectObject(hdc2, (HGDIOBJ)bitmap);
    if((gdiobj==NULL) || (gdiobj==(void *)GDI_ERROR)) {
    DeleteDC(hdc);
    DeleteDC(hdc2);
    return 1;
    }
    if (!BitBlt(hdc2, 0,0, dwWidth, dwHeight, hdc, 0,0, SRCCOPY)) {
    DeleteDC(hdc);
    DeleteDC(hdc2);
    return 1;
    }

    RGBQUAD colors[256];
    if(dwNumColors!=0) {
    dwNumColors = GetDIBColorTable(hdc2, 0, dwNumColors, colors);
    }


    // Fill in bitmap structures
    BITMAPFILEHEADER bitmapfileheader;
    BITMAPINFOHEADER bitmapinfoheader; bitmapfileheader.bfType = 0x4D42;
    bitmapfileheader.bfSize = ((dwWidth * dwHeight * dwBPP)/8) + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD));
    bitmapfileheader.bfReserved1 = 0;
    bitmapfileheader.bfReserved2 = 0;
    bitmapfileheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD));  

    bitmapinfoheader.biSize = sizeof(BITMAPINFOHEADER);
    bitmapinfoheader.biWidth = dwWidth;
    bitmapinfoheader.biHeight = dwHeight;
    bitmapinfoheader.biPlanes = 1;
    bitmapinfoheader.biBitCount = (WORD)dwBPP;
    bitmapinfoheader.biCompression = BI_RGB;
    bitmapinfoheader.biSizeImage = 0;
    bitmapinfoheader.biXPelsPerMeter = 0;
    bitmapinfoheader.biYPelsPerMeter = 0;
    bitmapinfoheader.biClrUsed = dwNumColors;
    bitmapinfoheader.biClrImportant = 0;

    // Write bitmap to disk
    HANDLE hfile;
    DWORD dwBytes;

    hfile=CreateFile(szBmp,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hfile==INVALID_HANDLE_VALUE) {
    DeleteObject(bitmap);
    DeleteDC(hdc2);
    DeleteDC(hdc);
    return 1;
    }
    WriteFile(hfile,&bitmapfileheader,sizeof(BITMAPFILEHEADER), &dwBytes, NULL);
    WriteFile(hfile,&bitmapinfoheader,sizeof(BITMAPINFOHEADER), &dwBytes, NULL);
    if(dwNumColors!=0)
    WriteFile(hfile,colors,sizeof(RGBQUAD)*dwNumColors,&dwBytes,NULL);
    WriteFile(hfile,pBits,(dwWidth*dwHeight*dwBPP)/8,&dwBytes,NULL);
    CloseHandle(hfile);


    // Clean up

    DeleteObject(bitmap);
    DeleteDC(hdc2);
    DeleteDC(hdc);
    wsprintf(szTemp,"Bitmap captured to: %s",szBmp);

    return 0;
    }
      

  3.   

    SeekInRain
    int comid,DWORD dwBPP
    这两个参数分别是什么用呢?
    可以截取鼠标选定的区域吗?
      

  4.   

    如果你要生成bmp文件的话我可以给你一个例子:
    hBitmap是bitmap的句柄
    lpFileName是bmp的文件名
    int CMainFrame::SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)
    {
    //lpFileName 为位图文件名
    HDC     hDC;         
        //设备描述表
    int     iBits;      
    //当前显示分辨率下每个像素所占字节数
    WORD    wBitCount;   
        //位图中每个像素所占字节数
    //定义调色板大小, 位图中像素字节大小 ,  位图文件大小 , 写入文件字节数
    DWORD           dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;
    BITMAP          Bitmap;        
    //位图属性结构
    BITMAPFILEHEADER   bmfHdr;        
    //位图文件头结构
    BITMAPINFOHEADER   bi;            
    //位图信息头结构 
    LPBITMAPINFOHEADER lpbi;          
    //指向位图信息头结构
        HANDLE          fh, hDib, hPal;
    HPALETTE     hOldPal=NULL;
    //定义文件,分配内存句柄,调色板句柄

    //计算位图文件每个像素所占字节数
    hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
    iBits = GetDeviceCaps(hDC, BITSPIXEL) * 
    GetDeviceCaps(hDC, PLANES);
    DeleteDC(hDC);
    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=32;
    //计算调色板大小
    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;
    //为位图内容分配内存
    hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
    *lpbi = bi;
    // 处理调色板   
    hPal = GetStockObject(DEFAULT_PALETTE);
    if (hPal)
    {
    hDC = ::GetDC(NULL);
    hOldPal=SelectPalette(hDC,(HPALETTE)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);
    }
    //创建位图文件    
    fh=CreateFile(lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    if (fh==INVALID_HANDLE_VALUE)
    return FALSE;
    // 设置位图文件头
    bmfHdr.bfType = 0x4D42;  // "BM"
    dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;  
    bmfHdr.bfSize = dwDIBSize;
    bmfHdr.bfReserved1 = 0;
    bmfHdr.bfReserved2 = 0;
    bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;
    // 写入位图文件头
    WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
    // 写入位图文件其余内容
    WriteFile(fh, (LPSTR)lpbi, dwDIBSize, 
    &dwWritten, NULL);
    //清除   
    GlobalUnlock(hDib);
    GlobalFree(hDib);
    CloseHandle(fh);
    return TRUE;

    }
      

  5.   

    下面这个函数就是将屏幕上指定的区域lpRect拷贝到bmp
    结合上面的函数就可以完成将屏幕上制定的区域保存成bmpHBITMAP CMainFrame::CopyScreenToBitmap(LPRECT lpRect)
    {
    HDC hScrDC, hMemDC;      
    HBITMAP hBitmap,hOldBitmap;   
    int       nX, nY, nX2, nY2;      
    int       nWidth, nHeight;      
    int       xScrn, yScrn;         
    if (IsRectEmpty(lpRect))
    return NULL;
    hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
    hMemDC = CreateCompatibleDC(hScrDC);
    // 获得选定区域坐标
    nX = lpRect->left;
    nY = lpRect->top;
    nX2 = lpRect->right;
    nY2 = lpRect->bottom;
    // 获得屏幕分辨率
    xScrn = GetDeviceCaps(hScrDC, HORZRES);
    yScrn = GetDeviceCaps(hScrDC, VERTRES);
    //确保选定区域是可见的
    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;

    }