请教大家如何拷贝子窗口所绘制的图形呢?

cxfirefox 2004-12-14 02:39:08
在MFC中,想要拷贝子窗口所绘制的图形,并存为BMP文件应该怎么办呢?
...全文
117 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaozijian110 2004-12-16
  • 打赏
  • 举报
回复
我已经把程序发到你的邮箱了,请查收。
cxfirefox 2004-12-15
  • 打赏
  • 举报
回复
首先得到子窗体的BMP,得到dc即可得到bmp。
这一段怎么实现呢?我是个菜鸟,请多加指点
cxfirefox 2004-12-15
  • 打赏
  • 举报
回复
哦,多谢几位指点,我的email是:cxfirefox@hotmail.com,一会我就去试试看,如果有问题,再来请教各位,谢谢了!
yaozijian110 2004-12-15
  • 打赏
  • 举报
回复

我认为使用BitBlt()函数复制窗口内容,除了窗口内容是动态的情况(如播放VCD的窗口)外,都是可以正确工作的。
yaozijian110 2004-12-15
  • 打赏
  • 举报
回复

我写了个程序实现了保存子窗体内存到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。

cxfirefox 2004-12-15
  • 打赏
  • 举报
回复
子窗体上并不是一个打开的BMP文件,而是利用opengl直接绘制好的一些图形,如何将他们保存为BMP文件呢?
真的李小龙 2004-12-14
  • 打赏
  • 举报
回复
首先得到子窗体的BMP,得到dc即可得到bmp。
用GetObject(sizeog(BITMAP),&bm)得到bmp的参数[bm为BITMAP对象]
然后用自己写的bmp类获得数据,并保存。

关于bmp类,可以搜索一些bmp到jpg等的转换等
cxfirefox 2004-12-14
  • 打赏
  • 举报
回复
就是将在子窗体上绘制的内容存为BMP,应该怎么办呢?请大家指点!

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