存档

‘OLE Drag and Drop Tutorials’ 分类的存档
342 views

OLE Drag and Drop (6) 实现 Drop 目标对象

2010年2月4日

Many thanks to Davide Chiodi from Italy who has very kindly converted the drop-target code into a Pure C implementation – download now! Catch22OLEpart6

欢迎你到OLE拖放操作的第六章!这里将着重于一个实现了drop-target的小程序,这就意味着我们的程序能够接收拖到它上面的对象(文件、图片、文本)了。

我们实现一个IDropTarget的COM接口允许OLE程序拖动数据到我们的程序上;这里仅仅是一个简单的EDIT控件,所以他将CF_TEXT数据作为目标。

成为一个“Drop Target”

为了时窗口可以接收拖放操作的数据,窗口必须注册为drop目标;有一个OLE的API调用RegisterDragDrop来完成这个事情,函数的原型是:

WINOLEAPI RegisterDragDrop (HWND hwnd, IDropTarget * pDropTarget);

第一个参数是窗口的HANDLE,这个窗口是拖动的目标窗口;第二个参数是一个指向IDropTarget COM对象的指针,COM/OLE运行时将在拖放操作的过程中调用这个方法。

同样有一个OLE API调用来将window从拖放操作中删除:

WINOLEAPI RevokeDragDrop(HWND hwnd);

我们所要做的就是在窗口创建的时候调用RegisterDragDrop,在窗口销毁的时候调用RevokeDragDrop。在我们调用RegisterDragDrop之前,我们需要构造一个COM对象来支持IDropTarget接口。
阅读全文…

OLE Drag and Drop Tutorials

344 views

OLE Drag and Drop (5) Drop 源

2010年2月4日

Many thanks to Davide Chiodi from Italy who has very kindly converted the drop-source code into a Pure C implementation.

欢迎来到OLE拖放旅程系列的第五部分,我们机会到了OLE拖放实现的最后阶段,现在需要做的事情就是实现IDropSource和IDropTarget接口;一般我们完成这些,我们就可以在任何程序中添加拖放操作了。

本部分的目的在于实现一个用作拖放源的简单程序,它不能接收任何拖放的数据,但这不要紧,因为我们能使用任何平常支持拖放操作的windows程序(例如:WordPad)来测试,程序就是一个windows的Edit控件,它是子类化的,且支持拖操作。

这个子类的细节在这里不讨论,但源码可以很清晰的说明这个任务。

成为一个拖放的源对象

初始化一个拖放操作很简单,只要调用DoDragDrop这个API就足够了。

WINOLEAPI DoDragDrop (
   IDataObject * pDataObject,   // Pointer to the data object
   IDropSource * pDropSource,   // Pointer to the source
   DWORD          dwOKEffect,    // Effects allowed by the source
   DWORD        * pdwEffect      // Pointer to effects on the source
   );

一旦你调用这个AIP,OLE运行时就代表你的程序来接管并处理所有必要的鼠标和键盘windows消息,因此你基本上将控制权在调用这个函数的时候交给了OLE。
阅读全文…

OLE Drag and Drop Tutorials

403 views

OLE Drag and Drop (4) 枚举 FORMATETC

2010年2月4日


本章注重于实现一个暴露 IEnumFORMATETC 接口的 COM 对象,这里有两部分代码可以下载。第一包含一个完整的通用的 IEnumFORMATETC 实现,你可以将它用到你的程序中。另一部分代码是一个叫做 IDataObject Viewer 的所有代码。这是 PlatformSDK 同名程序的替代品,它是一个怎么样使用 IEnumFORMATETC 接口的基本介绍,而不是写这个接口。更重要的是,它在调式 OLE 拖放代码是非常有用,你可以拖动任何格式的 IDataObject 到它上面,它会显示显示数据包含的可用格式。

IEnumFORMATETC 接口在开始拖放时经常不会注意到,在许多情况下它是不必要的,但为了你的 IDataObject 可以在所有条件下保证 100% 工作,提供该接口的完整实现是必要的。
阅读全文…

OLE Drag and Drop Tutorials

525 views

