SOFTIST 编程方法筆記 →目录

使用剪贴板(VC++)

Clipboard

1.为了向剪贴板拷贝数据或从剪贴板读取数据,数据格式事先登录。Windows系统已经为我们登录了很多各种各样的标准形式的数据格式了。例如,文字列的格式ID是CF_TEXT。如果是自己独有的数据格式,使用下面的方法进行登录。

#define CFSTR_TEXT_TEST	"TextTest.Format"
//自己独有的数据格式
const UINT CF_TEXT_TEST = RegisterClipboardFormat(CFSTR_TEXT_TEST);

2.向剪贴板拷贝数据方法。先把数据拷到内存的全局堆域内,使用内存的句柄和数据格式ID把数据登记到剪贴板里。

例:把文字列独有格式的数据拷贝到剪贴板。

void CTestCopyPasteDlg::OnButton1() 
{
    char buff[] = "Hello,World.";
    HANDLE hMem = ::GlobalAlloc(GHND, (strlen(buff) + 1));
    if(hMem) 
    {
        LPSTR lpMem = (LPSTR)::GlobalLock(hMem);
        memcpy(lpMem, buff, (strlen(buff) + 1));
        ::GlobalUnlock(hMem);
        if (::OpenClipboard(m_hWnd)) 
        {
            if (::EmptyClipboard())
            {
                if (NULL != ::SetClipboardData(CF_TEXT_TEST, hMem))
                    ::CloseClipboard();
                else
                    ::GlobalFree(hMem);
            }
        }
    }
}

3.从剪贴板读取数据方法。先判断剪贴板里有没有想读取得数据格式的数据。如果有从剪贴板里取出内存句,在从内存的全局堆域内把数据拷贝出来。例:

void CTestCopyPasteDlg::OnButton2() 
{
    CString strText;
    if (::IsClipboardFormatAvailable(CF_TEXT_TEST)) 
    {
        if (::OpenClipboard(m_hWnd)) 
        {
            HANDLE hData = ::GetClipboardData(CF_TEXT_TEST);
            if (hData) 
            {
                LPSTR lpData =(LPSTR)GlobalLock(hData);
                strText = lpData;
                ::GlobalUnlock(hData);
            }
            ::CloseClipboard();
        }
    }
    AfxMessageBox(strText);
}

4.不用说,如果用CF_TEXT代替CF_TEXT_TEST,就变成了普通的文字列复制与粘贴了。