在MFC中,想要拷贝子窗口所绘制的图形,并存为BMP文件应该怎么办呢?

解决方案 »

  1.   

    就是将在子窗体上绘制的内容存为BMP,应该怎么办呢?请大家指点!
      

  2.   

    首先得到子窗体的BMP,得到dc即可得到bmp。
    用GetObject(sizeog(BITMAP),&bm)得到bmp的参数[bm为BITMAP对象]
    然后用自己写的bmp类获得数据,并保存。关于bmp类,可以搜索一些bmp到jpg等的转换等
      

  3.   

    首先得到子窗体的BMP,得到dc即可得到bmp。
    这一段怎么实现呢?我是个菜鸟,请多加指点
      

  4.   

    子窗体上并不是一个打开的BMP文件,而是利用opengl直接绘制好的一些图形,如何将他们保存为BMP文件呢?
      

  5.   


         我写了个程序实现了保存子窗体内存到BMP文件,主要部分代码如下:
          
    HBITMAP CPicSaveDoc::CopyActivateView()
    {
    POSITION      pos;
    CView         *pView;
    CDC           *pDC; RECT          rect;
    int           width,height; pos   = GetFirstViewPosition();
    pView = GetNextView(pos);
    pDC   = pView->GetDC();

    pView->GetClientRect(&rect);
    width    = rect.right  - rect.left;
    height   = rect.bottom - rect.top; m_hMemDC  = CreateCompatibleDC(pDC->m_hDC);
    m_hBitmap = CreateCompatibleBitmap(pDC->m_hDC,width,height);
    SelectObject(m_hMemDC,m_hBitmap); BitBlt(m_hMemDC,0,0,width,height,pDC->m_hDC,0,0,SRCCOPY); return m_hBitmap;
    }BOOL CPicSaveDoc::OnSaveDocument(LPCTSTR lpszPathName) 
    {
    int         height;
    HDIB        hDib;
    BITMAP      bitmap;
    BITMAPINFO *pbmi;
    PBYTE       pBits; //复制活动视图内容到m_hBitmap
    CopyActivateView();

    //把 m_hBitmap转化为 DIB(设备无关位图)
    GetObject(m_hBitmap,sizeof(BITMAP),&bitmap);
    height  = bitmap.bmHeight; pbmi    = (BITMAPINFO *)malloc(sizeof(BITMAPINFO) + bitmap.bmWidthBytes * bitmap.bmHeight);
    pBits   = (PBYTE)pbmi + sizeof(BITMAPINFO);

    pbmi->bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);
    pbmi->bmiHeader.biBitCount    = bitmap.bmBitsPixel;
    pbmi->bmiHeader.biWidth       = bitmap.bmWidth;
    pbmi->bmiHeader.biHeight      = bitmap.bmHeight;
    pbmi->bmiHeader.biPlanes      = 1;
    pbmi->bmiHeader.biCompression = BI_RGB; GetDIBits(m_hMemDC,
              m_hBitmap,
      0,
      height,
      pBits,
      pbmi,
      DIB_RGB_COLORS); //用 《Windows 程序设计》第 16章提供的函数库来保存位图
    hDib    = DibCopyFromPackedDib(pbmi); DeleteDC(m_hMemDC);
    DeleteObject(m_hBitmap); if (hDib)
    {
    if (DibFileSave(hDib,lpszPathName))
    MessageBox(NULL,TEXT("保存位图成功"),TEXT("提示"),MB_OK | MB_ICONINFORMATION);
    else
    MessageBox(NULL,TEXT("保存位图失败"),TEXT("错误"),MB_OK | MB_ICONWARNING);
    }
    else
    MessageBox(NULL,TEXT("保存位图失败"),TEXT("错误"),MB_OK | MB_ICONWARNING);

    if (hDib)
    DibDelete(hDib);

    return TRUE;
    }程序用《Windows 程序设计》第16章提供的函数库实现保存DIB为BMP文件的功能。
    但是还有个小毛病:如果复制窗口内容的时候,别的窗口,比如说保存文件对话框
    挡在子窗口上面的话,那么就会把别的窗口表面复制下来,结果位图文件的部分内容就
    不是子窗口内容了。     如果需要例子程序的话,请留下E-mail。
      

  6.   


       我认为使用BitBlt()函数复制窗口内容,除了窗口内容是动态的情况(如播放VCD的窗口)外,都是可以正确工作的。
      

  7.   

    哦,多谢几位指点,我的email是:[email protected],一会我就去试试看,如果有问题,再来请教各位,谢谢了!