MFC剪切板操作的若干函數

//MFC剪切板操作的標準模式源碼:

void CMFCClipboardDlg::OnBnClickedCopyButton() 
{ 
    ///////////////////////////////////////////////////////////////////////// 
    // 1. Get text from edit control. 
    //  
 
    CString strData; 
    m_editSource.GetWindowTextW(strData); 
 
    int len = strData.GetLength(); 
 
    if (len <= 0) 
        return; 
    ///////////////////////////////////////////////////////////////////////// 
    // 2. Open and empty clipboard. (OpenClipboard, EmptyClipboard) 
    //  
 
    if (!OpenClipboard()) 
        return; 
 
    EmptyClipboard();   
    ///////////////////////////////////////////////////////////////////////// 
    // 3. Create global buffer. (GlobalAlloc) 
    //  
 
    HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (len + 1)); 
     
    if (hglbCopy == NULL)  
    {  
        CloseClipboard();  
        return;  
    } 
    ///////////////////////////////////////////////////////////////////////// 
    // 4. Lock the buffer. (GlobalLock) 
    //  
 
    char* lptstrCopy = (char*)GlobalLock(hglbCopy);  
    ///////////////////////////////////////////////////////////////////////// 
    // 5. Copy text to the buffer. (strcpy) 
    //  
 
    strcpy(lptstrCopy, (CStringA)strData);  
    ///////////////////////////////////////////////////////////////////////// 
    // 6. Unlock the buffer. (GlobalUnlock) 
    //  
 
    GlobalUnlock(hglbCopy);  
 
    ///////////////////////////////////////////////////////////////////////// 
    // 7. Set buffer data to clipboard. (SetClipboardData) 
    //  
    SetClipboardData(CF_TEXT, hglbCopy);  
    ///////////////////////////////////////////////////////////////////////// 
    // 8. Close clipboard. (CloseClipboard) 
    //  
    CloseClipboard();      
}

其中的幾個函數的解釋如下:

調用GlobalAlloc函數分配一塊內存,該函數會返回分配的內存句柄。 
調用GlobalLock函數鎖定內存塊,該函數接受一個內存句柄作爲參數,然後返回一個指向被鎖定的內存塊的指針。您可以用該指針來讀寫內存。 
調用GlobalUnlock函數來解鎖先前被鎖定的內存,該函數使得指向內存塊的指針無效。 
調用GlobalFree函數來釋放內存塊。您必須傳給該函數一個內存句柄。

GlobalAlloc 

函數原型
GlobalAlloc(UINT uFLAG,DWORD dwBytes);
說明 
分配一個全局內存塊 
返回值 
Long,返回全局內存句柄。零表示失敗。會設置GetLastError 
參數表 
參數 類型及說明 
uFlags Long,對分配的內存類型進行定義的常數標誌,如下所示: 
             GMEM_FIXED 分配一個固定內存塊 
             GMEM_MOVEABLE 分配一個可移動內存塊 
             GMEM_DISCARDABLE 分配一個可丟棄內存塊 
             GMEM_NOCOMPACT 堆在這個函數調用期間不進行累積 
             GMEM_NODISCARD 函數調用期間不丟棄任何內存塊 
             GMEM_ZEROINIT 新分配的內存塊全部初始化成零 
dwBytes Long,要分配的字符數 
註解  
如指定了 GMEM_FIXED,那麼返回值就是要使用的實際內存地址即指針(GlobalLock 會返回同樣的值)——所以在使用固定內存塊的時候不需要執行一個 GlobalLock/GlobalUnlock 操作
由於 Win32 採用了高級的內存管理方案,所以使用可移動的內存塊並沒有什麼好處
用這個函數分配的內存塊允許在8位邊界以內

GlobalLock  
函數功能描述:鎖定一個全局的內存對象,返回指向該對象的第一個字節的指針
函數原型
LPVOID GlobalLock( HGLOBAL hMem )
參數
hMem:全局內存對象的句柄。這個句柄是通過GlobalAlloc或GlobalReAlloc來得到的
返回值:
調用成功,返回指向該對象的第一個字節的指針
調用失敗,返回NULL,可以用GetLastError來獲得出錯信息
注意:
調用過GlobalLock鎖定一塊內存區後,一定要調用GlobalUnlock來解鎖。

GlobalUnlock
函數功能描述:
解除被鎖定的全局內存對象
函數原型:BOOL GlobalUnlock( HGLOBAL hMem );
參數:hMem:全局內存對象的句柄
返回值:
非零值,指定的內存對象仍處於被鎖定狀態
0,函數執行出錯,可以用GetLastError來獲得出錯信息,如果返回NO_ERROR,則表示內存對象已經解鎖了
注意:這個函數實際上是將內存對象的鎖定計數器減一,如果計數器不爲0,則表示執行過多個GlobalLock函數來對這個內存對象加鎖,需要對應數目的GlobalUnlock函數來解鎖。

如果通過GetLastError函數返回錯誤碼爲ERROR_NOT_LOCKED,則表示未加鎖或已經解鎖。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章