HANDLE SetClipboardData(
UINT uFormat,
HANDLE hMem);
Parameters
格式:
[in] Unsigned integer that specifies a clipboard format. This parameter can be a registered format or any of the standard clipboard formats. Windows CE supports the following standard clipboard:
Value |
Description |
CF_BITMAP |
A handle to a bitmap (HBITMAP). |
CF_DIB |
A memory object containing a BITMAPINFO structure followed by the bitmap bits. |
CF_DIF |
Software Arts' Data Interchange Format. |
CF_PALETTE |
[参见MSDN] |
CF_PENDATA |
Data for the pen extensions to the Microsoft? Windows? for Pen Computing. |
CF_RIFF |
Represents audio data more complex than can be represented in a CF_WAVE standard wave format. |
CF_SYLK |
Microsoft Symbolic Link (SYLK) format. |
CF_TEXT |
Text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. Use this format for ANSI text. |
CF_WAVE |
Represents audio data in one of the standard wave formats, such as 11 kHz or 22 kHz pulse code modulation (PCM). |
CF_TIFF |
Tagged-image file format. |
CF_UNICODETEXT |
Unicode text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. |
举例1:文本的复制与粘贴
/*
将数据COPY到剪切板原理:
1:OpenClipboard() 打开剪切板
2:EmptyClipboard() 清空剪切板,让当前进程拥有剪切板
3:GlobalAlloc() 分配全局堆内存
4:GlobalLock() 锁定内存并返回内存首地址
5:strcpy() 给内存赋值
6:GlobalUnlock() 解锁内存
7:SetClipboardData() 设置到剪切板
8:CloseClipboard() 关闭剪切板
*/
void CClipboardDlg::OnBnClickedButton2()
{
if(OpenClipboard())//打开剪切板
{
EmptyClipboard();//清空剪切板,让当前窗口进程拥有剪切板
CString Str;
GetDlgItemText(IDC_EDIT_SEND,Str);//获取数据
HANDLE hClip;
hClip=GlobalAlloc(GMEM_MOVEABLE,Str.GetLength()+1);//分配内存对象返回地址(该函数是系统从全局堆中分配内存)
char *pBuf;
pBuf=(char *)GlobalLock(hClip);//锁定全局内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处
strcpy(pBuf,Str);//将Str对象中的数据Copy到内存空间中
GlobalUnlock(hClip);//解锁全局内存块
SetClipboardData(CF_TEXT,hClip);//设置剪贴板数据
CloseClipboard();//关闭
}
}
/*
从剪切板取回数据的原理:
1:IsClipboardFormatAvailable() 判断剪切板是否有要取回的数据
2:OpenClipboard() 打开剪切板
3:GetClipboardData() 取回指定格式的对象句柄
4:GlobalLock() 锁定内存,并取回对象的数据
5:GlobalUnlock 解锁
6:CloseClipboard() 关闭剪切板
*/
void CClipboardDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
if(IsClipboardFormatAvailable(CF_TEXT))//获取剪贴板里的格式是否可以处理
{
if(OpenClipboard())
{ HANDLE hClip;
char *pBuf;
hClip=GetClipboardData(CF_TEXT); //检索从指定格式剪贴板数据,并返回一个剪贴板对象句柄
pBuf=(char *)GlobalLock(hClip);//锁定全局内存中指定的内存块 并返回一个地址值,并返回数据指针头地址
GlobalUnlock(hClip); //解锁
SetDlgItemText(IDC_EDIT_RECV,pBuf);
CloseClipboard();
}
}
}
举例2.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 ();
}
位图的粘贴:
把存在于剪贴板中的位图数据显示到程序的客户区:
HWND hWnd = GetSafeHwnd(); // 获取安全窗口句柄
::OpenClipboard(hWnd); // 打开剪贴板
HANDLE hBitmap = ::GetClipboardData(CF_BITMAP); // 获取剪贴板数据句柄
HDC hDC = ::GetDC(hWnd); // 获取设备环境句柄
HDC hdcMem = CreateCompatibleDC(hDC); // 创建与设备相关的内存环境
SelectObject(hdcMem, hBitmap); // 选择对象
SetMapMode(hdcMem, GetMapMode(hDC)); // 设置映射模式
BITMAP bm; // 得到位图对象
GetObject(hBitmap, sizeof(BITMAP), &bm);
BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); //位图
复制
::ReleaseDC(hWnd, hDC); // 释放设备环境句柄
DeleteDC(hdcMem); // 删除内存环境
::CloseClipboard(); // 关闭剪贴板
3. 多数据项
要把数据放入剪贴板,在打开剪贴板后一定要调用EmptyClipboard()函数清除当前
剪贴板中的内容,而不可以在原有数据项基础上追加新的数据项。但是,可以在
EmptyClipboard()和CloseClipboard()调用之间多次调用SetClipboardData()
函数来放置多个不同格式的数据项。例如
OpenClipboard(hWnd);
EmptyClipboardData();
SetClipboardData(CF_TEXT, hGMemText);
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
这时如果用CF_TEXT或CF_BITMAP等格式标记去调用IsClipboardFormatAvailable()
都将返回TRUE,表明这几种格式的数据同时存在于剪贴板中。以不同的格式标记去调
用GetClipboardData()函数可以得到相应的数据句柄。
对于多数据项的剪贴板数据,还可以用CountClipboardFormats()和
EnumClipboardFormats()函数得到当前剪贴板中存在的数据格式数目和具体的数据
格式。EnumClipboardFormats()的函数原型为:
UINT EnumClipboardFormats(UINT format);
参数format指定了剪贴板的数据格式。如果成功执行将返回format指定的格式的下一
个数据格式值,如果format为最后的数据格式值,那么将返回0。由此不难写出处理
剪贴板中所有格式数据项的程序段代码:
UINT format = 0; // 从第一种格式值开始枚举
OpenClipboard(hWnd);
while(format = EnumClipboardFormats(format))
{
…… // 对相关格式数据的处理
}
CloseClipboard();
4.延迟提交
http://apps.hi.baidu.com/share/detail/30391289