请教大家如何拷贝子窗口所绘制的图形呢? 在MFC中,想要拷贝子窗口所绘制的图形,并存为BMP文件应该怎么办呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就是将在子窗体上绘制的内容存为BMP,应该怎么办呢?请大家指点! 首先得到子窗体的BMP,得到dc即可得到bmp。用GetObject(sizeog(BITMAP),&bm)得到bmp的参数[bm为BITMAP对象]然后用自己写的bmp类获得数据,并保存。关于bmp类,可以搜索一些bmp到jpg等的转换等 首先得到子窗体的BMP,得到dc即可得到bmp。这一段怎么实现呢?我是个菜鸟,请多加指点 子窗体上并不是一个打开的BMP文件,而是利用opengl直接绘制好的一些图形,如何将他们保存为BMP文件呢? 我写了个程序实现了保存子窗体内存到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。 我认为使用BitBlt()函数复制窗口内容,除了窗口内容是动态的情况(如播放VCD的窗口)外,都是可以正确工作的。 哦,多谢几位指点,我的email是:[email protected],一会我就去试试看,如果有问题,再来请教各位,谢谢了! BHO中,如何获取基于iframe页面的href 求助!!郁闷死了!error c2679 关于com组件自身的HWND,一个用atl做的activex控件当被用普通应用程序调用时可正常获得HWND... 哪位高手知道GPS手持机的通讯协议的请进来看看 这是怎么回事? 请问关于内存DC的问题 北京的生活是这样吗???你的收入多少???你脱贫了吗??? 求一个字符串转化为16进制的函数。 strcat() DirectXShow SDK的问题 30分求vc 6.0下载! 为什么dll中的非模式对话框不响应键盘消息
用GetObject(sizeog(BITMAP),&bm)得到bmp的参数[bm为BITMAP对象]
然后用自己写的bmp类获得数据,并保存。关于bmp类,可以搜索一些bmp到jpg等的转换等
这一段怎么实现呢?我是个菜鸟,请多加指点
我写了个程序实现了保存子窗体内存到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。
我认为使用BitBlt()函数复制窗口内容,除了窗口内容是动态的情况(如播放VCD的窗口)外,都是可以正确工作的。