博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bcb ole拖拽功能的实现
阅读量:5068 次
发布时间:2019-06-12

本文共 3651 字,大约阅读时间需要 12 分钟。

最近项目中用到了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 
#pragma hdrstop#include "Unit1.h"#include
#include
#include
//---------------------------------------------------------------------------#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)); //剩下的就是把
。。。 通过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();}//---------------------------------------------------------------------------

 

转载于:https://www.cnblogs.com/songr/p/5384766.html

你可能感兴趣的文章
bcb ole拖拽功能的实现
查看>>
生活大爆炸之何为光速
查看>>
Android学习资源
查看>>
ASP 解析json
查看>>
angularJS----filter
查看>>
Python Api接口自动化测试框架 excel篇
查看>>
Ionic 常见问题及解决方案
查看>>
各浏览器目前对CSS3、HTML5的支持
查看>>
切换jdk版本
查看>>
结对开发四~~
查看>>
关于多用户下自动编号的问题
查看>>
只显示重复数据,或不显示重复数据
查看>>
curl 命令详解
查看>>
javascript 对象简单介绍(一)
查看>>
linux正则表达式回忆记录
查看>>
Response.Buffer = True
查看>>
有趣的python range()函数
查看>>
webpack执行命令失败之解决办法
查看>>
bzoj 2456: mode【瞎搞】
查看>>
用jquery可以用使用serialize()序列化表单值,那有没有什么方法可以将值填充到表单中呢? (一段不错的代码)...
查看>>