最近项目中用到了OLE 拖拽功能

和BCB 一个Form的Drag 不同的是,只有实现了OLE 拖拽才能,从其他程序拖拽数据到Form

下面的代码实现了,同HTML网页拖拽到Form时,Form获得HTML数据

其核心思想是,

1,要实现 COM的 IDropTarget 接口

2,RegisterDragDrop(handle,this); 注册窗口的拖拽

3,窗口类构造 OleInitialize(NULL);

4,窗口类析构时 OleUninitialize();

5,在下面的代码中,我将IDropTarget  接口封装为类TOleDragAndDrop

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop #include "Unit1.h"
#include <OLEIDL.h>
#include <SysUtils.hpp>
#include <ObjIdl.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1; /*实现IDropTarget COM接口*/
class TOleDragAndDrop :
public TObject,
public IDropTarget,
public IUnknown
{
private:
HANDLE d_handle;//注册的窗体句柄
volatile LONG d_ref; //引用计数器
public:
//构造是注册OLEDragDrop
TOleDragAndDrop(HANDLE handle)
{
d_ref = ;
d_handle = handle;
RegisterDragDrop(handle,this);
}
//必须虚函数,以调用父类的析构
__fastcall ~TOleDragAndDrop()
{
RevokeDragDrop(d_handle);
//调用父类的析构
} //实现COM要求的QueryInterface
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject)
{
HRESULT result=S_OK;
if (GetInterface(iid,ppvObject))
result=S_OK;
else
result=E_NOINTERFACE;
return result;
}
//实现COM要求的引用计数器
ULONG STDMETHODCALLTYPE AddRef(void)
{
ULONG result = InterlockedDecrement(&d_ref);
return result;
}
//实现COM要求的释放接口
ULONG STDMETHODCALLTYPE Release(void)
{
ULONG result = InterlockedDecrement(&d_ref);
return result;
}
//实现IDropTarget 中的DragOver
HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState,
POINTL pt,DWORD *pdwEffect)
{
//ShowMessage("drag over");
return S_OK;
}
//实现IDropTarget 中的DragEnter
HRESULT STDMETHODCALLTYPE DragEnter(IDataObject * pDataObject,
DWORD grfKeyState, POINTL pt,DWORD * pdwEffect)
{
//ShowMessage("drag enter");
return S_OK;
}
//实现IDropTarget 中的DragLeave
HRESULT STDMETHODCALLTYPE DragLeave(void)
{
//ShowMessage("drag leave");
return S_OK;
}
//实现IDropTarget 中的Drop
HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObj,DWORD grfKeyState,
POINTL pt,DWORD __RPC_FAR *pdwEffect)
{
AnsiString retStr;
FORMATETC format;
int cf_html = RegisterClipboardFormat("HTML Format");
FORMATETC cFmt = {(CLIPFORMAT) CF_TEXT, NULL, DVASPECT_CONTENT, -, TYMED_HGLOBAL};
cFmt.cfFormat = cf_html;
STGMEDIUM stgMedium;
pDataObj->GetData(&cFmt, &stgMedium);
if(stgMedium.tymed == TYMED_HGLOBAL)
{
char* html = (char*)GlobalLock(stgMedium.hGlobal);
ShowMessage(Utf8ToAnsi(html));
//剩下的就是把<img>。。。</img> 通过XML解析出来
} return S_OK;
}
};
//---------------------------------------------------------------------------
static TOleDragAndDrop* d_poledragDrop = NULL; __fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
OleInitialize(NULL);
d_poledragDrop = new TOleDragAndDrop(Memo1->Handle);
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete d_poledragDrop;
d_poledragDrop = NULL;
OleUninitialize();
}
//---------------------------------------------------------------------------

