View中绘制的图像通过invalidate()函数
调用ondraw显示出来,如何将当前显示的图像保存到剪贴板中,并且以后能粘贴该剪贴板中的内容?
绘图函数部分代码如下:
CBitmap* poldbmp=m_pmdc->SelectObject(m_pbmp);
CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
m_pmdc->......//绘图
Invalidate(false)
m_pmdc->SelectObject(poldbmp);
头文件中有CBitmap *m_pbmp;CDC* m_pmdc;定义。
ONDRAW函数部分代码如下:
CBitmap* poldbmp=m_pmdc->SelectObject(m_pbmp);
pDC->BitBlt(0,0,m_nmx,m_nmy,m_pmdc,0,0,SRCCOPY);
pDC->SelectObject(poldbmp);
调用ondraw显示出来,如何将当前显示的图像保存到剪贴板中,并且以后能粘贴该剪贴板中的内容?
绘图函数部分代码如下:
CBitmap* poldbmp=m_pmdc->SelectObject(m_pbmp);
CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
m_pmdc->......//绘图
Invalidate(false)
m_pmdc->SelectObject(poldbmp);
头文件中有CBitmap *m_pbmp;CDC* m_pmdc;定义。
ONDRAW函数部分代码如下:
CBitmap* poldbmp=m_pmdc->SelectObject(m_pbmp);
pDC->BitBlt(0,0,m_nmx,m_nmy,m_pmdc,0,0,SRCCOPY);
pDC->SelectObject(poldbmp);
void CMY2View::OnSavetoclip()
{
CMY2Doc* pDoc = GetDocument();
if (OpenClipboard())
{
// 更改光标形状
BeginWaitCursor();
// 清空剪贴板
EmptyClipboard();
// 复制当前图像到剪贴板
SetClipboardData (CF_DIB, CopyHandle((HANDLE) pDoc->GetHDIB()) );
// 关闭剪贴板
CloseClipboard();
// 恢复光标
EndWaitCursor();
}
}
粘贴代码如下:
void CMY2View::OnRestorefromclip()
{ HDIB hNewDIB = NULL;
// 打开剪贴板
if (OpenClipboard())
{
// 更改光标形状
BeginWaitCursor(); // 读取剪贴板中的图像
hNewDIB = (HDIB) CopyHandle(::GetClipboardData(CF_DIB)); // 关闭剪贴板
CloseClipboard();不知道错误在哪里,望各位高手指教!
{ CPicDoc* pDoc=GetDocument();
//
if(OpenClipboard())
{
//
BeginWaitCursor();
//
EmptyClipboard();
//
SetClipboardData(CF_DIB,CopyHandle((HANDLE)pDoc->GetHDIB()));
//
CloseClipboard();
//
EndWaitCursor();
}}void CPicView::OnUpdateEditCopy(CCmdUI* pCmdUI)
{ pCmdUI->Enable(GetDocument()->GetHDIB()!=NULL);}void CPicView::OnEditPaste()
{ HDIB hNewDIB=NULL;
//
if(OpenClipboard())
{
//
BeginWaitCursor();
//
hNewDIB=(HDIB)CopyHandle(::GetClipboardData(CF_DIB));
//
CloseClipboard();
//
if(hNewDIB!=NULL)
{
CPicDoc* pDoc=GetDocument();
//
pDoc->ReplaceHDIB(hNewDIB);
pDoc->InitDIBData();
pDoc->SetModifiedFlag(TRUE);
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
OnDoRealize((WPARAM)m_hWnd,0); pDoc->UpdateAllViews(NULL);
}
EndWaitCursor();
}
}void CPicView::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(::IsClipboardFormatAvailable(CF_DIB));}
LRESULT CPicView::OnDoRealize(WPARAM wParam,LPARAM)
{
ASSERT(wParam!=NULL);
//
CPicDoc* pDoc=GetDocument();
//
if(pDoc->GetHDIB()==NULL)
{
//
return 0L;
}
//
CPalette* pPal=pDoc->GetDocPalette();
if(pPal!=NULL)
{
//
CMainFrame* pAppFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
ASSERT_KINDOF(CMainFrame,pAppFrame);
CClientDC appDC(pAppFrame);
//
//
//
CPalette* oldPalette=appDC.SelectPalette(pPal,((HWND)wParam)!=m_hWnd);
if(oldPalette!=NULL)
{
UINT nColorsChanged=appDC.RealizePalette();
if(nColorsChanged>0)
pDoc->UpdateAllViews(NULL);
appDC.SelectPalette(oldPalette,TRUE);
}
else
{
TRACE0("\tCPicView::OnPaletteChanged中调用SelectPalette()失败!\n");
}
}
return 0L;
}
void CPicView::OnDraw(CDC* pDC)
{
BeginWaitCursor(); CPicDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//获取DIB
HDIB hDIB=pDoc->GetHDIB();
//判断DIB是否为空
if(hDIB!=NULL)
{
LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL) hDIB);
//获取DIB宽度
int cxDIB=(int)::DIBWidth(lpDIB);
//获取DIB高度
int cyDIB=(int)::DIBHeight(lpDIB);
::GlobalUnlock((HGLOBAL) hDIB);
CRect rcDIB;
rcDIB.top=rcDIB.left=0;
rcDIB.right=cxDIB;
rcDIB.bottom=cyDIB;
CRect rcDest;
//判断是否是打印
if(pDC->IsPrinting())
{
//
//
int cxPage=pDC->GetDeviceCaps(HORZRES);
//
int cyPage=pDC->GetDeviceCaps(VERTRES);
//
int cxInch=pDC->GetDeviceCaps(LOGPIXELSX);
int cyInch=pDC->GetDeviceCaps(LOGPIXELSY);
//
rcDest.top=rcDest.left=0;
rcDest.bottom=(int)(((double)cyDIB*cxPage*cyInch)/((double)cxDIB*cxInch));
rcDest.right=cxPage;
//
int temp=cyPage-(rcDest.bottom-rcDest.top);
rcDest.bottom+=temp/2;
rcDest.top+=temp/2;
}
else
//
{
//
rcDest=rcDIB;
}
//
::PaintDIB(pDC->m_hDC,&rcDest,pDoc->GetHDIB(),&rcDIB,pDoc->GetDocPalette());
}
//
EndWaitCursor();}
是不是对位图没有进行初始化?(调用PatBlt) CRect rect;
GetClientRect(rect); CClientDC dc(this);
m_pMemDC=new CDC;
m_pBitmap=new CBitmap; m_pMemDC->CreateCompatibleDC(&dc);
m_pBitmap->CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
m_pMemDC->SelectObject(m_pBitmap); m_pMemDC->PatBlt(rect.left,rect.top,rect.right,rect.bottom,WHITENESS); OnDraw(m_pMemDC); VERIFY(OpenClipboard());
VERIFY(::EmptyClipboard());
VERIFY(::SetClipboardData(CF_BITMAP,m_pBitmap->Detach()));
VERIFY(::CloseClipboard());
delete m_pBitmap;
delete m_pMemDC;
{
lenOfLUT = ((pbmpi->biBitCount==24)?0:(1<<pbmpi->biBitCount))*sizeof(RGBQUAD);
LenOfBMPINFOH = sizeof(BITMAPINFOHEADER)+lenOfLUT;
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,
LineBytes*ImgHeight + LenOfBMPINFOH);
pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
memcpy((BYTE*)pDIB,(BYTE*)pbmpi,LenOfBMPINFOH);
pixels = (BYTE*)pDIB + LenOfBMPINFOH;
memcpy(pixels,pPixelsForSh,LineBytes*ImgHeight);
if(OpenClipboard())
{
BeginWaitCursor();
EmptyClipboard();
SetClipboardData(CF_DIB,CopyHandle((HANDLE)hDIB));
CloseClipboard();
::GlobalUnlock((HGLOBAL) hDIB);
::GlobalFree((HGLOBAL)hDIB);
EndWaitCursor();
}
}
paste
{
HDIB hNewDIB ;
LPSTR pDIB;
if (OpenClipboard())
{
BeginWaitCursor();
hNewDIB = (HDIB)CopyHandle(::GetClipboardData(CF_DIB));
CloseClipboard();
if ( hNewDIB!= NULL)
{
Detroy();
pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hNewDIB);
PBITMAPINFOHEADER pbmpInfo = (PBITMAPINFOHEADER)pDIB;
int lenOfLUT = ((pbmpInfo->biBitCount==24)?0:(1<<pbmpInfo->biBitCount))*sizeof(RGBQUAD);
LenOfBMPINFOH = sizeof(BITMAPINFOHEADER)+lenOfLUT;
bmpinfoheader = new BYTE[LenOfBMPINFOH];
memcpy(bmpinfoheader,(BYTE*)pbmpInfo,LenOfBMPINFOH);
pbmpi = (PBITMAPINFOHEADER)bmpinfoheader;
ImgWidth=pbmpi->biWidth;//象素宽度
ImgHeight=abs(pbmpi->biHeight);//象素高度
pixelSize=pbmpi->biBitCount>>3;
LineBytes=(ImgWidth*pixelSize+3)&~3;
bmpfileheader = new BYTE[sizeof(BITMAPFILEHEADER)];
memset(bmpfileheader,0,sizeof(BITMAPFILEHEADER));
pbmpfh = (PBITMAPFILEHEADER)bmpfileheader;//add a bmp file header
pbmpfh->bfType=(WORD)('M'<<8|'B');
pbmpfh->bfOffBits = LenOfBMPINFOH +sizeof(BITMAPFILEHEADER);
pbmpfh->bfSize = pbmpfh->bfOffBits + LineBytes * ImgHeight;
pPixelsForSh = new BYTE[LineBytes*ImgHeight];//remove the zeros
BYTE *pTemp = (BYTE*)pbmpInfo+sizeof(BITMAPINFOHEADER)+lenOfLUT;//point to Datas
memcpy(pPixelsForSh,pTemp,ImgHeight*LineBytes);
isEmpty=FALSE;
CClientDC dc(this);
CDC *pDC = (CDC *)(&dc);
EraseBkgnd(pDC); //the old image will be eroded
DrawImage(pDC);
::GlobalUnlock((HGLOBAL)hNewDIB);
::GlobalFree((HGLOBAL)hNewDIB);
}
EndWaitCursor();
}}