複製 粘貼 剪切板

image

一.使用SetClipboardData 方法賦值

首先用GlobalAlloc方法分配內存

  1. GlobalAlloc 分配內存大小
  2. GlobalLock 鎖定內存
  3. 拷貝數據到內存中
  4. GlobalUnlock解鎖

OpenClipboard 和CloseClipboard相對應

char szText[]= "Hello, world"; // ANSI characters
if (::OpenClipboard (m_hWnd)) {
    ::EmptyClipboard ();

    HANDLE hData = ::GlobalAlloc (GMEM_MOVEABLE, ::lstrlen (szText) + 1);
    LPSTR pData = (LPSTR) ::GlobalLock (hData);
    ::lstrcpy (pData, szText);
    ::GlobalUnlock (hData);

    ::SetClipboardData (CF_TEXT, hData);
    ::CloseClipboard ();

二.獲取Clipboard數據

GetClipboardData 方法獲取
GlobalLock 方法可以轉型數據(返回是一個VOID指針)

char szText[MAX_PATH];
if (::OpenClipboard (m_hWnd)) {
    HANDLE hData = ::GetClipboardData (CF_TEXT);
    if (hData != NULL) {
        LPCSTR pData = (LPCSTR) ::GlobalLock (hData);
        if (::lstrlen (pData) < MAX_PATH)
            ::lstrcpy (szText, pData);
        ::GlobalUnlock (hData);
    }
    ::CloseClipboard ();
}

 

三.Clipboard Formats

image

不僅僅是字符串複製一個Bitmap圖片,

if (::OpenClipboard (m_hWnd)) {
    // Make a copy of the bitmap.
    BITMAP bm;
    CBitmap bitmap;
    CBitmap m_bitmap;
    m_bitmap.LoadBitmap(IDB_BITMAP2);
    m_bitmap.GetObject (sizeof (bm), &bm);
    bitmap.CreateBitmapIndirect (&bm);

    CDC dcMemSrc, dcMemDest;
    dcMemSrc.CreateCompatibleDC (NULL);
    CBitmap* pOldBitmapSrc = dcMemSrc.SelectObject (&m_bitmap);
    dcMemDest.CreateCompatibleDC (NULL);
    CBitmap* pOldBitmapDest = dcMemDest.SelectObject (&bitmap);

    dcMemDest.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &dcMemSrc,
        0, 0, SRCCOPY);
    HBITMAP hBitmap = (HBITMAP) bitmap.Detach ();

    dcMemDest.SelectObject (pOldBitmapDest);
    dcMemSrc.SelectObject (pOldBitmapSrc);

    // Place the copy on the clipboard.
    ::EmptyClipboard ();
    ::SetClipboardData (CF_BITMAP, hBitmap);
    ::CloseClipboard ();
}

獲取複製的Bitmap

if (::OpenClipboard (m_hWnd)) {
    HBITMAP hBitmap = (HBITMAP) ::GetClipboardData (CF_BITMAP);
    if (hBitmap != NULL) {
        // Make a local copy of the bitmap.
    }
    ::CloseClipboard ();
}

四.Private Clipboard Formats

除了內置格式,還可以自定義格式

  1. UINT nID = ::RegisterClipboardFormat (_T ("Widget"));
  2. ::SetClipboardData (nID, hData);
  3. HANDLE hData = ::GetClipboardData (nID);

五.Providing Data in Multiple Formats

可以將多種格式的數據存在Clipboard中
::SetClipboardData (nID, hPrivateData);
::SetClipboardData (CF_BITMAP, hBitmap);
::SetClipboardData (CF_TEXT, hTextData);
 

六.查詢可用Formats

 
1.判斷不同格式(IsClipboardFormatAvailable),注意沒用完Clipboard時,不要關閉Clipboard,所以把CloseClipboard放最後
if (::OpenClipboard (m_hWnd)) {
    if (::IsClipboardFormatAvailable (nID)) {
        // Perfect!
    }
    else if (::IsClipboardFormatAvailable (CF_TEXT)) {
        // Not the best, but I'll take it.
    }
    else if (::IsClipboardFormatAvailable (CF_BITMAP)) {
        // Better than nothing.
    }
    ::CloseClipboard ();
}
 
2.獲取後的處理方式同上
if (::OpenClipboard (m_hWnd)) {
    if (::IsClipboardFormatAvailable (CF_TEXT)) {
        HANDLE hData = ::GetClipboardData (CF_TEXT);
        LPCSTR pData = (LPCSTR) ::GlobalLock (hData);
            
    }
    ::CloseClipboard ();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章