如题,对话框在最前端的时候我是通过截图的形式保存的图片,但是如果对话框最小化了,我还想把对话框中的内容保存为图片,该如何实现呢?十万火急

解决方案 »

  1.   


    保存为jpg bmp 都可以,给个思路,谢谢
      

  2.   

    用CDialog::GetWindowDC得到DC,然后把DC保存为图片,具体代码可以参考:
    http://blog.163.com/fy5388/blog/static/5649953720091127115921330/
      

  3.   


    vb看不懂啊,大哥,有VC没有?
      

  4.   


    那么请参考:
    http://zhidao.baidu.com/question/94236844.html
      

  5.   


    最小化的时候,得不到窗口大小,或者说窗口大小是0,所以是无法保存的。
    要么就是先截获到最小化消息,这个时候在内存中保存一份BMP,最小化后需要时提出来。
      

  6.   

    这个参考一下下面的代码://获得rect指定的图片块,用完此函数返回的HBITMAP句柄后,要调用::DeleteObject()删除句柄
    HBITMAP GetBitmap(HWND m_hWnd,RECT& rect)
    {
    int RectWidth=rect.right-rect.left;
    int RectHeight=rect.bottom-rect.top; HDC hScrDC=::GetDC(m_hWnd); //创建屏幕DC
    HDC hMemDC=CreateCompatibleDC(hScrDC); //创建内存DC
    HBITMAP bitmap=::CreateCompatibleBitmap(hScrDC,RectWidth,RectHeight); //创建兼容位图
    HBITMAP OldBitmap=(HBITMAP)::SelectObject(hMemDC,bitmap); //把位图选进内存DC  //把rect指定的图块拷贝到内存设备描述表
    BitBlt(hMemDC,0,0,RectWidth,RectHeight,hScrDC,rect.left,rect.top,SRCCOPY);   //获取rect指定的bitmap
    bitmap=(HBITMAP)::SelectObject(hMemDC,OldBitmap); 

    ::DeleteDC(hMemDC) ; //删除内存DC
    ::ReleaseDC(m_hWnd,hScrDC) ; //释放屏幕DC

    return bitmap; 
    }//保存位图
    int   SaveBitmap(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;   
    //定义文件,分配内存句柄,调色板句柄   

    //计算位图文件每个像素所占字节数   
    iBits=24;   
    if   (iBits   <=   1)   
    wBitCount   =   1;   
    else   if   (iBits   <=   4)   
    wBitCount   =   4;   
    else   if   (iBits   <=   8)   
    wBitCount   =   8;   
    else   if   (iBits   <=   32)   
    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,   (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;   
    }   void CDemoDlg::OnButton1() 
    {
    RECT rect; 
    ::GetClientRect(m_hWnd,&rect);
    HBITMAP bitmap=GetBitmap(m_hWnd,rect);
    SaveBitmap(bitmap,"c:\\a.bmp");
    DeleteObject(bitmap);
    }