想保存视图,不保存对话框 对话框常驻视图之上,想保存视图为BMP,但不保存对话框,请指教. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 双缓冲技术:CDC MemDC; //定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL); //建立一个与屏幕显示兼容的位图,位图的大小用窗口的大小 MemBitmap.CreateCompatibleBitmap(pDC,sz.cx,sz.cy); //将位图选入到内存显示设备中 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //用背景色将位图清除干净 MemDC.FillSolidRect(0,0,sz.cx,sz.cy,RGB(255,255,255)); //绘图 MemDC.Move(0,0);MemDC.LineTo(300,300); MemBitmap不就是你要的位图吗?//将内存中的图拷贝到屏幕上进行显示 pDC->BitBlt(0,0,sz.cx,sz.cy,&MemDC,0,0,SRCCOPY); //绘图完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC(); } 保存视图客户区void CXXXView::SaveToBmp(){ BITMAPINFO bi;//信息头 void *pBits=NULL; CRect rect;//客户区窗口 GetClientRect(&rect); int nWidth=rect.right; int nHeight=rect.bottom; //填充信息头 ZeroMemory(&bi,sizeof(bi)); bi.bmiHeader.biSize=sizeof(bi.bmiHeader); bi.bmiHeader.biHeight=nHeight; bi.bmiHeader.biWidth=nWidth; bi.bmiHeader.biPlanes=1; bi.bmiHeader.biBitCount=24; bi.bmiHeader.biCompression=BI_RGB; bi.bmiHeader.biSizeImage=3*nWidth*nHeight; //拷贝客户区至内存DC HDC hActiveDC=::GetDC(this->m_hWnd); HDC hActiveWndCompatibleDC=CreateCompatibleDC(hActiveDC); HBITMAP hActiveWndCompactibleBitmap=CreateCompatibleBitmap(hActiveDC,rect.right,rect.bottom); SelectObject(hActiveWndCompatibleDC,hActiveWndCompactibleBitmap); BitBlt(hActiveWndCompatibleDC,0,0,rect.right,rect.bottom,hActiveDC,0,0,SRCCOPY); //保存内存DC HDC hBmpFileDC=CreateCompatibleDC(hActiveWndCompatibleDC); HBITMAP hBmpFileBitmap=CreateDIBSection(hActiveWndCompatibleDC,&bi,DIB_RGB_COLORS,&pBits,NULL,0); SelectObject(hBmpFileDC,hBmpFileBitmap); BitBlt(hBmpFileDC,0,0,nWidth,nHeight,hActiveWndCompatibleDC,0,0,SRCCOPY); CString tempFileName=_T("test.bmp");//目标文件名 CFileDialog dlg(FALSE, _T("bmp"), _T("Temp.bmp"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Bitmap Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"), this); if(dlg.DoModal() == IDOK) { tempFileName=dlg.GetPathName(); } HANDLE hFile=CreateFile(tempFileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile!=INVALID_HANDLE_VALUE) { DWORD dwRet=0; //填充文件头 BITMAPFILEHEADER bmfHeader; ZeroMemory(&bmfHeader,sizeof(bmfHeader)); bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); bmfHeader.bfSize=bi.bmiHeader.biSizeImage+bmfHeader.bfOffBits; bmfHeader.bfType='MB'; WriteFile(hFile,&bmfHeader,sizeof(bmfHeader),&dwRet,NULL); WriteFile(hFile,&bi.bmiHeader,sizeof(bi.bmiHeader),&dwRet,NULL); WriteFile(hFile,pBits,bi.bmiHeader.biSizeImage,&dwRet,NULL); CloseHandle(hFile); }} 如果你是用截图方法来截获客户区的,想把对话框去掉很难,你可以在对话框出现之前截图,或截图之前销毁对话框,如果必须在有对话框的时候截图,你可以采用一楼的方法,在对话框出现之前截图,把图片放在一个内存DC中就行了CClientDC dc(this);与当前窗口的设备上下文CDC MemDC; //定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(&dc); //建立一个与屏幕显示兼容的位图,位图的大小用窗口的大小 MemBitmap.CreateCompatibleBitmap(&dc,cx,cy); //cx,cy为图片大小,可以设置为你要截区域的大小 //将位图选入到内存显示设备中 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); MemDC.m.BitBlt(0,0,nx,ny,&dc,0,0,SRCCOPY); //把你要保存的部分放到兼容DC中 这时MemBitmap中就是你要保存的图片 //绘图 MemBitmap不就是你要的位图吗?//将内存中的图拷贝到屏幕上进行显示 pDC-> BitBlt(0,0,sz.cx,sz.cy,&MemDC,0,0,SRCCOPY); //绘图完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC(); CString 转 long 谁有在vs2005下C++编程的视频教程啊。。 CoInitialize 是线程相关的吗 怎么样能在win7下实现NDIS中间层网络驱动的动态加载? 遍历RichEdit中输入的所有字符属性~!急 懂水晶报表的高人来!在补妆水晶报表的客户端的VC应用程序怎样才能正确的使用报表模板? 最近程序老是不稳定,跟踪日志发现是在两个CString对象相加时程序异常,各位老大有没有遇到过? 一个小问题,一直不是很明白! 获取svn的版本号 求算法思路 请问可以从MFC规则DLL中导出非MFC继承类吗? CRectTracker有问题
CBitmap MemBitmap;//定义一个位图对象
//建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//建立一个与屏幕显示兼容的位图,位图的大小用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,sz.cx,sz.cy);
//将位图选入到内存显示设备中
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//用背景色将位图清除干净
MemDC.FillSolidRect(0,0,sz.cx,sz.cy,RGB(255,255,255));
//绘图
MemDC.Move(0,0);
MemDC.LineTo(300,300); MemBitmap不就是你要的位图吗?//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,sz.cx,sz.cy,&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
void CXXXView::SaveToBmp()
{
BITMAPINFO bi;//信息头
void *pBits=NULL;
CRect rect;//客户区窗口
GetClientRect(&rect);
int nWidth=rect.right;
int nHeight=rect.bottom;
//填充信息头
ZeroMemory(&bi,sizeof(bi));
bi.bmiHeader.biSize=sizeof(bi.bmiHeader);
bi.bmiHeader.biHeight=nHeight;
bi.bmiHeader.biWidth=nWidth;
bi.bmiHeader.biPlanes=1;
bi.bmiHeader.biBitCount=24;
bi.bmiHeader.biCompression=BI_RGB;
bi.bmiHeader.biSizeImage=3*nWidth*nHeight; //拷贝客户区至内存DC
HDC hActiveDC=::GetDC(this->m_hWnd);
HDC hActiveWndCompatibleDC=CreateCompatibleDC(hActiveDC);
HBITMAP hActiveWndCompactibleBitmap=CreateCompatibleBitmap(hActiveDC,rect.right,rect.bottom);
SelectObject(hActiveWndCompatibleDC,hActiveWndCompactibleBitmap);
BitBlt(hActiveWndCompatibleDC,0,0,rect.right,rect.bottom,hActiveDC,0,0,SRCCOPY);
//保存内存DC
HDC hBmpFileDC=CreateCompatibleDC(hActiveWndCompatibleDC);
HBITMAP hBmpFileBitmap=CreateDIBSection(hActiveWndCompatibleDC,&bi,DIB_RGB_COLORS,&pBits,NULL,0);
SelectObject(hBmpFileDC,hBmpFileBitmap);
BitBlt(hBmpFileDC,0,0,nWidth,nHeight,hActiveWndCompatibleDC,0,0,SRCCOPY);
CString tempFileName=_T("test.bmp");//目标文件名
CFileDialog dlg(FALSE, _T("bmp"), _T("Temp.bmp"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Bitmap Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"), this);
if(dlg.DoModal() == IDOK)
{
tempFileName=dlg.GetPathName();
}
HANDLE hFile=CreateFile(tempFileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile!=INVALID_HANDLE_VALUE)
{
DWORD dwRet=0;
//填充文件头
BITMAPFILEHEADER bmfHeader;
ZeroMemory(&bmfHeader,sizeof(bmfHeader));
bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmfHeader.bfSize=bi.bmiHeader.biSizeImage+bmfHeader.bfOffBits;
bmfHeader.bfType='MB';
WriteFile(hFile,&bmfHeader,sizeof(bmfHeader),&dwRet,NULL);
WriteFile(hFile,&bi.bmiHeader,sizeof(bi.bmiHeader),&dwRet,NULL);
WriteFile(hFile,pBits,bi.bmiHeader.biSizeImage,&dwRet,NULL);
CloseHandle(hFile);
}
}
CDC MemDC; //定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(&dc);
//建立一个与屏幕显示兼容的位图,位图的大小用窗口的大小
MemBitmap.CreateCompatibleBitmap(&dc,cx,cy); //cx,cy为图片大小,可以设置为你要截区域的大小
//将位图选入到内存显示设备中
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.m.BitBlt(0,0,nx,ny,&dc,0,0,SRCCOPY); //把你要保存的部分放到兼容DC中
这时MemBitmap中就是你要保存的图片
//绘图
MemBitmap不就是你要的位图吗?//将内存中的图拷贝到屏幕上进行显示
pDC-> BitBlt(0,0,sz.cx,sz.cy,&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();