在窗口上或者在picture控件上画了一个波形,
有没有办法能把这个波形保存为图片?
希望各位高手帮忙啊。

解决方案 »

  1.   

    char path[_MAX_PATH+1];
    GetCurrentDirectory(_MAX_PATH+1, path);
    CFileDialog dlg(FALSE, _T("*.bmp"), _T("MyBmp"), OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_NOCHANGEDIR, _T("Bmp Files (*.bmp)|*.bmp||"));
    dlg.DoModal();
    CString szFile = dlg.GetPathName();
    CDC* pdc = GetDC();
    CDC dcImage;
    if (!dcImage.CreateCompatibleDC(pdc))
    {
    ReleaseDC(pdc);
    return;
    }
    CRect rectcc;
    GetClientRect(&rectcc);
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(pdc,rectcc.Width(), rectcc.Height());
    CBitmap* oldbmp1 = dcImage.SelectObject(&bitmap);
    //OnDraw(&dcImage);
    //CBitmap* oldbmp = m_pMemDC->SelectObject(m_pBitmap);
    dcImage.BitBlt(0,0,rectcc.Width(),rectcc.Height(), pdc,0,0,SRCCOPY);
    //m_pMemDC->SelectObject(oldbmp);
    dcImage.SelectObject(oldbmp1);

    WriteDIB((LPSTR)(LPCTSTR)szFile, DDBToDIB(bitmap, BI_RGB, NULL));
    ReleaseDC(pdc);
    SetCurrentDirectory(path);
      

  2.   

    // DDBToDIB - Creates a DIB from a DDB
    // bitmap - Device dependent bitmap
    // dwCompression - Type of compression - see BITMAPINFOHEADER
    // pPal - Logical palette
    HANDLE DDBToDIB( CBitmap& bitmap, DWORD dwCompression, CPalette* pPal ) 
    {
    BITMAP bm;
    BITMAPINFOHEADER bi;
    LPBITMAPINFOHEADER  lpbi;
    DWORD dwLen;
    HANDLE hDIB;
    HANDLE handle;
    HDC  hDC;
    HPALETTE hPal;
    ASSERT( bitmap.GetSafeHandle() ); // The function has no arg for bitfields
    if( dwCompression == BI_BITFIELDS )
    return NULL; // If a palette has not been supplied use defaul palette
    hPal = (HPALETTE) pPal->GetSafeHandle();
    if (hPal==NULL)
    hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE); // Get bitmap information
    bitmap.GetObject(sizeof(bm),(LPSTR)&bm); // Initialize the bitmapinfoheader
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = bm.bmWidth;
    bi.biHeight  = bm.bmHeight;
    bi.biPlanes  = 1;
    bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel;
    bi.biCompression = dwCompression;
    bi.biSizeImage = 0;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;
    bi.biClrImportant = 0; // Compute the size of the  infoheader and the color table
    int nColors = (1 << bi.biBitCount);
    if( nColors > 256 ) 
    nColors = 0;
    dwLen  = bi.biSize + nColors * sizeof(RGBQUAD); // We need a device context to get the DIB from
    hDC = GetDC(NULL);
    hPal = SelectPalette(hDC,hPal,FALSE);
    RealizePalette(hDC); // Allocate enough memory to hold bitmapinfoheader and color table
    hDIB = GlobalAlloc(GMEM_FIXED,dwLen); if (!hDIB){
    SelectPalette(hDC,hPal,FALSE);
    ReleaseDC(NULL,hDC);
    return NULL;
    } lpbi = (LPBITMAPINFOHEADER)hDIB; *lpbi = bi; // Call GetDIBits with a NULL lpBits param, so the device driver 
    // will calculate the biSizeImage field 
    GetDIBits(hDC, (HBITMAP)bitmap.GetSafeHandle(), 0L, (DWORD)bi.biHeight,
    (LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS); bi = *lpbi; // If the driver did not fill in the biSizeImage field, then compute it
    // Each scan line of the image is aligned on a DWORD (32bit) boundary
    if (bi.biSizeImage == 0){
    bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) 
    * bi.biHeight; // If a compression scheme is used the result may infact be larger
    // Increase the size to account for this.
    if (dwCompression != BI_RGB)
    bi.biSizeImage = (bi.biSizeImage * 3) / 2;
    } // Realloc the buffer so that it can hold all the bits
    dwLen += bi.biSizeImage;
    if (handle = GlobalReAlloc(hDIB, dwLen, GMEM_MOVEABLE))
    hDIB = handle;
    else{
    GlobalFree(hDIB); // Reselect the original palette
    SelectPalette(hDC,hPal,FALSE);
    ReleaseDC(NULL,hDC);
    return NULL;
    } // Get the bitmap bits
    lpbi = (LPBITMAPINFOHEADER)hDIB; // FINALLY get the DIB
    BOOL bGotBits = GetDIBits( hDC, (HBITMAP)bitmap.GetSafeHandle(),
    0L, // Start scan line
    (DWORD)bi.biHeight, // # of scan lines
    (LPBYTE)lpbi  // address for bitmap bits
    + (bi.biSize + nColors * sizeof(RGBQUAD)),
    (LPBITMAPINFO)lpbi, // address of bitmapinfo
    (DWORD)DIB_RGB_COLORS); // Use RGB for color table if( !bGotBits )
    {
    GlobalFree(hDIB);

    SelectPalette(hDC,hPal,FALSE);
    ReleaseDC(NULL,hDC);
    return NULL;
    } SelectPalette(hDC,hPal,FALSE);
    ReleaseDC(NULL,hDC);
    return hDIB;
    }// WriteDIB - Writes a DIB to file
    // Returns - TRUE on success
    // szFile - Name of file to write to
    // hDIB - Handle of the DIB
    BOOL WriteDIB( LPTSTR szFile, HANDLE hDIB)
    {
    BITMAPFILEHEADER hdr;
    LPBITMAPINFOHEADER lpbi; if (!hDIB)
    return FALSE; CFile file;
    if( !file.Open( szFile, CFile::modeWrite|CFile::modeCreate) )
    return FALSE; lpbi = (LPBITMAPINFOHEADER)hDIB; int nColors = 1 << lpbi->biBitCount;
    if( nColors > 256 ) 
    nColors = 0; // Fill in the fields of the file header 
    hdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM"
    hdr.bfSize = GlobalSize (hDIB) + sizeof( hdr );
    hdr.bfReserved1  = 0;
    hdr.bfReserved2  = 0;
    hdr.bfOffBits = (DWORD) (sizeof( hdr ) + lpbi->biSize +
    nColors * sizeof(RGBQUAD)); // Write the file header 
    file.Write( &hdr, sizeof(hdr) ); // Write the DIB header and the bits 
    file.Write( lpbi, GlobalSize(hDIB) ); return TRUE;
    }
      

  3.   

    刚好做过一个相同的东西,发个程序给你吧。
    void CUSBSENDDlg::OnSave() 
    {
    // TODO: Add your control notification handler code here
    CRect rect;
    HBITMAP hBmp; GetDlgItem(IDC_PIC)->GetWindowRect(rect);
    ScreenToClient(rect); CString strFilter="Bitmap Files (*.bmp)|*.bmp||";
    CFileDialog dlg(FALSE,"bmp", NULL, OFN_HIDEREADONLY|OFN_EXPLORER, strFilter, NULL); 
    if (dlg.DoModal() == IDOK) 
        {
    hBmp=GetSrcBit(rect);
    SaveBmp(hBmp,dlg.GetPathName());
    }
    }HBITMAP CUSBSENDDlg::GetSrcBit(CRect rect)  
    {  
    HDC  hBufDC,hDC;  
    HBITMAP  hBitmap,  hBitTemp; CClientDC dc(this);
    hDC=dc.GetSafeHdc();
    //创建设备上下文(HDC)  
    hBufDC  =  CreateCompatibleDC(NULL);  

    //创建HBITMAP  
    hBitmap  =  CreateCompatibleBitmap(hDC,rect.Width(),rect.Height());  
    hBitTemp  =  (HBITMAP)  SelectObject(hBufDC,  hBitmap);  

    //得到位图缓冲区  
    StretchBlt(hBufDC,0,0,rect.Width(),rect.Height(),  
    hDC,rect.left,rect.top,rect.Width(),rect.Height(),SRCCOPY);  

    //得到最终的位图信息  
    hBitmap  =  (HBITMAP)  SelectObject(hBufDC,  hBitTemp);  

    //释放内存  

    DeleteObject(hBitTemp);  
    ::DeleteDC(hBufDC);  
    ReleaseDC(&dc);
    return  hBitmap;  
    }  BOOL CUSBSENDDlg::SaveBmp(HBITMAP  hBitmap,  CString  FileName)  
    {  
    //设备描述表  
    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,hOldPal=NULL; 
    // HANDLE hPal;
    //计算位图文件每个像素所占字节数 
    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(FileName,  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.   

    同意saliors(正在学习中) ( ) 信誉:105  goodboyws(深夜不眠者) ( ) 信誉:144