最近项目中用到了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

  1. //---------------------------------------------------------------------------
  2.  
  3. #include <vcl.h>
  4. #pragma hdrstop
  5.  
  6. #include "Unit1.h"
  7. #include <OLEIDL.h>
  8. #include <SysUtils.hpp>
  9. #include <ObjIdl.h>
  10. //---------------------------------------------------------------------------
  11. #pragma package(smart_init)
  12. #pragma resource "*.dfm"
  13. TForm1 *Form1;
  14.  
  15. /*实现IDropTarget COM接口*/
  16. class TOleDragAndDrop :
  17. public TObject,
  18. public IDropTarget,
  19. public IUnknown
  20. {
  21. private:
  22. HANDLE d_handle;//注册的窗体句柄
  23. volatile LONG d_ref; //引用计数器
  24. public:
  25. //构造是注册OLEDragDrop
  26. TOleDragAndDrop(HANDLE handle)
  27. {
  28. d_ref = ;
  29. d_handle = handle;
  30. RegisterDragDrop(handle,this);
  31. }
  32. //必须虚函数,以调用父类的析构
  33. __fastcall ~TOleDragAndDrop()
  34. {
  35. RevokeDragDrop(d_handle);
  36. //调用父类的析构
  37. }
  38.  
  39. //实现COM要求的QueryInterface
  40. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject)
  41. {
  42. HRESULT result=S_OK;
  43. if (GetInterface(iid,ppvObject))
  44. result=S_OK;
  45. else
  46. result=E_NOINTERFACE;
  47. return result;
  48. }
  49. //实现COM要求的引用计数器
  50. ULONG STDMETHODCALLTYPE AddRef(void)
  51. {
  52. ULONG result = InterlockedDecrement(&d_ref);
  53. return result;
  54. }
  55. //实现COM要求的释放接口
  56. ULONG STDMETHODCALLTYPE Release(void)
  57. {
  58. ULONG result = InterlockedDecrement(&d_ref);
  59. return result;
  60. }
  61. //实现IDropTarget 中的DragOver
  62. HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState,
  63. POINTL pt,DWORD *pdwEffect)
  64. {
  65. //ShowMessage("drag over");
  66. return S_OK;
  67. }
  68. //实现IDropTarget 中的DragEnter
  69. HRESULT STDMETHODCALLTYPE DragEnter(IDataObject * pDataObject,
  70. DWORD grfKeyState, POINTL pt,DWORD * pdwEffect)
  71. {
  72. //ShowMessage("drag enter");
  73. return S_OK;
  74. }
  75. //实现IDropTarget 中的DragLeave
  76. HRESULT STDMETHODCALLTYPE DragLeave(void)
  77. {
  78. //ShowMessage("drag leave");
  79. return S_OK;
  80. }
  81. //实现IDropTarget 中的Drop
  82. HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObj,DWORD grfKeyState,
  83. POINTL pt,DWORD __RPC_FAR *pdwEffect)
  84. {
  85. AnsiString retStr;
  86. FORMATETC format;
  87. int cf_html = RegisterClipboardFormat("HTML Format");
  88. FORMATETC cFmt = {(CLIPFORMAT) CF_TEXT, NULL, DVASPECT_CONTENT, -, TYMED_HGLOBAL};
  89. cFmt.cfFormat = cf_html;
  90. STGMEDIUM stgMedium;
  91. pDataObj->GetData(&cFmt, &stgMedium);
  92. if(stgMedium.tymed == TYMED_HGLOBAL)
  93. {
  94. char* html = (char*)GlobalLock(stgMedium.hGlobal);
  95. ShowMessage(Utf8ToAnsi(html));
  96. //剩下的就是把<img>。。。</img> 通过XML解析出来
  97. }
  98.  
  99. return S_OK;
  100. }
  101. };
  102. //---------------------------------------------------------------------------
  103. static TOleDragAndDrop* d_poledragDrop = NULL;
  104.  
  105. __fastcall TForm1::TForm1(TComponent* Owner)
  106. : TForm(Owner)
  107. {
  108. OleInitialize(NULL);
  109. d_poledragDrop = new TOleDragAndDrop(Memo1->Handle);
  110. }
  111. //---------------------------------------------------------------------------
  112.  
  113. //---------------------------------------------------------------------------
  114. void __fastcall TForm1::FormDestroy(TObject *Sender)
  115. {
  116. delete d_poledragDrop;
  117. d_poledragDrop = NULL;
  118. OleUninitialize();
  119. }
  120. //---------------------------------------------------------------------------

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. kali安装chrome

    文章搬到自己的网站上,如下: http://101.132.137.140:202/archives/2019-11-25

  2. 【数据库开发】在Windows上和Linux上配置MySQL的过程

    [数据库开发]在Windows上和Linux上配置MySQL的过程 标签(空格分隔): [编程开发] 首先是在Windows上尝试用QT进行MySQL数据库开发,结果总出现driver不能load的错 ...

  3. MyBatis框架总结

    一. MyBatis简介 MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBati ...

  4. 哈夫曼编解码压缩解压文件—C++实现

    前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...

  5. C++ 编译错误 jump to case label [-fpermissive]

    <花的微笑>--- 钢琴曲,石进 今天再用C++写代码时,出现了编译错误 jump to case label [-fpermissive] 原因:使用switch语句时,再case中定义 ...

  6. Beanshell post processor写文件

    byte[] responseData = prev.getResponseData().; private String filePath = "F:/test.txt"; Bu ...

  7. 快速了解NIO

    NIO的由来 我们都知道,在jdk1.4的时候就开始引入NIO了,它是基于Selector机制的非阻塞I/O,可以将多个异步的I/O操作集中到一个或几个线程中进行处理,目的就是为了代替阻塞I/O,提到 ...

  8. JAVA_split 字符串按照 . 分割

    split 按照 . 分割字符串时 需要进行转义 代码: String[] str = obj_str.split("\\.") split 按照 \ 分割字符串时 需要多次转义 ...

  9. 剑指offer15:反转链表后,输出新链表的表头。

    1 题目描述 输入一个链表,反转链表后,输出新链表的表头. 2 思路和方法 (1)利用栈作为中间存储,进行链表的反转,将压入的数据按先进后出的顺序弹出依次赋给链表再输出表头pHead. (2)将当前节 ...

  10. 序列变换(HDU-5256)【LIS】

    题目链接:https://vjudge.net/problem/HDU-5256 题意:给一个数列,每一个数都不相同且为整数,现求,最少需要修改多少次才能使该数列为严格上升的. 思路:首先,对于一个严 ...