永发信息网

MFC清除剪切板问题?

答案:1  悬赏:0  手机版
解决时间 2021-02-14 01:26
void CCopyEditDlg::OnCopy()
{
//EmptyClipboard();
m_edit1.SetSel(0,-1);
m_edit1.Copy();
m_edit2.SetSel(0,-1);
m_edit2.Paste();
}
上面代码是我实现从edit1中拷贝内容到edit2的函数,我的问题是,在执行一次copy按钮后,剪切板的内容被记忆,当edit1有内容时,一切正常;当它为空时,按理edit2应该也为空(拷贝空字符),但却仍然将之前内容(剪切板记忆的内容)复制给edit2,而且关掉程序再次打开(这时edit1\edit2都为空),执行copy按钮后也是上次的内容。我找到EmptyClipboard()函数,但不起啥作用,不知道是用错还是另有其他方法,请高手指教,我是初学者,谢谢!
最佳答案
如果想完成功能,那可以变通一下,如果检测到edit是空的时候,让edit2清空。如果是想看剪贴板操作问题:
VC 剪贴板操作
2008-02-23 15:33
拷贝与粘贴文本

下边的源代码演示了如何将文本(包含在CString对象“source”中)拷贝到剪贴板上。

CString source;

//put your text in source

if(OpenClipboard())

{

HGLOBAL clipbuffer;

char * buffer;

EmptyClipboard();

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

buffer = (char*)GlobalLock(clipbuffer);

strcpy(buffer, LPCSTR(source));

GlobalUnlock(clipbuffer);

SetClipboardData(CF_TEXT,clipbuffer);

CloseClipboard();

}

反过来,下面的代码是用来实现从剪贴板上取得文本的。

char * buffer = NULL;

//open the clipboard

CString fromClipboard;

if ( OpenClipboard() )

{

HANDLE hData = GetClipboardData( CF_TEXT );

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

fromClipboard = buffer;

GlobalUnlock( hData );

CloseClipboard();

}

拷贝与粘贴WMF(enhanced)数据

你想在你的程序中往剪贴板上“画”以及向剪贴板读取图形吗?请放心,这个――不难!示范代码如下,其实现的是往剪贴板上写一enhanced metafile。

if ( OpenClipboard() )

{

EmptyClipboard();

//create the metafile DC

CMetaFileDC * cDC = new CMetaFileDC();

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

//call draw routine here that makes GDI calls int cDC

//close meta CMetafileDC and get its handle

HENHMETAFILE handle = cDC->CloseEnhanced();

//place it on the clipboard

SetClipboardData(CF_ENHMETAFILE,handle);

CloseClipboard();

//delete the dc

delete cDC;

}

好啦,该演示反过来怎么做的代码了。我们从剪贴板上取得metafile并将其画到自己的应用程序的客户区DC(设备上下文)上(仅仅是个试验而已,实际上你可能更想将它拷贝一份儿)。

if ( OpenClipboard() )

{

//Get the clipboard data

HENHMETAFILE handle = (HENHMETAFILE)GetClipboardData(CF_ENHMETAFILE);

//play it into a DC (our own DC in this example)

CClientDC dc(this);

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

dc.PlayMetaFile(handle,client);

//close the clipboard

CloseClipboard();

}

拷贝与粘贴一张位图(BitMap)

拷贝和粘贴位图可是需要一些微妙的处理的,不过基本的思想还是一样。请看下面的代码。

if ( OpenClipboard() )

{

EmptyClipboard();

//create some data

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);

//call draw routine here that makes GDI calls

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

//put the data on the clipboard

SetClipboardData(CF_BITMAP,junk->m_hObject);

CloseClipboard();

//copy has been made on clipboard so we can delete

delete junk;

}

如下示例代码是从剪贴板上取得一张位图,将它粘贴到客户区DC中。

if ( OpenClipboard() )

