VC的剪貼簿操作
阿新 • • 發佈:2019-01-06
1、文字內容的操作
2、WMF資料的操作
3、點陣圖的操作
4、設定使用自定義格式
5、感知剪貼簿內容的改變
6、自動將資料貼上到另一應用程式視窗
一、文字內容的操作
下面的程式碼示範瞭如何將文字內容複製到剪貼簿(Unicode編碼的先轉化為ASCII):
CString source;
//文字內容儲存在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;
//開啟剪貼簿
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);
2、WMF資料的操作
3、點陣圖的操作
4、設定使用自定義格式
5、感知剪貼簿內容的改變
6、自動將資料貼上到另一應用程式視窗
一、文字內容的操作
下面的程式碼示範瞭如何將文字內容複製到剪貼簿(Unicode編碼的先轉化為ASCII):
CString source;
//文字內容儲存在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;
//開啟剪貼簿
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);