|
使用剪贴板(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,就变成了普通的文字列复制与粘贴了。 |