{

//Get the clipboard data

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() API函数先将此格式注册,然后就可以“为所欲为”了。这简直是太有用了,尤其是在我们自己的应用程序中拷贝资料。假设我们有下面的结构:

struct MyFormatData

{

long val1;

int val2;

};

想将此结构的数据拷贝到剪贴板上。可以这样实现:

UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");

if(OpenClipboard())

{

//make some dummy data

MyFormatData data;

data.val1 = 100;

data.val2 = 200;

//allocate some global memory

HGLOBAL clipbuffer;

EmptyClipboard();

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

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

//put the data into that memory

*buffer = data;

//Put it on the clipboard

GlobalUnlock(clipbuffer);

SetClipboardData(format,clipbuffer);

CloseClipboard();

}

想把它从剪贴板上读下来的话,也容易:

//第二次调用时,此格式已经注册过了,读下来就行了

UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");

MyFormatData data;

if ( OpenClipboard() )

{

//get the buffer

HANDLE hData = GetClipboardData(format);

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

//留一份儿当地拷贝

data = *buffer;

GlobalUnlock( hData );

CloseClipboard();

}

取得剪贴板变化通知(Getting notified of clipboard changes)

一旦剪贴板上的内容发生改变,我们都希望能够获知(经由windows消息),这是很有用的。你可以用函数SetClipboardViewer()来捕获WM_DRAWCLIPBOARD消息。

在你的初始化代码中调用:

SetClipboardViewer(); //add us to clipboard change notification chain

在你的消息映射(message map)中添加:

ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) //clipboard change notification

将其定义为:

afx_msg void OnClipChange(); //clipboard change notification

实现为:

void CDetectClipboardChangeDlg::OnClipChange()

{

//do something here, for example

CTime time = CTime::GetCurrentTime();

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

DisplayClipboardText();

}

将数据粘贴到其它应用程序窗口中的方法

我觉得如果能把文本拷贝到剪贴板上(参见上面的代码),然后再在另外一个应用程序中将这些文本粘贴过来,那样才有用。我写了一个很不错的本地应用程序,此程序使用了含有此技术的第三方的语言翻译包。很简单,仅是取得目标窗口的句柄,并向它发送“PASTE”消息就OK了。

SendMessage(m_hTextWnd, WM_PASTE, 0, 0);
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
2015年办的驾驶证有没有条码
老美华鞋店(银河国际店)地址好找么,我有些事
巴彦县疾病预防控制中心在什么地方啊,我要过
自动离合器的车型,有没有人可以分享一下经验
下列有关组织培养的叙述中,表达错误的是AA.
在昆明的地矿局跟七彩云南买了手饰,拿回来鉴
palladium(爱琴海店)地址在什么地方,想过去
十二米的单杆单挑风光互补路灯多少钱一套
石门国际大酒店停车场地址在什么地方,想过去
有无限斯特拉托斯剧情的变身百合综漫小说
本人始蔡、欲立谱、求字辈?
天秤座女生说你不要来,来了也不见
重庆818自助火锅在哪里啊,我有事要去这个地
盒子里装着分别写有1,2,3,…,134,135的
MarcbyMarcJacobs地址在什么地方,我要处理点
推荐资讯
开个快餐店需要多少钱 开快餐店投资预算
我现在刚上班才一周不到,但是自己不注意,今
有一款牛肉酱炒菜特别好吃,黄牛肉酱,谁知道
秦皇岛嘉乐文化传播有限公司(金棕榈一楼售票
四爹士多店地址好找么,我有些事要过去
谁有没有收音机频道列表,温州的,越详细越好
韩后有祛斑的作用吗?
世纪华联超市(曲阳店)怎么去啊,有知道地址的
面试一个星期后发邮件询问HR结果,回复…
兰芝唇膜使用方法,兰芝唇膜好用吗,兰芝唇膜怎
形容自己心情不好,别人却很开心的句子
一张增值税发票最多能开多少金额
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?