|
RegisterDragDrop(Form1.Memo1.Handle,self);//上文提到的函数
end;
destructor TDragAndDropOLE.Destroy;
begin
RevokeDragDrop(Form1.Memo1.Handle);
inherited;
end;
接下来实现Iunknown,不再做详细说明:
function TDragAndDropOLE._AddRef: integer;
begin
result:=InterLockedDecrement(FRefCount);
if Result=0 then Destroy;
end;
function TDragAndDropOLE._Release: integer;
begin
result:=InterLockedIncrement(FRefCount);
end;
function TDragAndDropOLE.QueryInterface(const IID: TGUID;
out Obj): HResult;
begin
if GetInterface(IID,Obj) then
result:=S_OK
else result:=E_NOINTERFACE;
end;
最重要的IDropTarget实现:
function TDragAndDropOLE.DragEnter(const dataObj: IDataObject;
grfKeyState: Integer; pt: TPoint; var dwEffect: Integer): HResult;
begin
result:=E_FAIL;
CanDrop:=E_Fail;
if assigned(dataObj) then
begin
with fe do
begin
cfFormat:=CF_TEXT;
ptd:=nil;
dwAspect:=DVASPECT_CONTENT;
lindex:=-1;
tymed:=TYMED_HGLOBAL;
end;
//大家从上面看到的fe是一种我们处理内存数据时常用的转换格式
//这里它表示将数据格式作为文字(cfFormat),并将其存入一块
//全局的内存区域(tymed:=TYMED_HGLOBAL),更多的格式请在win32
//帮助中搜索TFormatEtc
CanDrop:=dataObj.QueryGetData(fe);//按照fe指定的格式检查数据
result:=CanDrop;
if not Failed(result) then
dwEffect:=DROPEFFECT_COPY
else dwEffect:=DROPEFFECT_NONE;
//注意这里我们设置了dwEffect,更多的取值请查看win32帮助
end;
end;
function TDragAndDropOLE.DragLeave: HResult;
begin
result:=S_OK;
end;
function TDragAndDropOLE.DragOver(grfKeyState: Integer; pt: TPoint;
var dwEffect: Integer): HResult;
begin
result:=S_OK;
//我们不需要在这里做其余的操作,当然你可以根据自己的需要完成自己的方法
end;
function TDragAndDropOLE.Drop(const dataObj: IDataObject;
grfKeyState: Integer; pt: TPoint; var dwEffect: Integer): HResult;
var
medium:stgMedium;
hData:HGLOBAL;
begin
result:=E_Fail;
if not Fa 上一页 [1] [2] [3] 下一页 没有相关教程
|