无聊。
粘贴到绘图中,然后保存不就行了。

解决方案 »

  1.   

    刚好有现成的代码:HBITMAP bitmap;
    OpenClipboard();
    bitmap=(HBITMAP)GetClipboardData(CF_BITMAP);
    CloseClipboard();
    SaveToBmp(bitmap,"c:\\test.bmp");#include "math.h"
    BOOL SaveToBmp(HBITMAP hBitmap,const char *szBmpFile)
    {
    BITMAP bm;
    PBITMAPINFO bmpInf;
    BOOL bRet=FALSE;
    int nPaletteSize=0; if(GetObject(hBitmap,sizeof(bm),&bm)==0)
    return FALSE; if(bm.bmBitsPixel<16)
    nPaletteSize=pow(2,bm.bmBitsPixel); bmpInf=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+
    sizeof(RGBQUAD)*nPaletteSize);

    if(bmpInf==NULL)
    {
    return FALSE;
    }

    //-----------------------------------------------
    bmpInf->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInf->bmiHeader.biWidth = bm.bmWidth;
    bmpInf->bmiHeader.biHeight = bm.bmHeight;
    bmpInf->bmiHeader.biPlanes = bm.bmPlanes;
    bmpInf->bmiHeader.biBitCount = bm.bmBitsPixel;
    bmpInf->bmiHeader.biCompression = BI_RGB;
    bmpInf->bmiHeader.biSizeImage = (bm.bmWidth+7)/8*bm.bmHeight*bm.bmBitsPixel;
    bmpInf->bmiHeader.biXPelsPerMeter = 0;
    bmpInf->bmiHeader.biYPelsPerMeter = 0;
    bmpInf->bmiHeader.biClrUsed = 0;
    bmpInf->bmiHeader.biClrImportant = 0;
    //-----------------------------------------------

    void* buf=(void*) new char[bmpInf->bmiHeader.biSizeImage];
    if(buf==NULL)
    {
    LocalFree(bmpInf);
    return FALSE;
    }

    if(!::GetDIBits(GetWindowDC(NULL),hBitmap,0,(WORD)bm.bmHeight,buf,bmpInf,DIB_RGB_COLORS))
    {
    delete []buf;
    LocalFree(bmpInf);
    return FALSE;
    }


    BITMAPFILEHEADER bmFHeader;
    bmFHeader.bfType=0x4d42;
    bmFHeader.bfReserved1=0;
    bmFHeader.bfReserved2=0;
    bmFHeader.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+bmpInf->bmiHeader.biSize+
    nPaletteSize*sizeof(RGBQUAD));

    bmFHeader.bfSize=(DWORD)(bmFHeader.bfOffBits+bmpInf->bmiHeader.biSizeImage); DWORD dwTemp;
    HANDLE hFile;
    hFile=CreateFile(szBmpFile,GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,NULL);

    while(hFile!=INVALID_HANDLE_VALUE)
    {
    //写BITMAPFILEHEADER
    if(WriteFile(hFile,&bmFHeader,sizeof(BITMAPFILEHEADER),&dwTemp,NULL)==0)
    break;

    //写BITMAPINFOHEADER
    if(WriteFile(hFile,&bmpInf->bmiHeader,bmpInf->bmiHeader.biSize,&dwTemp,NULL)==0)
    break;

    //写调色板数据(可能有)
    if(WriteFile(hFile,&bmpInf->bmiColors,nPaletteSize*sizeof(RGBQUAD),&dwTemp,NULL)==0)
    break; //写图像数据
    DWORD dwLen=bmpInf->bmiHeader.biSizeImage;
    BYTE *pTemp=(BYTE*)buf;
    while(dwLen>=65535)
    {
    if(WriteFile(hFile,pTemp,65535,&dwTemp,NULL)==0)
    {
    dwLen=0xffffffff;
    break;
    }
    dwLen-=65535;
    pTemp+=65535;
    }

    if(dwLen==0xffffffff)
    break; if((dwLen>0)&&(WriteFile(hFile,pTemp,dwLen,&dwTemp,NULL)==0))
    break; bRet=TRUE; break;//必须的
    }

    if(hFile!=INVALID_HANDLE_VALUE)
    {
    CloseHandle(hFile);
    } delete []buf;
    LocalFree(bmpInf);
    return bRet;
    }