【正文】
? 為了支持 “ 放 ” 特性,調(diào)用 OLE API函數(shù)RegisterDragDrop,把對(duì)象與窗口聯(lián)系起來(lái) WINOLEAPI RegisterDragDrop(HWND hwnd, IDropTarget *pDropTarget)。 virtual HRESULT DragOver( DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)。 ? OleSetClipboard內(nèi)部把所有權(quán)交給 OLE內(nèi)部隱藏窗口 ? 針對(duì)以全局內(nèi)存作為存儲(chǔ)介質(zhì)的數(shù)據(jù)格式, OleSetClipboard使用 “ 延遲供應(yīng) ” 方式調(diào)用SetClipboardData放到剪貼板上 ? 清空剪貼板,可調(diào)用 OleSetClipboard(NULL) OLE剪貼板 (二 ) ? 客戶(hù)方調(diào)用 GetClipboardData只能訪(fǎng)問(wèn)到以全局內(nèi)存作為存儲(chǔ)介質(zhì)的數(shù)據(jù)格式 ? 使用 OleGetClipboard函數(shù)可以訪(fǎng)問(wèn)到源數(shù)據(jù)對(duì)象的所有格式 ? OleGetClipboard函數(shù)返回不同的數(shù)據(jù)對(duì)象 – (1)源數(shù)據(jù)對(duì)象仍在運(yùn)行,則直接返回 (有可能是代理對(duì)象 ) – (2)源程序調(diào)用了 OleFlushClipboard函數(shù), OLE創(chuàng)建一個(gè)缺省的數(shù)據(jù)對(duì)象,供客戶(hù)使用 – (3)剪貼板上的數(shù)據(jù)非數(shù)據(jù)對(duì)象,返回一個(gè)缺省數(shù)據(jù)對(duì)象,但數(shù)據(jù)格式受限制 MFC對(duì)剪貼板的支持示意圖 源程序COle D a ta S o u rc e對(duì)象 ID a ta O b je c t原始數(shù)據(jù)格式 1格式 2......調(diào)用 Ca c h e G lo b a lDa ta或 Ca c h e D a ta客戶(hù)程序COle D a ta O b je c t對(duì)象目標(biāo)數(shù)據(jù)m _ lp D a ta O b je c t剪貼板復(fù)制S e tCli p b o a rd粘帖A ttac h Clip b o a rd調(diào)用 G e tD a ta 或者G e t G lo b a lDa ta拖 放數(shù)據(jù)傳輸協(xié)議 O L E源程序數(shù)據(jù)對(duì)象IDa taO b jec t拖源對(duì)象I Dro p S o u rce源程序放目標(biāo)對(duì)象I Dro p T a r g e tD o Dra g Dro p Re g isterD ro p T a r g e t拖 放數(shù)據(jù)傳輸協(xié)議:源 ? 實(shí)現(xiàn)數(shù)據(jù)對(duì)象和 “ 拖源 ” 對(duì)象, “ 拖源 ” 對(duì)象實(shí)現(xiàn)了接口 IDropSource class IDropSource : public IUnknown { virtual HRESULT QueryContinueDrag( BOOL fEscapePressed, DWORD grfKeyState) = 0。 ? 剪貼板是系統(tǒng)全局共享,進(jìn)程獨(dú)占方式 ? 存儲(chǔ)介質(zhì)僅限于全局內(nèi)存 剪貼板傳輸數(shù)據(jù)機(jī)理 (二 ) ? 剪貼板所有者為一個(gè) Windows窗口 – 調(diào)用 EmptyClipboard時(shí)被 OpenClipboard指定的窗口 ? 延遲供應(yīng) (delayed rendering): – (1)SetClipboardData的參數(shù) hMem可以是 NULL – (2) 客戶(hù)需要數(shù)據(jù)時(shí),所有者窗口處理WM_RENDERFORMAT消息 – (3)所有者窗口被刪除之前處理WM_RENDERALLFORMATS消息 OLE剪貼板 (一 ) ? OLE API函數(shù) WINOLEAPI OleSetClipboard(IDataObject *pDataObj)。 HANDLE WINAPI SetClipboardData( UINT uFormat, HANDLE hMem)。 ? 如果 pmedium pUnkForRelease為 NULL,那么按不同的介質(zhì)類(lèi)型執(zhí)行不同的釋放處理: – 對(duì)于 TYMED_HGLOBAL類(lèi)型調(diào)用 GlobalFree函數(shù)釋放; – 對(duì)于 TYMED_GDI類(lèi)型調(diào)用 DeleteObject函數(shù)釋放; – 對(duì)于 TYMED_ENHMF類(lèi)型刪除增強(qiáng)的圖元文件; – 對(duì)于 TYMED_MFPICT類(lèi)型刪除圖元文件; – 對(duì)于 TYMED_FILE類(lèi)型先刪除文件,再用標(biāo)準(zhǔn)內(nèi)存管理器釋放文件名字符串; – 對(duì)于 TYMED_ISTREAM調(diào)用 IStream::Release成員函數(shù)釋放; – 對(duì)于 TYMED_ISTORAGE調(diào)用 IStorage::Release成員函數(shù)釋放。 } u。 HGLOBAL hGlobal。 標(biāo)準(zhǔn)數(shù)據(jù)格式 標(biāo)準(zhǔn)剪貼板格式表預(yù)定義值 格式說(shuō)明 預(yù)定義值 格式說(shuō)明CF _ T E X T 文本格式 CF _ DIB 設(shè)備無(wú)關(guān)的位圖格式CF _ BIT M A P 位圖格式 CF _ P A L E T T E W in d o w s 調(diào)色板格式CF _ M E T A F IL E P ICT 圖元文件格式 CF _ P E NDA T A W in d o w s 筆劃數(shù)據(jù)格式CF _ S YL K W in d o w s 符號(hào)鏈接格式 CF _ RIF F 資源交換文件格式CF _ DIF W in d o w s 數(shù)據(jù)交換格式 CF _ W A V E 波形語(yǔ)音文件格式CF _ T IF F T IF 圖象格式 CF _ UNIC ODE T E X T Un ico d e 文本格式CF _ OE M T E X T OE M 文本格式 CF _ E NHM E T A F IL E 增強(qiáng)的圖元文件格式填充 FORMATETC結(jié)構(gòu)的宏 //Macro to set all FormatEtc fields define SETFORMATETC(fe, cf, asp, td, med, li) \ ((fe).cfFormat=cf, \ (fe).dwAspect=asp, \ (fe).ptd=td, \ (fe).tymed=med, \ (fe).lindex=li) //Macro to set interesting FormatEtc fields defaulting the others. define SETDEFAULTFORMATETC(fe, cf, med) \ ((fe).cfFormat=cf, \ (fe).dwAspect=DVASPECT_CONTENT, \ (fe).ptd=NULL, \ (fe).tymed=med, \ (fe).lindex=1) 數(shù)據(jù)結(jié)構(gòu) STGMEDIUM typedef struct tagSTGMEDIUM { DWORD tymed。 // 設(shè)備有關(guān)的信息 DWORD dwAspect。 ? 類(lèi)名字對(duì)象 (Class Moniker) WINOLEAPI CreateClassMoniker (REFCLSID rclsid, IMoniker **ppmk)。 pmkComp1ComposeWith(pmkItem2, FALSE, amp。 pmkFileComposeWith(pmkItem1, FALSE, amp。 ? 舉例: CreateFileMoniker(“File”, amp。 p Item 1 Ob j )p Item 1 Ob j 指向文件對(duì)象中 Item 1 對(duì)象的 IOleIte m Co n tain e r 接口指針p Item 1 Ob j G e tOb jec t(. .. , I ID_ IUn k n o w n , amp。 p Un k )復(fù)合名字對(duì)象被拆分成 p m k F il e Ite m 1 和 p m lIt e m 2 兩部分p m k F il e Ite m 1 Bin d T o Ob jec t( … , NU L L , IID_ I Ole Ite m Co n tain e r , amp。 HRESULT ParseDisplayName(IBind