如何将 剪贴板中的位图,自动转化为指定名称的bmp图,保存在硬盘. 如何将 剪贴板中的位图,自动转化为指定名称的bmp图,保存在硬盘. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 给你一个类,你看看吧!你的mail? 着这一个抓屏的类,有写到内存和clip以及文件的函数。 就是一个取得CB DC以及写DC到BMP文件的问题嘛!我来贴。 BOOL CBMPFmt::SaveAs(HDC hDC,LPRECT pRect, LPTSTR pcszPath){ if(!hDC)return FALSE; if(!IsExtension(pcszPath,_T(".bmp"))) _tcscat(pcszPath,_T(".bmp")); CRect rect; if(pRect&&!IsRectEmpty(pRect)) rect.CopyRect(pRect); else return FALSE; BITMAPINFOHEADER bmpi; ZeroMemory(&bmpi,sizeof(BITMAPINFOHEADER)); bmpi.biHeight=rect.Height(); bmpi.biWidth=rect.Width(); bmpi.biBitCount=24; bmpi.biCompression=BI_RGB; bmpi.biSize=sizeof(bmpi); bmpi.biPlanes=1; DWORD* pBits=NULL; HBITMAP hBmp=CreateDIBSection(hDC,(CONST BITMAPINFO*)&bmpi,DIB_RGB_COLORS, (LPVOID*)&pBits,NULL,0); if(!hBmp) return FALSE; HDC hTmpDC=::CreateCompatibleDC(NULL); HGDIOBJ hOldObj=SelectObject(hTmpDC,hBmp); BitBlt(hTmpDC,0,0,bmpi.biWidth,bmpi.biHeight,hDC,rect.left,rect.top, SRCCOPY); BITMAPFILEHEADER bmpfh; ZeroMemory(&bmpfh,sizeof(BITMAPFILEHEADER)); bmpfh.bfType=0x4D42; bmpfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); bmpfh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); BOOL bRet=TRUE; CFile f; if(!f.Open(pcszPath,CFile::modeCreate|CFile::modeReadWrite)){ bRet=FALSE; goto done; } f.Write(&bmpfh,sizeof(BITMAPFILEHEADER)); f.Write(&bmpi,sizeof(BITMAPINFOHEADER)); //Caution bits size! f.WriteHuge(pBits,((bmpi.biWidth*24+31)/32)*4*bmpi.biHeight); f.Close();done: SelectObject(hTmpDC,hOldObj); DeleteObject(hBmp); DeleteDC(hTmpDC); return bRet;} BOOL CChildView::PasteImageFromClipboard(){ if(!OpenClipboard()) return FALSE; if(!IsClipboardFormatAvailable(CF_BITMAP)) return FALSE; HBITMAP hBmp=(HBITMAP)GetClipboardData(CF_BITMAP); HDC dc=::CreateCompatibleDC(NULL); HGDIOBJ hOldObj=SelectObject(dc,hBmp); m_RenderEngine.LoadFromDC(dc); SelectObject(dc,hOldObj); SAFE_DELETEDC(dc); CloseClipboard(); m_RenderEngine.GetPicSize(m_sWidth,m_sHeight); SetZoom(1); m_PicData.m_lPicTop=0; m_PicData.m_lPicLeft=0; SendMessage(WM_PAINT); return TRUE;} MFC问题,高手们都来解答吧! 怎样学好C++ API函数? VS2008连接数据源的问题 图象类对象拾取及移动问题、 屏幕打印缩小问题 用SOCKET发送文件时出现:远程主机强迫关闭了一个现有的连接 请问如何自定义程序的工具栏我调用了Ctoolbar.customize()但是什么也没出来阿 com的事件? 急,我在debug下不能运行 Visual C++,想说爱你并不容易! 怎样在MFC中用自己的函数覆盖Windows API? 哪里有C++ Primer 3/e(不分繁简)下载? sdk方式编写的基于对话框的程序,默认按钮得不到焦点
你的mail?
我来贴。
BOOL CBMPFmt::SaveAs(HDC hDC,LPRECT pRect, LPTSTR pcszPath)
{
if(!hDC)return FALSE;
if(!IsExtension(pcszPath,_T(".bmp")))
_tcscat(pcszPath,_T(".bmp"));
CRect rect;
if(pRect&&!IsRectEmpty(pRect))
rect.CopyRect(pRect);
else
return FALSE;
BITMAPINFOHEADER bmpi;
ZeroMemory(&bmpi,sizeof(BITMAPINFOHEADER));
bmpi.biHeight=rect.Height();
bmpi.biWidth=rect.Width();
bmpi.biBitCount=24;
bmpi.biCompression=BI_RGB;
bmpi.biSize=sizeof(bmpi);
bmpi.biPlanes=1;
DWORD* pBits=NULL;
HBITMAP hBmp=CreateDIBSection(hDC,(CONST BITMAPINFO*)&bmpi,DIB_RGB_COLORS,
(LPVOID*)&pBits,NULL,0);
if(!hBmp)
return FALSE; HDC hTmpDC=::CreateCompatibleDC(NULL);
HGDIOBJ hOldObj=SelectObject(hTmpDC,hBmp);
BitBlt(hTmpDC,0,0,bmpi.biWidth,bmpi.biHeight,hDC,rect.left,rect.top,
SRCCOPY);
BITMAPFILEHEADER bmpfh;
ZeroMemory(&bmpfh,sizeof(BITMAPFILEHEADER));
bmpfh.bfType=0x4D42;
bmpfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmpfh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); BOOL bRet=TRUE;
CFile f;
if(!f.Open(pcszPath,CFile::modeCreate|CFile::modeReadWrite)){
bRet=FALSE;
goto done;
}
f.Write(&bmpfh,sizeof(BITMAPFILEHEADER));
f.Write(&bmpi,sizeof(BITMAPINFOHEADER));
//Caution bits size!
f.WriteHuge(pBits,((bmpi.biWidth*24+31)/32)*4*bmpi.biHeight);
f.Close();
done:
SelectObject(hTmpDC,hOldObj);
DeleteObject(hBmp);
DeleteDC(hTmpDC);
return bRet;
}
BOOL CChildView::PasteImageFromClipboard()
{
if(!OpenClipboard())
return FALSE;
if(!IsClipboardFormatAvailable(CF_BITMAP))
return FALSE;
HBITMAP hBmp=(HBITMAP)GetClipboardData(CF_BITMAP);
HDC dc=::CreateCompatibleDC(NULL);
HGDIOBJ hOldObj=SelectObject(dc,hBmp);
m_RenderEngine.LoadFromDC(dc);
SelectObject(dc,hOldObj);
SAFE_DELETEDC(dc);
CloseClipboard(); m_RenderEngine.GetPicSize(m_sWidth,m_sHeight);
SetZoom(1); m_PicData.m_lPicTop=0;
m_PicData.m_lPicLeft=0;
SendMessage(WM_PAINT);
return TRUE;
}