bcb ole拖拽功能的实现
最近项目中用到了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拖拽功能的实现的更多相关文章
- RCP:拖拽功能的实现 Drag and Drop
SWT中的拖拽是使用的org.eclipse.swt.dnd. 有三个需要密切注意的类: 1.DragSource 2.DropTarget 3.Transfer DragSource封装了需要被拖拽 ...
- js实现登陆页面的拖拽功能
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>登 ...
- duilib中控件拖拽功能的实现方法(附源码)
转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41144283 duilib库中原本没有显示的对控件增加拖拽的功能,而实际 ...
- React Editor 应用编辑器(1) - 拖拽功能剖析
这是可视化编辑器 Gaea-Editor 的第一篇连载分析文章,希望我能在有限的篇幅讲清楚制作这个网页编辑器的动机,以及可能带来的美好使用前景(画大饼).它会具有如下几个特征: 运行在网页 文档流布局 ...
- WinForm实现简单的拖拽功能(C#)(2)
首先创建一个winform应用程序,添加listbox1与listbox2,拖拽listbox1的项到listbox2上去. 具体代码如下 namespace OLE拖拽{ public partia ...
- DIV 实现可拖拽 功能(留档)
//可拖拽 功能 $.fn.extend({ //用法:$(element).jqDrag(); //element需要具备定位属性,需要手动调整层叠样式,这里只是修改鼠标拖动效果 ...
- 使用NGUI实现拖拽功能(拼图小游戏)
上一次用UGUI实现了拼图小游戏,这次,我们来用NGUI来实现 实现原理 NGUI中提供了拖拽的基类UIDragDropItem,所以我们要做的就是在要拖拽的图片上加一个继承于该类的脚本,并实现其中的 ...
- 使用UGUI实现拖拽功能(拼图小游戏)
实现方式 1.引入UGUI自带的事件系统 UnityEngine.EventSystems 2.为我们的类添加接口 IBeginDragHandler, IDragHandler, IEndDragH ...
- JQuery UI的拖拽功能
JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量 ...
随机推荐
- python2.7 升级到 python3.6
1.命令 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel t ...
- 在使用pandas 0.23.4对日期进行分组排序时报错
date_df["rank_num"] = date_df.groupby("issuer_id").report_date.agg("rank&qu ...
- uniapp跨域两次请求解决方案
引入qs模块 使用 qs模块将data序列化,再传递,注意header必须设置为 'content-type':'application/x-www-form-urlencoded', import ...
- python中文编码 - python基础入门(5)
python到目前为止,一共有两个版本,分别是2.x和3.x版本,根据官方正式通知2020年停止对python更新和维护,距离今天还有110天左右,所以正在学习python的小伙伴应该暗中庆幸一波. ...
- 批量添加删除Windows server DNS服务 恶意域名 * A记录 指向 127.0.0.1(2019年6月5日更新)
下载链接:https://pan.baidu.com/s/1OUHyvnIfXYF0PdiT-VRyHw 密码:7gjj 注意!本解决方案在本地的Windows server服务器上把恶意域名指向1 ...
- Windows下jmap命令报错问题
最近换了笔记本,新的工作环境下jmap命令居然在报错,而jps.jstat.jinfo.jstack都能正常使用,所以初步排除进程号的问题. Attaching to core 17536 fr ...
- MyEclipse开发第一个java程序HelloWorld
[学习笔记] 用MyEclipse开发第一个java程序: 我们先看看一个具体例子,给你们有个先入为主的感觉. 步骤一:在Eclipse开发工具中我们New一个java项目, 如图2_1 图2_1 步 ...
- Python开发【第五章】:常用模块
一.模块介绍: 1.模块定义 用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质上就是.py结尾python文件 分类:内置模块.开源模块.自定义模块 2.导入模块 本质:导 ...
- linux运维工程师常用命令
1.ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 通-a,但不列出"."和".."-l 列 ...
- C# xml序列化 datatime字段
[XmlIgnore] public DateTime ApplicationDatetime { get; set; } [XmlElement("ApplicationDatetime& ...