我已经作了一个绘图程序,比如在VIEW上画了直线,圆
如何把当前VIEW通过通用对话框存成*.BMP文件

解决方案 »

  1.   

    直接画在内存上,然后BITBLT即可。
      

  2.   

    参考:
    CDC dc;
    dc.CreateDC("DISPLAY", NULL, NULL, NULL);
    CBitmap bm;
    int Width = 800;//GetSystemMetrics(SM_CXSCREEN);
    int Height = 600;//GetSystemMetrics(SM_CYSCREEN);
    bm.CreateCompatibleBitmap(&dc, Width, Height);
    CDC tdc;
    tdc.CreateCompatibleDC(&dc);
    CBitmap* pOld = tdc.SelectObject(&bm);
    tdc.BitBlt(0, 0, Width, Height, &dc, 0, 0, SRCCOPY);
    tdc.SelectObject(pOld); BITMAP btm;
    bm.GetBitmap(&btm);
    DWORD size = btm.bmWidthBytes* btm.bmHeight;
    LPSTR lpData = (LPSTR) GlobalAllocPtr(GPTR, size);
    /////////////////////////////////////////////
    /////////////////////////////////////////////
    BITMAPINFOHEADER bih;
    bih.biBitCount = btm.bmBitsPixel;
    bih.biClrImportant = 0;
    bih.biClrUsed = 0;
    bih.biCompression = 0;
    bih.biHeight = btm.bmHeight;
    bih.biPlanes = 1;
    bih.biSize = sizeof(BITMAPINFOHEADER);
    bih.biSizeImage = size;
    bih.biWidth = btm.bmWidth;
    bih.biXPelsPerMeter = 0;
    bih.biYPelsPerMeter = 0;
    ///////////////////////////////////
    GetDIBits(dc, bm, 0, bih.biHeight, lpData, (BITMAPINFO *) &bih,
    DIB_RGB_COLORS);
    // bm.GetBitmapBits(size,lpData); //此函数在处理5-5-5模式的16位色下会出现颜色混乱
    //////////////////////////////
    //修改RGB值
    int nWidth = btm.bmWidth * 4;
    for (int i = 0; i < btm.bmHeight; i++)
    {
    for (int j = 0; j < btm.bmWidth; j++)
    {
    lpData[i * nWidth + j * 4 + 2] = GetRandomRGBValue(); //R
    lpData[i * nWidth + j * 4 + 1] = GetRandomRGBValue(); //G
    lpData[i * nWidth + j * 4] = GetRandomRGBValue(); //B
    TRACE("\nR = %d; G = %d; B = %d\n",
    lpData[i * nWidth + j * 4 + 2],
    lpData[i * nWidth + j * 4 + 1], lpData[i * nWidth + j * 4]);
    }
    } static int filecount = 0;
    CString name;
    name = "D:\\Test.bmp";//m_Path+name;
    BITMAPFILEHEADER bfh;
    bfh.bfReserved1 = bfh.bfReserved2 = 0;
    bfh.bfType = ((WORD) ('M' << 8) | 'B');
    bfh.bfSize = 54 + size;
    bfh.bfOffBits = 54; CFile bf;
    if (bf.Open(name, CFile::modeCreate | CFile::modeWrite))
    {
    bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));
    bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));
    bf.WriteHuge(lpData, size);
    bf.Close();
    }
    GlobalFreePtr(lpData);
    AfxMessageBox("Create BMP File Over!");
    }
      

  3.   

    BOOL SaveToFile(HBITMAP hBitmap, LPCTSTR lpszFileName)
    {
    HDC hDC;
    //当前分辨率下每象素所占字节数
    int iBits;
    //位图中每象素所占字节数
    WORD wBitCount;
    //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
    DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
    //位图属性结构
    BITMAP Bitmap;
    //位图文件头结构
    BITMAPFILEHEADER bmfHdr;
    //位图信息头结构
    BITMAPINFOHEADER bi;
    //指向位图信息头结构
    LPBITMAPINFOHEADER lpbi;
    //定义文件,分配内存句柄,调色板句柄
    HANDLE fh, hDib, hPal,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
    wBitCount = 24;
    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.biClrImportant = 0;
    bi.biClrUsed = 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, (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;
    }
      

  4.   

    crystal521(水晶泪)使用的是传统的方法,
    你也可以使用序列化(serialize)完成这个工作(步骤更简单,但理解有点复杂),
    请参考《深入浅出MFC》的序列化部分以及MSDN.
      

  5.   

    有两个问题
    1,BOOL SaveToFile(HBITMAP hBitmap, LPCTSTR lpszFileName)
    对于参数hBitmap,我该如何把我现在画的图的VIEW转化成这个参数2,hDC = GetDC(NULL);编译有误回答就给分
      

  6.   

    GetDC();没有参数CBitmap bm;
    int Width = 800;//GetSystemMetrics(SM_CXSCREEN);
    int Height = 600;//GetSystemMetrics(SM_CYSCREEN);
    bm.CreateCompatibleBitmap(&dc, Width, Height);
    HTITMAP hBitmap = HBITMAP(bm)