OLE Drag and Drop (3) 实现 IDataObject

2010年2月4日

上一章我们着重介绍了怎么样使用 OLE 和 IDataObject 来访问 windows 粘贴板。本章主要实现一个 IDataObject 接口,然后使用我们完成的数据对象来存储文本“Hello World”到粘贴板中。

创建一个COM接口-IDataObject

为了创建一个COM对象,我们需要定义一个实现所有这些函数的C++类,并且让COM的虚函数表为我们自动包含,我们使用C++类继承:
阅读全文…

OLE Drag and Drop Tutorials

444 views

OLE Drag and Drop (2) OLE 数据传输

2010年2月4日

欢迎来到OLE拖放指南第二部分;本部分的目的在于解释在OLE环境中,程序之间怎么样表示和传输数据。

OLE数据传输的核心是IDataObject COM接口,一个IDataObject提供从一个程序到另一个程序传输和访问数据的方法。最通用的OLE数据传输是窗口粘贴板,当然也有拖放。IDataObject是一到多个数据的有效的COM包装。

在我们调查IDataObject任何细节之前,两个重要的数据结构你必须熟悉:FORMATETC和STGMEDIUM接口,他们用来描述和存储OLE数据。

描述 OLE 数据
FORMATETC接口(发音“format et cetera”)用来表示IDataObject提供(或接收)的数据类型,是标准window粘贴板格式(CF_TEXT等)的扩展,因此除了基本的粘贴板格式之外,还包含了数据怎么样rendered和存储。

typedef struct
{
    CLIPFORMAT      cfFormat;   // 粘贴板格式
    DVTARGETDEVICE *ptd;        // (NULL)  rendering的目标设备
    DWORD           dwAspect;    // (DV_CONTENT) rendering的详细程度
    LONG            lindex;      // (-1)  在数据通过页面边界分割的时候使用
    DWORD           tymed;       // 用于数据传输的存储媒体(HGLOBAL,IStream)
} FORMATETC;

阅读全文…

OLE Drag and Drop Tutorials

421 views

OLE Drag and Drop (1) 介绍

2010年2月4日

http://www.cppblog.com/windcsn/category/995.html

该指南的目的在于读者能够在他们自己的程序实现完整的拖拽功能。自Window95以来,Drag和Drop已经成为Window程序的一个标准功能,随着COM和OLE成为主流技术,程序能和Window Shell甚至其他Window程序无缝交互。这个弹性是以高昂的代价为基础的,说的婉转点,写一个COM或OLE支持的程序完全是一个噩梦。

本指南目的在于帮助你轻松克服写一个OLE接口支持的拖拽程序的困难。通常,我们使用纯WIN32 API基础。然而,我会使用C++而不是C,因为C++是写COM接口程序的首选语言;我也会解释怎么样以简单的方式转换成C语言。

我有意以几个部分来写这个指南,主要的原因是太多的信息。另外,Drag-and-drop组件也使他们有各自不同的主题,因此我采用了这种方法。指南的第一部分(实际上就是该部分)简单介绍OLE 拖拽,后面的指南着重于拖拽;第2和3部分介绍OLE数据传输IDataObject接口。第4部分看一下IEnumFORMATETC接口,第5和6部分介绍drag源和drop目标。
阅读全文…

OLE Drag and Drop Tutorials

296 views

OLE Drag and Drop Tutorials

2010年2月4日

http://www.catch22.net/tuts/dragdrop

James – Sat, 08/30/2008 – 09:10
The aim of this series of tutorials is to enable the reader to implement complete drag and drop support for their applications. Drag and drop became a standard feature of many Windows applications when Windows 95 was launched. With COM and OLE becoming more mainstream at this time, applications had the power to interact seamlessly with the Windows Shell and even other Windows applications. This flexibility came at a price though. Writing any form of COM or OLE enabled appliction is a complete nightmare, to put it mildly.

Part 1 – Introduction

Part 2 – OLE Data Transfers

Part 3 – Implementing IDataObject

Part 4 – Enumerating FORMATETC

Part 5 – Drop Source

Part 6 – Drop Targets

OLE Drag and Drop Tutorials