📄 droptarget.cpp
字号:
pva->vt = VT_BSTR;
pva->bstrVal = pPaste->m_bstrURLs;
VERIFY( SafeArrayUnaccessData(psfHtmlLines) == S_OK );
// Build the HTML document
//
// NOTE: 'bstrHTML' may contain a complete HTML document (see CF_HTML) or
// just a fragment (without <HTML>, <BODY>, ... tags).
//
// WOW! We even can pump partially (but well defined) HTML stuff into the
// document (e.g. contents without <HTML>, <BODY>...) *and* we are capable
// of accessing the HTML object model (can use 'get_links'...)
if ((hr = doc->write(psfHtmlLines)) == S_OK)
hrPasteResult = PasteHTMLDocument(doc, pPaste);
else
hrPasteResult = E_FAIL;
}
else
hrPasteResult = E_OUTOFMEMORY;
// Destroy the array *and* all of the data (BSTRs!)
if (SafeArrayAccessData(psfHtmlLines, (void**)pva) == S_OK)
{
// 'Remove' the BSTR which was specified before, to *NOT* have it deleted by 'SafeArrayDestroy'
pva->vt = VT_NULL;
pva->bstrVal = NULL;
VERIFY( SafeArrayUnaccessData(psfHtmlLines) == S_OK );
}
VERIFY( SafeArrayDestroy(psfHtmlLines) == S_OK );
}
else
hrPasteResult = E_OUTOFMEMORY;
}
else
hrPasteResult = E_FAIL;
}
return hrPasteResult;
}
HRESULT CMainFrameDropTarget::PasteHTML(COleDataObject& data)
{
HRESULT hrPasteResult = E_FAIL;
HGLOBAL hMem;
if ((hMem = data.GetGlobalData(m_cfHTML)) != NULL)
{
LPCSTR pszClipboard;
if ((pszClipboard = (LPCSTR)GlobalLock(hMem)) != NULL)
{
hrPasteResult = S_FALSE; // default: nothing was pasted
LPSTR pszHTML = strchr(pszClipboard, '<');
if (pszHTML != NULL)
{
USES_CONVERSION;
CComBSTR bstrHTMLText(A2W(pszHTML));
PASTEURLDATA Paste(bstrHTMLText);
hrPasteResult = PasteHTML(&Paste);
}
GlobalUnlock(hMem);
}
GlobalFree(hMem);
}
return hrPasteResult;
}
HRESULT CMainFrameDropTarget::PasteText(CLIPFORMAT cfData, COleDataObject& data)
{
HRESULT hrPasteResult = E_FAIL;
HANDLE hMem;
if ((hMem = data.GetGlobalData(cfData)) != NULL)
{
LPCSTR pszUrlA;
if ((pszUrlA = (LPCSTR)GlobalLock(hMem)) != NULL)
{
// skip white space
while (isspace(*pszUrlA))
pszUrlA++;
hrPasteResult = S_FALSE; // default: nothing was pasted
if (strncmp(pszUrlA, "ed2k://|", 8) == 0)
{
CString strData(pszUrlA);
int iPos = 0;
CString str = strData.Tokenize(_T("\r\n"), iPos);
while (!str.IsEmpty())
{
theApp.emuledlg->ProcessED2KLink(str);
hrPasteResult = S_OK;
str = strData.Tokenize(_T("\r\n"), iPos);
}
}
GlobalUnlock(hMem);
}
GlobalFree(hMem);
}
return hrPasteResult;
}
HRESULT CMainFrameDropTarget::AddUrlFileContents(LPCTSTR pszFileName)
{
HRESULT hrResult = S_FALSE;
TCHAR szExt[_MAX_EXT];
_tsplitpath(pszFileName, NULL, NULL, NULL, szExt);
if (_tcsicmp(szExt, FILEEXTDOT_INETSHRTCUT) == 0)
{
CComPtr<IUniformResourceLocatorW> pIUrl;
if (SUCCEEDED(hrResult = CoCreateInstance(CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER, IID_IUniformResourceLocatorW, (void**)&pIUrl)))
{
CComPtr<IPersistFile> pIFile;
if (SUCCEEDED(hrResult = pIUrl.QueryInterface(&pIFile)))
{
USES_CONVERSION;
if (SUCCEEDED(hrResult = pIFile->Load(CComBSTR(T2CW(pszFileName)), STGM_READ | STGM_SHARE_DENY_WRITE)))
{
LPWSTR pwszUrl;
if ((hrResult = pIUrl->GetURL(&pwszUrl)) == S_OK)
{
if (pwszUrl != NULL && pwszUrl[0] != L'\0' && IsUrlSchemeSupportedW(pwszUrl))
{
theApp.emuledlg->ProcessED2KLink(W2T(pwszUrl));
hrResult = S_OK;
}
::CoTaskMemFree(pwszUrl);
}
}
}
}
}
return hrResult;
}
HRESULT CMainFrameDropTarget::PasteHDROP(COleDataObject &data)
{
HRESULT hrPasteResult = E_FAIL;
HANDLE hMem;
if ((hMem = data.GetGlobalData(CF_HDROP)) != NULL)
{
LPDROPFILES lpDrop;
if ((lpDrop = (LPDROPFILES)GlobalLock(hMem)) != NULL)
{
if (lpDrop->fWide)
{
LPCWSTR pszFileNameW = (LPCWSTR)((LPBYTE)lpDrop + lpDrop->pFiles);
while (*pszFileNameW != L'\0')
{
USES_CONVERSION;
if (FAILED(AddUrlFileContents(W2CT(pszFileNameW))))
break;
hrPasteResult = S_OK;
pszFileNameW += wcslen(pszFileNameW) + 1;
}
}
else
{
LPCSTR pszFileNameA = (LPCSTR)((LPBYTE)lpDrop + lpDrop->pFiles);
while (*pszFileNameA != '\0')
{
USES_CONVERSION;
if (FAILED(AddUrlFileContents(A2CT(pszFileNameA))))
break;
hrPasteResult = S_OK;
pszFileNameA += strlen(pszFileNameA) + 1;
}
}
GlobalUnlock(hMem);
}
GlobalFree(hMem);
}
return hrPasteResult;
}
bool CMainFrameDropTarget::IsSupportedDropData(COleDataObject* pDataObject)
{
BOOL bResult;
//************************************************************************
//*** THIS FUNCTION HAS TO BE AS FAST AS POSSIBLE!!!
//************************************************************************
if (m_cfHTML && pDataObject->IsDataAvailable(m_cfHTML))
{
// If the data is in 'HTML Format', there is no need to check the contents.
bResult = TRUE;
}
else if (m_cfShellURL && pDataObject->IsDataAvailable(m_cfShellURL))
{
// If the data is in 'UniformResourceLocator', there is no need to check the contents.
bResult = TRUE;
}
else if (pDataObject->IsDataAvailable(CF_TEXT))
{
//
// Check text data
//
bResult = FALSE;
HANDLE hMem;
if ((hMem = pDataObject->GetGlobalData(CF_TEXT)) != NULL)
{
LPCSTR lpszUrl;
if ((lpszUrl = (LPCSTR)GlobalLock(hMem)) != NULL)
{
// skip white space
while (isspace(*lpszUrl))
lpszUrl++;
bResult = IsUrlSchemeSupportedA(lpszUrl);
GlobalUnlock(hMem);
}
GlobalFree(hMem);
}
}
else if (pDataObject->IsDataAvailable(CF_HDROP))
{
//
// Check HDROP data
//
bResult = FALSE;
HANDLE hMem;
if ((hMem = pDataObject->GetGlobalData(CF_HDROP)) != NULL)
{
LPDROPFILES lpDrop;
if ((lpDrop = (LPDROPFILES)GlobalLock(hMem)) != NULL)
{
// Just check, if there's at least one file we can import
if (lpDrop->fWide)
{
LPCWSTR pszFileW = (LPCWSTR)((LPBYTE)lpDrop + lpDrop->pFiles);
while (*pszFileW != L'\0')
{
int iLen = wcslen(pszFileW);
LPCWSTR pszExtW = GetFileExtW(pszFileW, iLen);
if (pszExtW != NULL && wcsicmp(pszExtW, FILEEXTDOT_INETSHRTCUTW) == 0)
{
bResult = TRUE;
break;
}
pszFileW += iLen + 1;
}
}
else
{
LPCSTR pszFileA = (LPCSTR)((LPBYTE)lpDrop + lpDrop->pFiles);
while (*pszFileA != '\0')
{
int iLen = strlen(pszFileA);
LPCSTR pszExtA = GetFileExtA(pszFileA, iLen);
if (pszExtA != NULL && stricmp(pszExtA, FILEEXTDOT_INETSHRTCUTA) == 0)
{
bResult = TRUE;
break;
}
pszFileA += iLen + 1;
}
}
GlobalUnlock(hMem);
}
GlobalFree(hMem);
}
}
else
{
// Unknown data format
bResult = FALSE;
}
return bResult;
}
DROPEFFECT CMainFrameDropTarget::OnDragEnter(CWnd*, COleDataObject* pDataObject, DWORD, CPoint)
{
m_bDropDataValid = IsSupportedDropData(pDataObject);
return m_bDropDataValid ? DROPEFFECT_COPY : DROPEFFECT_NONE;
}
DROPEFFECT CMainFrameDropTarget::OnDragOver(CWnd*, COleDataObject*, DWORD, CPoint)
{
return m_bDropDataValid ? DROPEFFECT_COPY : DROPEFFECT_NONE;
}
BOOL CMainFrameDropTarget::OnDrop(CWnd*, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
{
BOOL bResult = FALSE;
if (m_bDropDataValid)
{
if (m_cfHTML && pDataObject->IsDataAvailable(m_cfHTML))
{
PasteHTML(*pDataObject);
}
else if (m_cfShellURL && pDataObject->IsDataAvailable(m_cfShellURL))
{
PasteText(m_cfShellURL, *pDataObject);
}
else if (pDataObject->IsDataAvailable(CF_TEXT))
{
PasteText(CF_TEXT, *pDataObject);
}
else if (pDataObject->IsDataAvailable(CF_HDROP))
{
return PasteHDROP(*pDataObject);
}
bResult = TRUE;
}
return bResult;
}
void CMainFrameDropTarget::OnDragLeave(CWnd*)
{
// Do *NOT* set 'm_bDropDataValid=FALSE'!
// 'OnDragLeave' may be called from MFC when scrolling! In that case it's
// not really a "leave".
//m_bDropDataValid = FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -