OLE剪貼簿學習心得

2021-05-11 13:12:24 字數 2753 閱讀 1870

mfc對ole剪貼簿的支援主要集中在兩個類上,分別是

coledatasource,coledataobject。

其中,coledatasource作為操作者,而coledataobject作為消費者,換句話說,使用者需要使用coledatasource把資料放到ole剪貼簿上,而使用coledataobject把它取回。

將儲存在全域性記憶體中的專案放置在ole剪貼簿上,需要進行如下步驟:

1.在堆上(而不是在堆疊上)建立coledatasource物件。

2.呼叫coledatasource::cacheglobaldata將hglobal遞交給coledatasource物件。

3.呼叫coledatasource::setclipboard將物件放置在

ole剪貼簿上。

下列使用coledatasource在ole剪貼簿上提供了ansi文字字串.

char sztext="hello,world";

handle hdata=::globalalloc(cmem_moveablb,::lstrlen(sztext)+1);

::lstrcpy(pdata,sztext);

::globalunlock(hdata);

coledatasource * pods=new coledatasource;

pods->cacheglobaldata(cf_text,hdata);

pods->setclipboard();

mfc的coledataobject提供了從ole剪貼簿獲取專案的機制。

1.建立coledataobject物件。

2.呼叫coledataobject::attachclipboard將   coledataobject連線到ole剪貼簿。

3.使用coledataobject::getglobaldata獲取專案。

4.釋放由getglobaldata返回的全域性記憶體塊。

以下為例:

char sztect;

coledataobject pdo;

pdo.attachclipboard();

handle hdata=pdo.getglobaldata(cf_text);

if(hdata!=null)

lpcstr pdata=(lpcstr)::globallock(hdata);

if(::lstrlen(pdata注意,我們以上討論的ole剪貼簿儲存媒介都是記憶體,下面我們將要討論儲存媒介為非記憶體的情況。

coledatasource::cacheglobaldata和coledataobject::getglobaldata與全域性記憶體密不可分。但是您可以使用更一般的coledatasource::cachedata和coledataobject::getdata函式在其他資料型別的媒介中傳送資料。

下面例子說明如何使用檔案作為傳送**,通過前貼板來傳送文字字串。字串首先複製到臨時檔案中。然後用描述檔案的資訊和檔案包含的資料初始化formatetc和stgmedium結構。最後資訊被傳送給coledatasource::cachedata,並用coledatasource::setclipboar將資料物件放置在剪貼簿上。

char sztext="hello,world"

tchar szpath[max_path],szfilename[max_path];

::gettemppath(sizeof(szpath)/sizeof(tchar),szpath);

::gettempfilename(szpath,_t("tmp"),0,szfilename);//分配臨時檔案名稱。

cfile file;

if(file.open(szfilename,cfile::modecreate|cfile::modewrite))

;stgmedium stgm;

stgm.tymed=tymed_file;

stgm.lpszfilename=pwszfilename;

stgm.punkforrelease=null;

coledatasource * pods=new coledatasource;

pods->cachedata(cf_text,&stgm,&fe);

pods->setclipboard();

}在消費者端,您可以使用coledataobject::getdata從剪貼簿獲取字串

char sztext[buflen];

stgmedium stgm;

formatetc fe=

coledataobject pdo;

pdo.attachclipboard();

if(pdo.getdata(cf_text,&stgm,&fe)&&stgm.tymed==tymed_file)

#ifdef unicode

::lstrcpy(szfilename,stgm,lpszfilename);

#else

::widechartomultibyte(cp_acp,0,stgm,lpszf|lename,_t,szfilename,sizeof(szfilename)/sizeof(tchar),null,null);

#endif

cfile file;

if(file.open(szfilename,cfile::moderead))|dword dwsize=file.getlength();

if(dwsize在讀取ole剪貼簿內容是,使用者可以直接使用coledataobject::getfiledata取代getdata函式。

操作剪貼簿

剪貼簿 一 將資料送到剪貼簿 1 記憶體配置 hglobal hglobal hglobal globalalloc ghnd gmem share,lstrlen ptext 1 sizeof tchar 為什麼不用malloc 在windows中執行的應用程式之間必須要共享剪貼簿所儲存的記憶體塊...

剪貼簿相關

public const int wm user 0x400 public const int wm cap edit copy wm user 30 dllimport user32.dll static extern bool sendmessage intptr hwnd,int wmsg,s...

剪貼簿功能

1,複製貼上字串 這個是需要輸入的資訊,即是要複製的資訊 uitextfield textfild uitextfield alloc init self.textfild textfild textfild.placeholder 請輸入資訊 textfild.font uifont system...