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
分享到:
相关推荐
MFC通过剪切板实现进程间的通信,MFC窗体实现,详细注释,方便学习,共同进步
通过2个独立的程序,实现复制和粘贴功能,从而体现剪切板的实现过程!
MFC 剪切板 读写 操作, 点击getLeft按钮,从左边编辑框中读取字符串到剪切吧,点击WriteRight按钮,把剪切板字符串写入到右边编辑框。
mfc 剪切板,菜单绘制,多线程,文件查找等示例汇总
使用MFC实现剪切板通信功能,源码可编译、可运行,已实测。由于网上大量源码存在错误,转载错误的博主到处都是,都无语了,实在没办法,自己弄一个吧,也为后快来人少走弯路。
MFC Windows 程序设计之监听剪切板,适合初学MFC的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学MFC Windows 程序设计的小伙伴们,你们的成长是我最大的幸福。
画板 MFCMFC做的画板MFC做的画板MFC做的画板MFC做的画板MFC做的画板MFC做的画板MFC做的画板MFC做的画板
关于Windows剪切板操作的例程,包括使用传统方法和使用OLE对象方法。
工程只提取了监视功能, 使用windows 对应剪切板API。 使用方法: 1、初始化 使用 SetClipboardViewer ,把本窗口句柄传入,并且保存返回的下个窗口句柄。 2、在消息响应函数中 WindowProc中 处理WM_CHANGECBCHAIN,...
利用剪贴板进行通信,也是书上的一个实例,希望有用。
MFC基础知识总结
MFC相关知识总结
MFC获得主板BIOS的UUID,C++获取主板bios序列号,传统方法几乎都是通过程序模拟CMD命令行输入wmic csproduct get UUID获得,这种方法在代码中要第二次以上才得到,本程序是用 C++ 实现 WMI 编程的基本步骤,在这里,...
MFC画图 支持曲线 直线 矩形 椭圆 可调线条粗细 颜色 右下角实时显示鼠标的当前坐标
关于MFC绘图板的参考报告
MFC Windows 程序设计之读写剪切板,适合初学MFC的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学MFC Windows 程序设计的小伙伴们,你们的成长是我最大的幸福。
MFC中对操作系统剪切板的简单应用,就是这么简单
MFC 多线程总结, 开发为于windows的应用程序开发
MFC编写画图板的过程指导,想学习的可以好好学习一下哦
是在学习mfc的一些注意事项,未必对每个人有用,谨慎下载,