`
wsql
  • 浏览: 11815130 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

mfc剪切板总结

 
阅读更多

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics