您的位置:首页 > 编程语言 > C语言/C++

Visual C++剪贴板操作

2008-09-17 10:22 357 查看
http://hi.baidu.com/hytjfxk/blog/item/26d9c01f8a73bf0c304e153c.html
 Visual C++剪贴板操作
2008-07-30 15:01
Visual C++剪贴板操作

文章摘要:

1、文本内容的操作

2、WMF数据的操作

3、位图的操作

4、设置使用自定义格式

5、感知剪贴板内容的改变

6、自动将数据粘贴到另一应用程序窗口

一、如何将文本内容复制到剪贴板:

CString source;//文本内容保存在source变量中

if(OpenClipboard())

{

     HGLOBAL clipbuffer;

    char * buffer;

EmptyClipboard();

    clipbuffer = GlobalAlloc(GMEM_DDESHARE, dource.GetLength()+1);

buffer       = (char*)GlobalLock(clipbuffer);

lstrcpy(buffer, LPCSTR(source));

    GlobalUnlock(clipbuffer);

    SetClipboardData(CF_TEXT,clipbuffer);

    CloseClipboard();

}

下面的代码显示了如何从剪贴板上获得文本内容:

char * buffer = NULL;

CString fromClipboard;

if ( OpenClipboard() )//打开剪贴板

{

     HANDLE hData = GetClipboardData(CF_TEXT);

    char * buffer    = (char*)GlobalLock(hData);

    fromClipboard      = buffer;

GlobalUnlock(hData);

CloseClipboard();

}

二、WMF数据的操作

  在剪贴板上读写图象数据是非常有用的功能,并且实现起来也很简单。下面的代码显示了如何将扩展图元文件复制到剪贴板:

if(OpenClipboard());

{

EmptyClipboard();

//创建图元文件DC

CMetaFileDC * cDC = new CMetaFileDC();

cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name");

//调用绘图例程

//关闭CMetafileDC并获得它的句柄

HENHMETAFILE handle = cDC->CloseEnhanced();

//复制到剪贴板

SetClipBoardData(CF_ENHMETAFILE,handle);

CloseClipboard();

//删除dc

delete cDC;

}

下面的代码演示了从剪贴板获得图元文件并将其绘制到client DC上:

if(OpenClipboard())

{

//获得剪贴板数据

HENMETAFILE handle = (HENMETAFILE)GetClipboardData(CF_ENHMETAFILE);

//显示

CClientDC dc(this);

CRect client(0,0,200,200);

dc.PlayMetaFile(handle,client);

//关闭剪贴板

CloseClipboard();

}

三、位图的操作

位图的操作稍微复杂一点,下面这个例子显示了如何在剪贴板保存位图:

if(OpenClipboard())

{

EmptyClipboard();

CBitmap * junk = new CBitmap();

CClientDC cdc(this);

CDC dc;

dc.CreateCompatibleDC(&cdc);

CRect client(0,0,200,200);

junk->CreateCompatibleBitmap(&cdc,client.Width(),client.Height());

dc.SelectObject(junk);

DrawImage(&dc,CString("Bitmap"));

//复制数据到剪贴板

SetClipboardData(CF_BITMAP,junk->m_hObject);

CloseClipboard();

delete junk;

}

下面的代码显示了如何从剪贴板上获得位图数据:

if(OpenClipboard())

{

//获得剪贴板数据

HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP);

CBitmap * bm = CBitmap::FromHandle(handle);

CClientDC cdc(this);

CDC dc;

dc.CreateCompatibleDC(&cdc);

dc.SelectObject(bm);

cdc.BitBlt(0,0,200,200,&dc,0,0,SRCCOPY);

CloseClipboard();

}

四、设置并使用自定义格式

使用RegisterClipboardFormat()函数,可以复制和粘贴任何你需要的数据类型。比如我们有以下一个数据类型:

struct MyFormatData

{

long val1;

int val2;

};

我们要把它复制到剪贴板,可以使用如下的代码:

UINT format = RegisterClipBoardFormat("MY_CUSTOM_FORMAT");

if(OpenClipboard())

{

MyFormatData data;

data.val1 = 100;

data.val2 = 200;

HGLOBAL clipbuffer;

EmptyClipboard();

clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormatData));

MyFormatData * buffer = (MyFormatData*)GlobalLock(clipbuffer);

//保存到内存

*buffer = data;

//保存到剪贴板

GlobalUnlock(clipbuffer);

SetClipboardData(format,clipbuffer);

CloseClipboard();

}

读取数据使用以下代码:

UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");

MyFormatData data;

if(Openclipboard())

{

HANDLE hData =GetClipboardData(format);

MyFormatData * buffer = (MyFormatData*)GlobalLock(hData);

data = *buffer;

GlobalUnlock(hData);

CloseClipboard();

}

五、感知剪贴板内容的改变

通过Windows消息可以感知剪贴板内容是否发生改变,代码如下:

In your initialization code call:

SetClipboardViewer(); //将我们的程序添加到剪贴板观察链

In your message map add:

ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) //添加Message handle

Which is declared as:

afx_msg void OnClipChange();

Finally implement:

void CDetectClipboardChangeDlg::OnClipChange()

{

    CTime time = CTime::GetCurrentTime();

    SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a, %b %d, %Y -- %H:%M:%S"));

    DisplayClipboardText();

}

六、自动将数据粘贴到另一应用程序窗口

只需获得相应窗口的句柄,并发送一个消息就可以了:

SendMessage(m_hTextWnd, WM_PASTE, 0, 0);

类别:c程序设计

| 添加到搜藏

| 浏览(28)
| 评论 (0)

/*var pre = [true,'Windows完成端口与Linux epoll技术简介', 'Windows完成端口与Linux epoll技...','/hytjfxk/blog/item/c1c8e8623b6deddbe7113a0d.html'];
var post = [true,'c++获取windows时间的方法(转)','c++获取windows时间的方法(转)', '/hytjfxk/blog/item/b8db122e2353b3564fc22618.html'];
if(pre[0] || post[0]){
document.write(' ');
if(pre[0]){
document.write('上一篇: + ']' + pre[2] + ' ');
}
if(post[0]){
document.write('下一篇: + ']' + post[2] + '');
}
document.write('');
}
/*]]>*/
 上一篇:Windows完成端口与Linux epoll技...    下一篇:c++获取windows时间的方法(转)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: