如何将客户区的某块区域保存为一幅位图,请高手指点,不胜感激!
解决方案 »
- 关于“因为应用程序正在发送一个输入同步呼叫,所以无法执行传出的呼叫”的问题
- 为什么输出加不一样?
- 怎样使DC(CompatibleDC)中位图大小改变
- windows下SNMPv3 TRAP的配置
- 怎么设置 CreatePen()的参数 画出 黑色和灰色相间的虚线来呢!!
- 用CComBar控件得问题
- 申请该版版主
- 请高手指点Intel的JPEG-library(IJG)的用法.
- 看《深入浅出MFC》之前,还要先看WINDOWS编程方面的事吗?
- VS2010新建的MFC项目中类视图不显示基类成员
- WINDOWS里有WritePrivateProfileInt这个函数吗?怎么找不到?
- CPaitDC和CDC为什么效果不一样
BOOL CEastDrawView::SaveDIB(CBitmap*pbitmap, CFile&file)
{
CClientDC dc(this);
OnPrepareDC(&dc);
dc.SetWindowOrg(m_CenterPoint);
CDC*pViewDC=&dc;
CEastDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); CBitmap*Oldmap;
CBitmap Bitmap;
CDC memDC;
Bitmap.CreateCompatibleBitmap(pViewDC,this->GetTotalSize().cx,this->GetTotalSize().cy);
memDC.CreateCompatibleDC(pViewDC);
memDC.SetMapMode(pViewDC->GetMapMode());
Oldmap=memDC.SelectObject(&Bitmap);
memDC.SetWindowOrg(m_CenterPoint);
memDC.PatBlt(m_CenterPoint.x,m_CenterPoint.y,GetTotalSize().cx,GetTotalSize().cy,WHITENESS);
this->DrawAll(&memDC);
if(this->m_HaveAxis)
this->DrawAxis(&memDC);
::GdiFlush();
memDC.SelectObject(Oldmap);
memDC.DeleteDC();
BITMAPFILEHEADER bmfHdr;
bmfHdr.bfType=0x4d42;
int sizeHdr=sizeof(BITMAPINFOHEADER);
LPBITMAPINFOHEADER lpBI=( LPBITMAPINFOHEADER)::GlobalAlloc(LMEM_FIXED,sizeHdr);
if(!lpBI)
{
AfxMessageBox("内存申请失败,请稍后再试");
}
BYTE *pDib;
BYTE *pDib2;
pDib=(BYTE*)::GlobalAlloc(LMEM_FIXED,GetTotalSize().cx*GetTotalSize().cy*4);
if(!pDib)
{
AfxMessageBox("内存申请失败,请稍后再试");
}
lpBI->biSize=(LONG)sizeof(BITMAPINFOHEADER);
lpBI->biWidth=(LONG)this->GetTotalSize().cx;
lpBI->biHeight=(LONG)this->GetTotalSize().cy;
lpBI->biPlanes=1;
lpBI->biBitCount=32;
lpBI->biCompression=BI_RGB;
lpBI->biSizeImage=0;
lpBI->biXPelsPerMeter=0;
lpBI->biYPelsPerMeter=0;
lpBI->biClrUsed=0;
lpBI->biClrImportant=0;
Bitmap.GetBitmapBits(GetTotalSize().cx*GetTotalSize().cy*4,pDib); pDib2=(BYTE*)::GlobalAlloc(LMEM_FIXED,GetTotalSize().cx*GetTotalSize().cy*4);
if(!pDib2)
{
AfxMessageBox("内存申请失败,请稍后再试");
}
for(int j=0;j<GetTotalSize().cy;j++)
for(int i=0;i<GetTotalSize().cx*4;i++)
{
pDib2[i+j*GetTotalSize().cx*4]=pDib[GetTotalSize().cx*(GetTotalSize().cy-1-j)*4+i];
}
::GlobalFree(pDib);
bmfHdr.bfSize=(DWORD) (sizeof(BITMAPFILEHEADER) +
sizeHdr +GetTotalSize().cx*GetTotalSize().cy*4);
bmfHdr.bfReserved1=bmfHdr.bfReserved2=0;
bmfHdr.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeHdr;
try
{
file.Write((LPVOID)&bmfHdr,sizeof(BITMAPFILEHEADER));
file.Write((LPVOID)lpBI,sizeHdr);
file.WriteHuge((LPVOID)pDib2,GetTotalSize().cx*GetTotalSize().cy*4);
} catch(CException*Fe)
{
Fe->ReportError();
Fe->Delete();
return false;
}
::GlobalFree(lpBI);
::GlobalFree(pDib2);
return true;
}