⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataobject.cpp

📁 VLC Player Source Code
💻 CPP
字号:
/***************************************************************************** * viewobject.cpp: ActiveX control for VLC ***************************************************************************** * Copyright (C) 2005 VideoLAN * * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/#include "plugin.h"#include "dataobject.h"#include "utils.h"using namespace std;////////////////////////////////////////////////////////////////////////////////////////////////static const FORMATETC _metaFileFormatEtc =    {        CF_METAFILEPICT,        NULL,        DVASPECT_CONTENT,        -1,        TYMED_MFPICT,    };static const FORMATETC _enhMetaFileFormatEtc =    {        CF_ENHMETAFILE,        NULL,        DVASPECT_CONTENT,        -1,        TYMED_ENHMF,    };class VLCEnumFORMATETC : public VLCEnumIterator<IID_IEnumFORMATETC,    IEnumFORMATETC,    FORMATETC,    vector<FORMATETC>::iterator>{public:    VLCEnumFORMATETC(vector<FORMATETC> v) :        VLCEnumIterator<IID_IEnumFORMATETC,        IEnumFORMATETC,        FORMATETC,        vector<FORMATETC>::iterator>(v.begin(), v.end())    {};};////////////////////////////////////////////////////////////////////////////////////////////////VLCDataObject::VLCDataObject(VLCPlugin *p_instance) : _p_instance(p_instance){    _v_formatEtc.push_back(_enhMetaFileFormatEtc);    _v_formatEtc.push_back(_metaFileFormatEtc);    CreateDataAdviseHolder(&_p_adviseHolder);};VLCDataObject::~VLCDataObject(){    _p_adviseHolder->Release();};////////////////////////////////////////////////////////////////////////////////////////////////STDMETHODIMP VLCDataObject::DAdvise(LPFORMATETC pFormatEtc, DWORD padvf, LPADVISESINK pAdviseSink, LPDWORD pdwConnection){    return _p_adviseHolder->Advise(this,            pFormatEtc, padvf,pAdviseSink, pdwConnection);};STDMETHODIMP VLCDataObject::DUnadvise(DWORD dwConnection){    return _p_adviseHolder->Unadvise(dwConnection);};STDMETHODIMP VLCDataObject::EnumDAdvise(IEnumSTATDATA **ppenumAdvise){    return _p_adviseHolder->EnumAdvise(ppenumAdvise);};STDMETHODIMP VLCDataObject::EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppEnum){    if( NULL == ppEnum )        return E_POINTER;    *ppEnum = dynamic_cast<IEnumFORMATETC *>(new VLCEnumFORMATETC(_v_formatEtc));    return (NULL != *ppEnum ) ? S_OK : E_OUTOFMEMORY;};STDMETHODIMP VLCDataObject::GetCanonicalFormatEtc(LPFORMATETC pFormatEtcIn, LPFORMATETC pFormatEtcOut){    HRESULT result = QueryGetData(pFormatEtcIn);    if( FAILED(result) )        return result;    if( NULL == pFormatEtcOut )        return E_POINTER;    *pFormatEtcOut = *pFormatEtcIn;    pFormatEtcOut->ptd = NULL;    return DATA_S_SAMEFORMATETC;};STDMETHODIMP VLCDataObject::GetData(LPFORMATETC pFormatEtc, LPSTGMEDIUM pMedium){    if( NULL == pMedium )        return E_POINTER;    HRESULT result = QueryGetData(pFormatEtc);    if( SUCCEEDED(result) )    {        switch( pFormatEtc->cfFormat )        {            case CF_METAFILEPICT:                pMedium->tymed = TYMED_MFPICT;                pMedium->hMetaFilePict = NULL;                pMedium->pUnkForRelease = NULL;                result = getMetaFileData(pFormatEtc, pMedium);                break;            case CF_ENHMETAFILE:                pMedium->tymed = TYMED_ENHMF;                pMedium->hEnhMetaFile = NULL;                pMedium->pUnkForRelease = NULL;                result = getEnhMetaFileData(pFormatEtc, pMedium);                break;            default:                result = DV_E_FORMATETC;        }    }    return result;};STDMETHODIMP VLCDataObject::GetDataHere(LPFORMATETC pFormatEtc, LPSTGMEDIUM pMedium){    if( NULL == pMedium )        return E_POINTER;    return E_NOTIMPL;}////////////////////////////////////////////////////////////////////////////////////////////////HRESULT VLCDataObject::getMetaFileData(LPFORMATETC pFormatEtc, LPSTGMEDIUM pMedium){    HDC hicTargetDev = CreateDevDC(pFormatEtc->ptd);    if( NULL == hicTargetDev )        return E_FAIL;    HDC hdcMeta = CreateMetaFile(NULL);    if( NULL != hdcMeta )    {        LPMETAFILEPICT pMetaFilePict = (LPMETAFILEPICT)CoTaskMemAlloc(sizeof(METAFILEPICT));        if( NULL != pMetaFilePict )        {            SIZEL size = _p_instance->getExtent();            RECTL wBounds = { 0L, 0L, size.cx, size.cy };            pMetaFilePict->mm   = MM_ANISOTROPIC;            pMetaFilePict->xExt = size.cx;            pMetaFilePict->yExt = size.cy;            DPFromHimetric(hicTargetDev, (LPPOINT)&size, 1);            SetMapMode(hdcMeta, MM_ANISOTROPIC);            SetWindowExtEx(hdcMeta, size.cx, size.cy, NULL);            RECTL bounds = { 0L, 0L, size.cx, size.cy };            _p_instance->onDraw(pFormatEtc->ptd, hicTargetDev, hdcMeta, &bounds, &wBounds);            pMetaFilePict->hMF = CloseMetaFile(hdcMeta);            if( NULL != pMetaFilePict->hMF )                pMedium->hMetaFilePict = pMetaFilePict;            else                CoTaskMemFree(pMetaFilePict);        }    }    DeleteDC(hicTargetDev);    return (NULL != pMedium->hMetaFilePict) ? S_OK : E_FAIL;};HRESULT VLCDataObject::getEnhMetaFileData(LPFORMATETC pFormatEtc, LPSTGMEDIUM pMedium){    HDC hicTargetDev = CreateDevDC(pFormatEtc->ptd);    if( NULL == hicTargetDev )        return E_FAIL;    SIZEL size = _p_instance->getExtent();    HDC hdcMeta = CreateEnhMetaFile(hicTargetDev, NULL, NULL, NULL);    if( NULL != hdcMeta )    {        RECTL wBounds = { 0L, 0L, size.cx, size.cy };        DPFromHimetric(hicTargetDev, (LPPOINT)&size, 1);        RECTL bounds = { 0L, 0L, size.cx, size.cy };        _p_instance->onDraw(pFormatEtc->ptd, hicTargetDev, hdcMeta, &bounds, &wBounds);        pMedium->hEnhMetaFile = CloseEnhMetaFile(hdcMeta);    }    DeleteDC(hicTargetDev);    return (NULL != pMedium->hEnhMetaFile) ? S_OK : E_FAIL;};STDMETHODIMP VLCDataObject::QueryGetData(LPFORMATETC pFormatEtc){    if( NULL == pFormatEtc )        return E_POINTER;    const FORMATETC *formatEtc;    switch( pFormatEtc->cfFormat )    {        case CF_METAFILEPICT:            formatEtc = &_metaFileFormatEtc;            break;        case CF_ENHMETAFILE:            formatEtc = &_enhMetaFileFormatEtc;            break;        default:            return DV_E_FORMATETC;    }     if( pFormatEtc->dwAspect != formatEtc->dwAspect )        return DV_E_DVASPECT;    if( pFormatEtc->lindex != formatEtc->lindex )        return DV_E_LINDEX;    if( pFormatEtc->tymed != formatEtc->tymed )        return DV_E_TYMED;    return S_OK;};STDMETHODIMP VLCDataObject::SetData(LPFORMATETC pFormatEtc, LPSTGMEDIUM pMedium, BOOL fRelease){    return E_NOTIMPL;};/*void VLCDataObject::onDataChange(void){    _p_adviseHolder->SendOnDataChange(this, 0, 0);};*/void VLCDataObject::onClose(void){    _p_adviseHolder->SendOnDataChange(this, 0, ADVF_DATAONSTOP);    if( S_OK == OleIsCurrentClipboard(dynamic_cast<LPDATAOBJECT>(this)) )        OleFlushClipboard();};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -