如题,我这样实现的:
if (OpenClipboard()) 
{
        //清空剪贴板
        EmptyClipboard();
        //把屏幕内容粘贴到剪贴板上,
        //hBitmap 为刚才的屏幕位图句柄
        SetClipboardData(CF_BITMAP, hBitmap);
        //关闭剪贴板
        CloseClipboard();
    }但粘贴的时候出现“获取剪贴板数据错误”,如何解决?
谢了~~~

解决方案 »

  1.   

    复制一幅位图到剪贴板相当简单,需要记住的一个是如果位图需要调色盘,
    你应当将调色盘也复制。函数一:复制设备相关位图到剪贴板CopyBitmapToClipboard()函数复制一幅DDB位图到剪贴板,如果提供调色盘它将
    同时复制调色盘。注意在最后调用Detach()。这一点很重要,因为此时GDI对象
    的物主已经传送至剪贴板。// CopyBitmapToClipboard - Copies a device-dependent bitmap to clipboard
    // pWnd - Pointer to window that opens the clipboard
    // bitmap - The device-dependent bitmap
    // pPal - Pointer to logical palette - Can be NULL
    // NOTE - GDI objects are detached from bitmap & pPal
    //   as the clipboard owns them after the copy
    void CopyBitmapToClipboard( const CWnd *pWnd, CBitmap& bitmap, CPalette* pPal )
    {
    ::OpenClipboard(pWnd->GetSafeHwnd());
    ::EmptyClipboard() ;
    if( pPal )
    ::SetClipboardData (CF_PALETTE, pPal->GetSafeHandle() ) ;
    ::SetClipboardData (CF_BITMAP, bitmap.GetSafeHandle() ) ;
    ::CloseClipboard () ;
    bitmap.Detach();
    if( pPal )
    pPal->Detach();
    }
    函数二:复制设备无关位图到剪贴板  CopyDIBToClipboard()函数和CopyBitmapToClipboard()非常相似。内存句柄包
    含了BITMAPINFO 和位图的位信息,通过GlobalAlloc()分配。// CopyDIBToClipboard - Copies a device-dependent bitmap to clipboard
    // pWnd - Pointer to window that opens the clipboard
    // hDIB - Memory handle that contains BITMAPINFO & bitmap bits
    // pPal - Pointer to logical palette - Can be NULL
    // NOTE - GDI objects are detached from bitmap & pPal
    //   as the clipboard owns them after the copy
    void CopyDIBToClipboard( const CWnd *pWnd, HGLOBAL hDIB, CPalette* pPal )
    {
    ::OpenClipboard(pWnd->GetSafeHwnd());
    ::EmptyClipboard();
    if( pPal )
    ::SetClipboardData (CF_PALETTE, pPal->GetSafeHandle() ) ;
    ::SetClipboardData (CF_DIB, hDIB ) ;
    ::CloseClipboard () ;
    bitmap.Detach();
    if( pPal )
    pPal->Detach();
    }函数三:复制一幅windows图象到剪贴板void CopyWndToClipboard( CWnd *pWnd )
    {
    CBitmap  bitmap;
    CClientDC dc(pWnd);
    CDC  memDC;
    CRect rect; memDC.CreateCompatibleDC(&dc);  pWnd->GetWindowRect(rect); bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height() );

    CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
    memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY);  pWnd->OpenClipboard() ;
    EmptyClipboard() ;
    SetClipboardData (CF_BITMAP, bitmap.GetSafeHandle() ) ;
    CloseClipboard () ; memDC.SelectObject(pOldBitmap);
    bitmap.Detach();
    }
      

  2.   

    谢谢TianChong(VC.NET++)的回答,我刚学vc,如果我有一个类型为HBITMAP的变量hBitmap,
    在基于对话框的程序中如何调用CopyBitmapToClipboard( const CWnd *pWnd, CBitmap& bitmap, CPalette* pPal )函数谢谢了~~
      

  3.   

    CopyBitmapToClipboard(this,CBitmap::FromHandle(hBitmap),pPal);