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);

解决方案 »

  1.   

    我的复制到剪贴板的代码如下:
    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();不知道错误在哪里,望各位高手指教!
      

  2.   

    我有能Copy and Patse void CPicView::OnEditCopy() 
    { 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();}
      

  3.   

    如何将图形拷贝到剪贴板 
     是不是对位图没有进行初始化?(调用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; 
      

  4.   

    copy
    {
    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();
    }}