bcb ole拖拽功能的实现的更多相关文章

  1. RCP:拖拽功能的实现 Drag and Drop

    SWT中的拖拽是使用的org.eclipse.swt.dnd. 有三个需要密切注意的类: 1.DragSource 2.DropTarget 3.Transfer DragSource封装了需要被拖拽 ...

  2. js实现登陆页面的拖拽功能

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>登 ...

  3. duilib中控件拖拽功能的实现方法(附源码)

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41144283 duilib库中原本没有显示的对控件增加拖拽的功能,而实际 ...

  4. React Editor 应用编辑器(1) - 拖拽功能剖析

    这是可视化编辑器 Gaea-Editor 的第一篇连载分析文章,希望我能在有限的篇幅讲清楚制作这个网页编辑器的动机,以及可能带来的美好使用前景(画大饼).它会具有如下几个特征: 运行在网页 文档流布局 ...

  5. WinForm实现简单的拖拽功能(C#)(2)

    首先创建一个winform应用程序,添加listbox1与listbox2,拖拽listbox1的项到listbox2上去. 具体代码如下 namespace OLE拖拽{ public partia ...

  6. DIV 实现可拖拽 功能(留档)

    //可拖拽 功能 $.fn.extend({    //用法:$(element).jqDrag();    //element需要具备定位属性,需要手动调整层叠样式,这里只是修改鼠标拖动效果    ...

  7. 使用NGUI实现拖拽功能(拼图小游戏)

    上一次用UGUI实现了拼图小游戏,这次,我们来用NGUI来实现 实现原理 NGUI中提供了拖拽的基类UIDragDropItem,所以我们要做的就是在要拖拽的图片上加一个继承于该类的脚本,并实现其中的 ...

  8. 使用UGUI实现拖拽功能(拼图小游戏)

    实现方式 1.引入UGUI自带的事件系统 UnityEngine.EventSystems 2.为我们的类添加接口 IBeginDragHandler, IDragHandler, IEndDragH ...

  9. JQuery UI的拖拽功能

    JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量 ...

随机推荐

  1. 如何实现批量截取整个网页完整长截图,批量将网页保存成图片web2pic/webshot/screencapture/html2picture

    如何实现批量截取整个网页完整长截图,批量将网页保存成图片web2pic/webshot/screencapture [困扰?疑问?]: 您是否正受到:如何将网页保存为图片的困扰?网页很高很长截图截不全 ...

  2. Tensorflow 2.0 datasets数据加载

    导入包 import tensorflow as tf from tensorflow import keras 加载数据 tensorflow可以调用keras自带的datasets,很方便,就是有 ...

  3. sas(Serial Attached SCSI)技术详解

    1.什么是SAS 即串行SCSI技术,是一种磁盘连接技术,它综合了并行SCSI和串行连接技术(FC,SSA,IEEE1394)的优势,以串行通讯协议为协议基础架构,采用SCSI-3扩展指令集,并兼容S ...

  4. javascript jssdk退出微信的方法

    javascript jssdk退出微信的方法 <pre> $('.tctip').on('click',function () { setTimeout("WeixinJSBr ...

  5. CVE-2019-0708 RDP MSF漏洞利用

    CVE-2019-0708 RDP MSF漏洞复现 漏洞环境 使用 VMware 安装Windows7 X64 模拟受害机 Windows7 X64下载链接:链接: https://pan.baidu ...

  6. Word 分栏页码,一个页面两个不同页码的设置

    1. 前言 在一些报纸.杂志中,我们可以见到各种各样的排版风格效果,其中有一种效果是一个页面设置了两栏,并且每栏下面都有不同的页码,那么,这种效果是如何实现的呢?这种页码在Word中默认页码样式中是没 ...

  7. flask使用tablib导出excel数据表

    在网页中常常有导出数据的需求,尤其是一下管理类平台.在flask中要导出excel数据表,通常可以使用xlwt库,创建文件并逐行写入数据,但是使用起来总是感觉很麻烦.tablib库相对操作更加方便. ...

  8. 1233: 输出杨辉三角前n行(Java)

    WUSTOJ 1233: 输出杨辉三角前n行 题目 原题链接 Description 输出杨辉三角前n行. Input 输入一个数n(n <= 9) Output 输出杨辉三角前n行.(注意行末 ...

  9. java——值传递和引用传递

    值传递 在方法被调用时,实参通过形参把它的内容副本传入方法内部,此时形参接收到的内容是实参值的一个拷贝,因此在方法内对形参的任何操作,都仅仅是对这个副本的操作,不影响原始值的内容. 先来看个例子: p ...

  10. 怎样手写实现 new 命令的功能

    实现new命令的功能, 首先需要知道new命令都做了些什么: 第一步: 创建一个空对象, 作为实例对象的容器; 第二步: 将空对象的prototype指向构造函数的prototype; 第三步: 将空 ...