#include "stdafx.h"
#include "DropSource.h"

CDropSource::CDropSource()
{
	m_RefCount = 1;
}

HRESULT WINAPI CDropSource::QueryInterface(const IID& iid, LPVOID* ppv)
{
	if ((iid == IID_IDropSource) || (iid == IID_IUnknown)) {
		*ppv = (LPVOID)this;
		AddRef();
		return S_OK;
	}

	*ppv = 0;
	return E_NOINTERFACE;
}


ULONG WINAPI CDropSource::AddRef()
{
	InterlockedIncrement(&m_RefCount);
	return (ULONG)m_RefCount;
}


ULONG WINAPI CDropSource::Release()
{
	if (InterlockedDecrement(&m_RefCount) == 0)
		delete this;
	return (ULONG)m_RefCount;
}

HRESULT WINAPI CDropSource::QueryContinueDrag(BOOL bEscapePressed, DWORD grfKeyState)
{
	/* ドラッグを継続するかどうかを決める */

	/* ESCが押された場合やマウスのボタンが両方押されたときは中止 */
	if (bEscapePressed || (MK_LBUTTON | MK_RBUTTON) == (grfKeyState & (MK_LBUTTON | MK_RBUTTON))){
		return DRAGDROP_S_CANCEL;
	}

	/* マウスボタンが離されたときはドロップ */
	if ((grfKeyState & (MK_LBUTTON | MK_RBUTTON)) == 0){
		return DRAGDROP_S_DROP;
	}
	return S_OK;
}

HRESULT WINAPI CDropSource::GiveFeedback(DWORD dwEffect)
{
	/* マウスカーソルを変えたり、特別な表示をするときはここで行う */

	//標準のマウスカーソルを使う
	return DRAGDROP_S_USEDEFAULTCURSORS;
}