一个小程序,一个“画图“按钮,按下后出现一个实心圆的位图,再按“保存“按钮保存该位图(.bmp)
请问分别在哪里写这两段代码,怎么写?
谢谢~~

解决方案 »

  1.   

    http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=701
      

  2.   

    BOOL SaveBitmapToFile(HBITMAP hBitmap, LPCTSTR lpszFileName, int nBitCount)
    {
    HDC hDC;
        int iBits;
    WORD            wBitCount;
    DWORD           dwPaletteSize=0,
    dwBmBitsSize,
    dwDIBSize, 
    dwWritten;
    BITMAP          Bitmap;        
    BITMAPFILEHEADER   bmfHdr;
        BITMAPINFOHEADER   bi;
    LPBITMAPINFOHEADER lpbi;
        HANDLE          fh, hDib, hPal,hOldPal=NULL; if(nBitCount == -1)
    {
    hDC = CreateDC(NULL, NULL, NULL, NULL);
    iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
    DeleteDC(hDC);
    }
    else
    {
    iBits = nBitCount;
    } if (iBits <= 1)
    wBitCount = 1;
    else if (iBits <= 4)
    wBitCount = 4;
    else if (iBits <= 8)
    wBitCount = 8;
    else if (iBits <= 24)
    wBitCount = 24; 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,
    (LPBITMAPINFO)lpbi, DIB_RGB_COLORS);

    if (hOldPal)
    {
    SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
    RealizePalette(hDC);
    ::ReleaseDC(NULL, hDC);
    }

    fh = CreateFile(lpszFileName, 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;
    }
    BOOL SaveRectBmpToFile(CDC *pDC, CRect rect, char *filename)
    {
    CDC MemDC;
    CBitmap NewBmp,*pOldBmp;
    BOOL bflag;
    MemDC.CreateCompatibleDC(pDC);
    NewBmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
    pOldBmp=MemDC.SelectObject(&NewBmp);
    MemDC.BitBlt(0,0,rect.Width(),rect.Height(),pDC,rect.left,rect.top,SRCCOPY);
    bflag=SaveBitmapToFile(NewBmp,filename,4);
    MemDC.SelectObject(pOldBmp);
    NewBmp.DeleteObject();
    MemDC.DeleteDC();
    return bflag;
    }在按钮事件中调用函数SaveRectBmpToFile就可以了,参数分别为CDC指针,保存区域,文件名