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的插件支持,有大量 ...
随机推荐
- kali安装chrome
文章搬到自己的网站上,如下: http://101.132.137.140:202/archives/2019-11-25
- 【数据库开发】在Windows上和Linux上配置MySQL的过程
[数据库开发]在Windows上和Linux上配置MySQL的过程 标签(空格分隔): [编程开发] 首先是在Windows上尝试用QT进行MySQL数据库开发,结果总出现driver不能load的错 ...
- MyBatis框架总结
一. MyBatis简介 MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBati ...
- 哈夫曼编解码压缩解压文件—C++实现
前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...
- C++ 编译错误 jump to case label [-fpermissive]
<花的微笑>--- 钢琴曲,石进 今天再用C++写代码时,出现了编译错误 jump to case label [-fpermissive] 原因:使用switch语句时,再case中定义 ...
- Beanshell post processor写文件
byte[] responseData = prev.getResponseData().; private String filePath = "F:/test.txt"; Bu ...
- 快速了解NIO
NIO的由来 我们都知道,在jdk1.4的时候就开始引入NIO了,它是基于Selector机制的非阻塞I/O,可以将多个异步的I/O操作集中到一个或几个线程中进行处理,目的就是为了代替阻塞I/O,提到 ...
- JAVA_split 字符串按照 . 分割
split 按照 . 分割字符串时 需要进行转义 代码: String[] str = obj_str.split("\\.") split 按照 \ 分割字符串时 需要多次转义 ...
- 剑指offer15:反转链表后,输出新链表的表头。
1 题目描述 输入一个链表,反转链表后,输出新链表的表头. 2 思路和方法 (1)利用栈作为中间存储,进行链表的反转,将压入的数据按先进后出的顺序弹出依次赋给链表再输出表头pHead. (2)将当前节 ...
- 序列变换(HDU-5256)【LIS】
题目链接:https://vjudge.net/problem/HDU-5256 题意:给一个数列,每一个数都不相同且为整数,现求,最少需要修改多少次才能使该数列为严格上升的. 思路:首先,对于一个严 ...