????????????多文档保存Ondraw所画图像 多文档保存Ondraw所画图像无法保存,请教高手帮助!!!!!!!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void CTFractalDoc::OnFileSave() { CTFractalView* pView=(CTFractalView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView(); CRect rc=pView->m_ampRect; BOOL Whole=TRUE; if(rc.Width()*rc.Height()!=0) { SaveDlg dlg;//CFileDialog也可以,目的是获取需要保存的文件名 if(dlg.DoModal()==IDCANCEL) return; else Whole=dlg.m_bWhole; } if(Whole) pView->GetClientRect(&rc); else rc+=CPoint(2,2); SaveRectToBmp(pView,rc);}void CTFractalDoc::SaveRectToBmp(CWnd* pWnd,CRect& rect){ CDC* pWndDC,dcMem; CBitmap bitmap; pWndDC=pWnd->GetWindowDC(); dcMem.CreateCompatibleDC(pWndDC); bitmap.CreateCompatibleBitmap(pWndDC,rect.Width(),rect.Height()); CBitmap* pOldBitmap=dcMem.SelectObject(&bitmap); dcMem.BitBlt(0,0,rect.Width(),rect.Height(),pWndDC,rect.left,rect.top,SRCCOPY); HBITMAP hBitmap=(HBITMAP)bitmap; CPalette* pPalette=dcMem.GetCurrentPalette(); HANDLE hPalette=(HANDLE)pPalette; DWORD dwPaletteSize=0; if(hPalette!=NULL) dwPaletteSize=::GlobalSize(hPalette); BITMAP bm; ::GetObject(hBitmap,sizeof(BITMAP),&bm); BITMAPFILEHEADER bfh; BITMAPINFOHEADER bih; memset(&bfh,0,sizeof(BITMAPFILEHEADER)); memset(&bih,0,sizeof(BITMAPINFOHEADER)); DWORD dwImageSize=bm.bmHeight*bm.bmWidthBytes; bfh.bfType='MB'; bfh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwImageSize; bfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize; bih.biSize=sizeof(BITMAPINFOHEADER); bih.biWidth=bm.bmWidth; bih.biHeight=bm.bmHeight; bih.biPlanes=bm.bmPlanes; bih.biBitCount=bm.bmBitsPixel; bih.biSizeImage=::GlobalSize(hBitmap); char szFilter[]=_T("BMP Files (*.bmp)|*.bmp|All Files(*.*)|*.*||"); CFileDialog FileDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY,szFilter);// if(FileDlg.DoModal()==IDCANCEL) return; CString szFileName=FileDlg.GetFileName(); //auto detect and sure extend name is ".bmp" if(szFileName.Find(".bmp")==-1) szFileName+=".bmp"; CFile cf; if(cf.Open(szFileName,CFile::modeCreate|CFile::modeWrite)) { cf.Write(&bfh,sizeof(BITMAPFILEHEADER)); cf.Write(&bih,sizeof(BITMAPINFOHEADER)); if(hPalette!=NULL) { char* pBuffer=(char*)::GlobalLock(hPalette); cf.Write(pBuffer,dwPaletteSize); ::GlobalUnlock(hPalette); } char* pDataBuffer=new char[dwImageSize]; if(pDataBuffer!=NULL) { ::GetBitmapBits(hBitmap,dwImageSize,pDataBuffer); for(int i=0;i<bm.bmHeight;i++) { int nOffset; nOffset=bm.bmHeight-i-1; nOffset*=bm.bmWidthBytes; cf.Write(&pDataBuffer[nOffset],bm.bmWidthBytes); } delete[] pDataBuffer; } } dcMem.SelectObject(pOldBitmap); bitmap.Detach();} socket中UDP加入组播问题请教? VS2010 中ADO获取记录集的列名总是出错 求助!!如何在弹出的对话框中实现socket功能 如何取得CPU的使用率 ado插入空值 我在2000下用VC内嵌汇编操作COM串口,out不行,怎么办...高手指教 OnPaint和OnDraw到底有什么区别??? 如何访问我的成员变量 采用CBCGControl的工程,修改主菜单无效问题 这样能实现吗?关于窗口的Z序问题。 想认识一下搞图像处理&模式识别的朋友,留个联系方式好吗? 帮帮忙,好心人
{
CTFractalView* pView=(CTFractalView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
CRect rc=pView->m_ampRect;
BOOL Whole=TRUE;
if(rc.Width()*rc.Height()!=0)
{
SaveDlg dlg;//CFileDialog也可以,目的是获取需要保存的文件名
if(dlg.DoModal()==IDCANCEL) return;
else Whole=dlg.m_bWhole;
}
if(Whole) pView->GetClientRect(&rc);
else rc+=CPoint(2,2);
SaveRectToBmp(pView,rc);
}void CTFractalDoc::SaveRectToBmp(CWnd* pWnd,CRect& rect)
{
CDC* pWndDC,dcMem;
CBitmap bitmap; pWndDC=pWnd->GetWindowDC();
dcMem.CreateCompatibleDC(pWndDC); bitmap.CreateCompatibleBitmap(pWndDC,rect.Width(),rect.Height()); CBitmap* pOldBitmap=dcMem.SelectObject(&bitmap);
dcMem.BitBlt(0,0,rect.Width(),rect.Height(),pWndDC,rect.left,rect.top,SRCCOPY);
HBITMAP hBitmap=(HBITMAP)bitmap;
CPalette* pPalette=dcMem.GetCurrentPalette();
HANDLE hPalette=(HANDLE)pPalette;
DWORD dwPaletteSize=0;
if(hPalette!=NULL)
dwPaletteSize=::GlobalSize(hPalette); BITMAP bm;
::GetObject(hBitmap,sizeof(BITMAP),&bm);
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih; memset(&bfh,0,sizeof(BITMAPFILEHEADER));
memset(&bih,0,sizeof(BITMAPINFOHEADER)); DWORD dwImageSize=bm.bmHeight*bm.bmWidthBytes; bfh.bfType='MB';
bfh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwImageSize;
bfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize; bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biWidth=bm.bmWidth;
bih.biHeight=bm.bmHeight;
bih.biPlanes=bm.bmPlanes;
bih.biBitCount=bm.bmBitsPixel;
bih.biSizeImage=::GlobalSize(hBitmap); char szFilter[]=_T("BMP Files (*.bmp)|*.bmp|All Files(*.*)|*.*||");
CFileDialog FileDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY,szFilter);// if(FileDlg.DoModal()==IDCANCEL) return;
CString szFileName=FileDlg.GetFileName();
//auto detect and sure extend name is ".bmp"
if(szFileName.Find(".bmp")==-1)
szFileName+=".bmp"; CFile cf;
if(cf.Open(szFileName,CFile::modeCreate|CFile::modeWrite))
{
cf.Write(&bfh,sizeof(BITMAPFILEHEADER));
cf.Write(&bih,sizeof(BITMAPINFOHEADER));
if(hPalette!=NULL)
{
char* pBuffer=(char*)::GlobalLock(hPalette);
cf.Write(pBuffer,dwPaletteSize);
::GlobalUnlock(hPalette);
}
char* pDataBuffer=new char[dwImageSize];
if(pDataBuffer!=NULL)
{
::GetBitmapBits(hBitmap,dwImageSize,pDataBuffer);
for(int i=0;i<bm.bmHeight;i++)
{
int nOffset;
nOffset=bm.bmHeight-i-1;
nOffset*=bm.bmWidthBytes;
cf.Write(&pDataBuffer[nOffset],bm.bmWidthBytes);
}
delete[] pDataBuffer;
}
}
dcMem.SelectObject(pOldBitmap);
bitmap.Detach();
}