VC++下Window剪贴板的操作
在richeditview中保存文件時(shí)用“static DWORD CALLBACK CBStreamOut”函數(shù)對(duì)于大于1M的文件耗時(shí)太長(zhǎng),原因在于這個(gè)函數(shù)每次都只能寫很少內(nèi)容,要多次調(diào)用造成的,我想利用剪貼板一次讀取全部?jī)?nèi)容來解決時(shí)間問題,以下是網(wǎng)上的剪貼板操作方法。
1、文本內(nèi)容的操作
??? 2、WMF數(shù)據(jù)的操作
??? 3、位圖的操作
??? 4、設(shè)置使用自定義格式
??? 5、感知剪貼板內(nèi)容的改變
??? 6、自動(dòng)將數(shù)據(jù)粘貼到另一應(yīng)用程序窗口
??? 一、文本內(nèi)容的操作
??? 下面的代碼示范了如何將文本內(nèi)容復(fù)制到剪貼板: Cstring source;
//文本內(nèi)容保存在source變量中
if(openClipboard())
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, dource.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
Strcpy(buffer, LPCSTR(source));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}
??? 下面的代碼顯示了如何從剪貼板上獲得文本內(nèi)容: char * buffer = NULL;
//打開剪貼板
CString fromClipboard;
if ( OpenClipboard() )
{
HANDLE hData = GetClipboardData(CF_TEXT);
char * buffer = (char*)GlobalLock(hData);
fromClipboard = buffer;
GlobalUnlock(hData);
CloseClipboard();
}
??? 二、WMF數(shù)據(jù)的操作
??? 在剪貼板上讀寫圖象數(shù)據(jù)是非常有用的功能,并且實(shí)現(xiàn)起來也很簡(jiǎn)單。下面的代碼顯示了如何將擴(kuò)展圖元文件復(fù)制到剪貼板:
?if(OpenClipboard());
{
EmptyClipboard();
//創(chuàng)建圖元文件DC
CMetaFileDC * cDC = new CMetaFileDC();
cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name");
//調(diào)用繪圖例程
//關(guān)閉CMetafileDC并獲得它的句柄
HENHMETAFILE handle = cDC->CloseEnhanced();
//復(fù)制到剪貼板
SetClipBoardData(CF_ENHMETAFILE,handle);
CloseClipboard();
//刪除dc
delete cDC;
}
?
?下面的代碼演示了從剪貼板獲得圖元文件并將其繪制到client DC上: if(OpenClipboard())
{
//獲得剪貼板數(shù)據(jù)
HENMETAFILE handle = (HENMETAFILE)GetClipboardData(CF_ENHMETAFILE);
//顯示
CClientDC dc(this);
CRect client(0,0,200,200);
dc.PlayMetaFile(handle,client);
//關(guān)閉剪貼板
CloseClipboard();
}
??? 三、位圖的操作
??? 位圖的操作稍微復(fù)雜一點(diǎn),下面這個(gè)例子顯示了如何在剪貼板保存位圖: 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"));
//復(fù)制數(shù)據(jù)到剪貼板
SetClipboardData(CF_BITMAP,junk->m_hObject);
CloseClipboard();
delete junk;
}
??? 下面的代碼顯示了如何從剪貼板上獲得位圖數(shù)據(jù): if(OpenClipboard())
{
//獲得剪貼板數(shù)據(jù)
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();
}
??? 四、設(shè)置并使用自定義格式
??? 使用RegisterClipboardFormat()函數(shù),可以復(fù)制和粘貼任何你需要的數(shù)據(jù)類型。比如我們有以下一個(gè)數(shù)據(jù)類型: struct MyFormatData
{
long val1;
int val2;
};
??? 我們要把它復(fù)制到剪貼板,可以使用如下的代碼: 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);
//保存到內(nèi)存
*buffer = data;
//保存到剪貼板
GlobalUnlock(clipbuffer);
SetClipboardData(format,clipbuffer);
CloseClipboard();
}
??? 讀取數(shù)據(jù)使用以下代碼:
?UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");
MyFormatData data;
if(Openclipboard())
{
HANDLE hData =GetClipboardData(format);
MyFormatData * buffer = (MyFormatData*)GlobalLock(hData);
data = *buffer;
GlobalUnlock(hData);
CloseClipboard();
}
??? 五、感知剪貼板內(nèi)容的改變
??? 通過Windows消息可以感知剪貼板內(nèi)容是否發(fā)生改變,代碼如下: 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();
}
??? 六、自動(dòng)將數(shù)據(jù)粘貼到另一應(yīng)用程序窗口
??? 只需獲得相應(yīng)窗口的句柄,并發(fā)送一個(gè)消息就可以了:
??? SendMessage(m_hTextWnd, WM_PASTE, 0, 0);
希望用這種方法可以解決。
總結(jié)
以上是生活随笔為你收集整理的VC++下Window剪贴板的操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET如何以 回车换行符 拆分字符串?
- 下一篇: VC6命令行编译工程方法