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 = 0;
        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, -1, 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();
}
//---------------------------------------------------------------------------
时间: 2024-08-08 05:21:13

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

JAVA UI 拖拽功能

java GUI拖拽功能是很实用也相对高级一些的功能. 有一小部分的GUI控件支持他们有dragEnabled属性.这些JComponent包括:javax.swing.JColorChooserjavax.swing.JFileChooserjavax.swing.JListjavax.swing.JTablejavax.swing.JTreejavax.swing.text.JTextComponent 大部分的控件不支持没有这个属性,尤其是常用的jpanel和jframe. 一种简单的方法

Atitit。D&amp;D drag&amp;drop拖拽功能c#.net java swing的对比与实现总结

Atitit.D&D drag&drop拖拽功能c#.net java swing的对比与实现总结 1. 实现一个D&D操作一般包括三个步骤: 1 2. .net黑头的拖曳机制.必须有DragEnter事件(单独写DragDrop事件是不会具有拖拽功能的) 2 3. ---java黑头的拖曳..必须有DragEnter事件(单独写 Drop事件是不会具有拖拽功能的) 2 4. 代码 3 5. 参考 5 1. 实现一个D&D操作一般包括三个步骤: 首先实现一个拖拽源,这个拖拽

文件拖拽功能失效,原来是UAC把它过滤了

碰到这样一个问题,文件拖拽功能在没有以管理员身份运行的时候是正常的,但是一旦使用管理员身份运行,这个功能就失效了,搜索了好久总算找到原因了. 在window visa以上版本里引入了用户账户控制(UAC),在管理员权限上会过滤掉一些窗口消息,文件拖拽正好也也被过滤了,解决的方法就是使用ChangeWindowMessageFilterEx()解除过滤 //解除window7以上窗口对该消息的过滤 ChangeWindowMessageFilterEx(hwndDlg, WM_DROPFILES,

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

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>登陆页面的拖拽功能实现</title> </head> <style type="text/css"> *{ margin:0; padding:0; } a{ text-decoration: none; } .dialog{ width: 380px;

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

实现方式 1.引入UGUI自带的事件系统 UnityEngine.EventSystems 2.为我们的类添加接口 IBeginDragHandler, IDragHandler, IEndDragHandler 1 using UnityEngine; 2 using System.Collections; 3 using UnityEngine.EventSystems; 4 5 public class DragOnPic : MonoBehaviour,IBeginDragHandler

我的开源框架之可拖拽功能实现

需求: (1)实现元素可拖拽 (2)自定义拖拽范围 (3)自定义按下触发拖拽的元素 (4)支持拖拽过程中的事件监听 实现思路: 元素可拖拽的实现关键为,mousedown.mousemove.mouseup三大事件.mousedown为按下触发拖动的事件,可以定义到元素本身或其他元素:mousemove为拖动范围元素的事件,该事件负责重新设置拖动元素的位置属性:mouseup为拖动范围元素的事件,该事件主要为了释放mousemove.mouseup事件. 为避免当拖动元素内容有较大内容时,重新绘

JQuery UI的拖拽功能

JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量的第三方插件可以丰富JQuery UI的功能. JQuery UI提供的API极大简化了拖拽功能的开发.只需要分别在拖拽源(source)和目标(target)上调用draggable和droppable两个函数即可. 拖拽原理 首先要明确几个概念. ource:拖拽源,要拖动的元素. taerge

easyUI拖拽功能讲解以及多选拖拽的实现

首先我们考虑这样一个业务场景:一个维修部门中分了N个维修组,维修部门的负责人需要将这个部门的维修人员分配到这些组里去. 当然,他可以选中一个维修人员,然后给他分配维修组,但是从人性化角度考虑,若利用拖拽是否更加的快捷和明确呢? 比如我们可以将维修组和维修人员都列出来,然后只需要将维修人员拖动到对应的组里即可完成分组. 另外,由于一个个拖还是太繁琐,还需要实现选中多个维修人员一起分组.那么我们下面一步步来,先实现单个的拖拽功能,再加入多选拖动支持~ 单选拖动 首先,根据我们刚才描述的场景,简单设计

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

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41144283 duilib库中原本没有显示的对控件增加拖拽的功能,而实际使用过程中拖拽功能也是有用武之地的.看群里有人问题duilib怎么支持拖拽,我也就写这篇文章说明一下duilib实现控件拖拽的方法. 当我刚接触duilib不就的时候,考虑过duilib拖拽这个功能,当时的想法是,在xml布局中设置一个浮动的控件,正常状态下他是隐藏的,当出发了拖拽条件后将他显示并且