nim_duilib/examples/multi_browser/dragdrop/drag_drop.h
jiajia_deng 4933d1f2bc Remove dependency on shared
Signed-off-by: jiajia_deng <2894220@gmail.com>
2019-09-20 16:27:58 +08:00

108 lines
3.3 KiB
C++

// Copyright (c) 2015, NetEase Inc.
// All rights reserved.
//
// Author: Redrain
// Date: 2015/09/24
//
// brife: 实现控件的拖拽和窗体的拖放功能
#pragma once
#include "OleIdl.h"
#include "ShObjIdl.h"
#include <shlobj.h>
typedef struct _DATASTORAGE
{
FORMATETC *m_formatEtc;
STGMEDIUM *m_stgMedium;
} DATASTORAGE_t, *LPDATASTORAGE_t;
class SdkDataObject : public IDataObject
{
public:
SdkDataObject(/*SdkDropSource *pDropSource = NULL*/);
BOOL IsDataAvailable(CLIPFORMAT cfFormat);
BOOL GetGlobalData(CLIPFORMAT cfFormat, void **ppData);
BOOL GetGlobalDataArray(CLIPFORMAT cfFormat,
HGLOBAL *pDataArray, DWORD dwCount);
BOOL SetGlobalData(CLIPFORMAT cfFormat, void *pData, BOOL fRelease = TRUE);
BOOL SetGlobalDataArray(CLIPFORMAT cfFormat,
HGLOBAL *pDataArray, DWORD dwCount, BOOL fRelease = TRUE);
//BOOL SetDropTip(DROPIMAGETYPE type, PCWSTR pszMsg, PCWSTR pszInsert);
// The com interface.
IFACEMETHODIMP QueryInterface(REFIID riid, void **ppv);
IFACEMETHODIMP_(ULONG) AddRef();
IFACEMETHODIMP_(ULONG) Release();
IFACEMETHODIMP GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium);
IFACEMETHODIMP SetData(FORMATETC *pformatetc,
STGMEDIUM *pmedium, BOOL fRelease);
IFACEMETHODIMP GetDataHere(FORMATETC *pformatetc, STGMEDIUM *pmedium);
IFACEMETHODIMP QueryGetData(FORMATETC *pformatetc);
IFACEMETHODIMP GetCanonicalFormatEtc(FORMATETC *pformatetcIn,
FORMATETC *pformatetcOut);
IFACEMETHODIMP EnumFormatEtc(DWORD dwDirection,
IEnumFORMATETC **ppenumFormatEtc);
IFACEMETHODIMP DAdvise(FORMATETC *pformatetc, DWORD advf,
IAdviseSink *pAdvSnk, DWORD *pdwConnection);
IFACEMETHODIMP DUnadvise(DWORD dwConnection);
IFACEMETHODIMP EnumDAdvise(IEnumSTATDATA **ppenumAdvise);
private:
~SdkDataObject(void);
SdkDataObject(const SdkDataObject&);
SdkDataObject& operator = (const SdkDataObject&);
HRESULT CopyMedium(STGMEDIUM* pMedDest,
STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);
HRESULT SetBlob(CLIPFORMAT cf, const void *pvBlob, UINT cbBlob);
private:
volatile LONG m_lRefCount;
std::vector<DATASTORAGE_t> m_dataStorageCL;
};
class SdkDropSource : public IDropSource
{
public:
SdkDropSource();
//IUnknown
virtual HRESULT STDMETHODCALLTYPE QueryInterface(
/* [in] */ REFIID riid,
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
virtual ULONG STDMETHODCALLTYPE AddRef( void);
virtual ULONG STDMETHODCALLTYPE Release( void);
//IDropSource
virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag(
/* [in] */ BOOL fEscapePressed,
/* [in] */ DWORD grfKeyState);
virtual HRESULT STDMETHODCALLTYPE GiveFeedback(
/* [in] */ DWORD dwEffect);
// 设置拖拽时鼠标光标的样式,如果不设置则使用系统默认光标
void SetFeedbackCursor(HCURSOR cursor);
private:
long m_cRefCount;
bool m_bDropped;
HCURSOR m_feedbackCursor;
};
class SdkDragSourceHelper
{
public:
SdkDragSourceHelper();
virtual ~SdkDragSourceHelper();
// IDragSourceHelper
HRESULT InitializeFromBitmap(HBITMAP hBitmap,
POINT& pt_offset, // cursor position offset of the bitmap
SIZE& bitmap_size, // hBitmap's size
IDataObject* pDataObject,
COLORREF crColorKey = GetSysColor(COLOR_WINDOW) // color of the window used for transparent effect.
);
HRESULT InitializeFromWindow(HWND hwnd, POINT& pt, IDataObject* pDataObject);
private:
IDragSourceHelper* m_pDragSourceHelper;
};