MFC 剪贴板操作

本文主要介绍了VC++语句语言/MFC中如下内容的剪贴板操作:

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

SetClipboard数据(CF_TEXT,clipbuffer);

CloseClipboard();

}

下面的代码呈现了怎能从剪贴板上获得文本内容:

char * buffer = NULL;

//打开剪贴板

CString fromClipboard;

if ( OpenClipboard() )

{

HANDLE h数据 = GetClipboard数据(CF_TEXT);

char * buffer = (char*)GlobalLock(h数据);

fromClipboard = buffer;

GlobalUnlock(h数据);

CloseClipboard();

}

二、WMF数据的操作

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

if(OpenClipboard());

{

EmptyClipboard();

//创建图元文档DC

CMetaFileDC * cDC = new CMetaFileDC();

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

//调用绘图例程

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

HENHMETAFILE handle = cDC->CloseEnhanced();

//复制到剪贴板

SetClipBoard数据(CF_ENHMETAFILE,handle);

CloseClipboard();

//删除dc

delete cDC;

}

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

if(OpenClipboard())

{

//获得剪贴板数据

HENMETAFILE handle = (HENMETAFILE)GetClipboard数据(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"));

//复制数据到剪贴板

SetClipboard数据(CF_BITMAP,junk->m_hObject);

CloseClipboard();

delete junk;

}

下面的代码呈现了怎能从剪贴板上获得位图数据:

if(OpenClipboard())

{

//获得剪贴板数据

HBITMAP handle = (HBITMAP)GetClipboard数据(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()参数,没出国疑问复制和粘贴任何你需求的数据TYPE。比如咱们有以下唯一的数据TYPE:

struct MyFormat数据

{

long val1;

int val2;

};

咱们要把它复制到剪贴板,没出国疑问应用如下的代码:

UINT format = RegisterClipBoardFormat("MY_CUSTOM_FORMAT");

if(OpenClipboard())

{

MyFormat数据 data;

data.val1 = 100;

data.val2 = 200;

HGLOBAL clipbuffer;

EmptyClipboard();

clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormat数据));

MyFormat数据 * buffer = (MyFormat数据*)GlobalLock(clipbuffer);

//保存到内存

*buffer = data;

//保存到剪贴板

GlobalUnlock(clipbuffer);

SetClipboard数据(format,clipbuffer);

CloseClipboard();

}

读取数据应用以下代码:

UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");

MyFormat数据 data;

if(Openclipboard())

{

HANDLE h数据 =GetClipboard数据(format);

MyFormat数据 * buffer = (MyFormat数据*)GlobalLock(h数据);

data = *buffer;

GlobalUnlock(h数据);

CloseClipboard();

}

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

经过win界面消息没出国疑问感知剪贴板内容也许除了改变,代码如下:

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

}

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

只需获得相应窗口的句柄,并发送唯一的消息就没出过疑问了: 

你可能感兴趣的:(MFC)