commoniker、udt、control内容摘要:

(fe).ptd=NULL, \ (fe).tymed=med, \ (fe).lindex=1) 数据结构 STGMEDIUM typedef struct tagSTGMEDIUM { DWORD tymed。 // 存储介质的类型 union { HBITMAP hBitmap。 HMETAFILEPICT hMetaFilePict。 HENHMETAFILE hEnhMetaFile。 HGLOBAL hGlobal。 LPOLESTR lpszFileName。 IStream *pstm。 IStorage *pstg。 } u。 // 数据真正的位置 IUnknown *pUnkForRelease。 // 控制介质资源的释放 } STGMEDIUM。 资源释放 — ReleaseStgMedium 函数  如果 pmedium pUnkForRelease为非 NULL,那么分两步: – 对于 TYMED_FILE介质类型,它用标准内存管理器释放文件名字符串,对于 TYMED_ISTREAM和 TYMED_ISTORAGE介质类型,调用IStream::Release或 IStorage::Release,其它类型跳过这一步; – 调用 pmedium pUnkForReleaseRelease。  如果 pmedium pUnkForRelease为 NULL,那么按不同的介质类型执行不同的释放处理: – 对于 TYMED_HGLOBAL类型调用 GlobalFree函数释放; – 对于 TYMED_GDI类型调用 DeleteObject函数释放; – 对于 TYMED_ENHMF类型删除增强的图元文件; – 对于 TYMED_MFPICT类型删除图元文件; – 对于 TYMED_FILE类型先删除文件,再用标准内存管理器释放文件名字符串; – 对于 TYMED_ISTREAM调用 IStream::Release成员函数释放; – 对于 TYMED_ISTORAGE调用 IStorage::Release成员函数释放。 数据对象  IDataObject接口 IDataObject接口的成员 (一 )  GetData( FORMATETC *, STGMEDIUM *)  GetDataHere( FORMATETC *, STGMEDIUM *)  QueryGetData( FORMATETC *)  GetCanonicalFormatEtc(FORMATETC *pformatectIn, FORMATETC *pformatetcOut) IDataObject接口的成员 (二 )  SetData( FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease)  EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC **)  DAdvise(FORMATETC *, DWORD advf, IAdviseSink *, DWORD *)  DUnadvise( DWORD )  EnumDAdvise( IEnumSTATDATA **) 通报连接 (advisory connection)机制 客户通过 IData Ob jec t: :DA d v is e函数把接收器传给对象客户程序通报连接接收器对象数据对象事件发生时数据对象调用 On Data Ch a n g e 成员IA d v ise S in kIData Ob jec t剪贴板传输数据机理 (一 )  常用的 7个 Win32 API函数 BOOL WINAPI OpenClipboard( HWND hWndNewOwner)。 BOOL WINAPI CloseClipboard( VOID)。 BOOL WINAPI EmptyClipboard(VOID)。 HANDLE WINAPI SetClipboardData( UINT uFormat, HANDLE hMem)。 HANDLE WINAPI GetClipboardData( UINT uFormat)。 BOOL WINAPI IsClipboardFormatAvailable( UINT format)。 UINT WINAPI EnumClipboardFormats( UINT format)。  剪贴板是系统全局共享,进程独占方式  存储介质仅限于全局内存 剪贴板传输数据机理 (二 )  剪贴板所有者为一个 Windows窗口 – 调用 EmptyClipboard时被 OpenClipboard指定的窗口  延迟供应 (delayed rendering): – (1)SetClipboardData的参数 hMem可以是 NULL – (2) 客户需要数据时,所有者窗口处理WM_RENDERFORMAT消息 – (3)所有者窗口被删除之前处理WM_RENDERALLFORMATS消息 OLE剪贴板 (一 )  OLE API函数 WINOLEAPI OleSetClipboard(IDataObject *pDataObj)。 WINOLEAPI OleGetClipboard(IDataObject ** ppDataObj)。 WINOLEAPI OleFlushClipboard(void)。 WINOLEAPI OleIsCurrentClipboard(IDataObject *pDataObj)。  OleSetClipboard内部把所有权交给 OLE内部隐藏窗口  针对以全局内存作为存储介质的数据格式, OleSetClipboard使用 “ 延迟供应 ” 方式调用SetClipboardData放到剪贴板上  清空剪贴板,可调用 OleSetClipboard(NULL) OLE剪贴板 (二 )  客户方调用 GetClipboardData只能访问到以全局内存作为存储介质的数据格式  使用 OleGetClipboard函数可以访问到源数据对象的所有格式  OleGetClipboard函数返回不同的数据对象 – (1)源数据对象仍在运行,则直接返回 (有可能是代理对象 ) – (2)源程序调用了 OleFlushClipboard函数, OLE创建一个缺省的数据对象,供客户使用 – (3)剪贴板上的数据非数据对象,返回一个缺省数据对象,但数据格式受限制 MFC对剪贴板的支持示意图 源程序COle D a ta S o u rc e对象 ID a ta O b je c t原始数据格式 1格式 2......调用 Ca c h e G lo b a lDa ta或 Ca c h e D a ta客户程序COle D a ta O b je c t对象目标数据m _ lp D a ta O b je c t剪贴板复制S e tCli p b o a rd粘帖A ttac h Clip b o a rd调用 G e tD a ta 或者G e t G lo b a lDa ta拖 放数据传输协议 O L E源程序数据对象IDa taO b jec t拖源对象I Dro p S o u rce源程序放目标对象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拖 放数据传输协议:源  实现数据对象和 “ 拖源 ” 对象, “ 拖源 ” 对象实现了接口 IDropSource class IDropSource : public IUnknown { virtual HRESULT QueryContinueDrag( BOOL fEscapePressed, DWORD grfKeyState) = 0。 virtual HRESULT GiveFeedback( DWORD dwEffect) = 0。 }。  WM_LBUTTONDOWN消息控制函数中调用OLE函数: DoDragDrop 拖 放数据传输协议:目标  实现 “ 放目标 ” 对象, “ 放目标 ” 对象实现了接口IDropTarget: class IDropTarget : public IUnknown { virtual HRESULT DragEnter(IDataObject *pDataObj, D。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。