- all: intitial offscreen drawing support (mostly for printing). Unfortunately, video output cannot be printed at this stage, and to support it, interfacing with a video filter such as the 'snapshot' filter is required to do a still capture.

This commit is contained in:
Damien Fouilleul 2005-04-06 11:23:52 +00:00
parent f6a33c0d24
commit b9057a61e7
5 changed files with 186 additions and 17 deletions

View File

@ -32,6 +32,8 @@ SOURCES_activex = \
connectioncontainer.h \
objectsafety.cpp \
objectsafety.h \
viewobject.cpp \
viewobject.h \
vlccontrol.cpp \
vlccontrol.h \
plugin.cpp \

View File

@ -33,6 +33,7 @@
#include "connectioncontainer.h"
#include "objectsafety.h"
#include "vlccontrol.h"
#include "viewobject.h"
#include "utils.h"
@ -81,8 +82,10 @@ static LRESULT CALLBACK VLCVideoClassWndProc(HWND hWnd, UINT uMsg, WPARAM wParam
RECT pr;
if( GetUpdateRect(hWnd, &pr, FALSE) )
{
RECT bounds;
GetClientRect(hWnd, &bounds);
BeginPaint(hWnd, &ps);
p_instance->onPaint(ps, pr);
p_instance->onPaint(ps.hdc, bounds, pr);
EndPaint(hWnd, &ps);
}
return 0L;
@ -246,6 +249,7 @@ VLCPlugin::VLCPlugin(VLCPluginClass *p_class) :
vlcConnectionPointContainer = new VLCConnectionPointContainer(this);
vlcObjectSafety = new VLCObjectSafety(this);
vlcControl = new VLCControl(this);
vlcViewObject = new VLCViewObject(this);
};
VLCPlugin::~VLCPlugin()
@ -253,6 +257,7 @@ VLCPlugin::~VLCPlugin()
vlcOleInPlaceObject->UIDeactivate();
vlcOleInPlaceObject->InPlaceDeactivate();
delete vlcViewObject;
delete vlcControl;
delete vlcObjectSafety;
delete vlcConnectionPointContainer;
@ -372,6 +377,12 @@ STDMETHODIMP VLCPlugin::QueryInterface(REFIID riid, void **ppv)
*ppv = reinterpret_cast<LPVOID>(vlcControl);
return NOERROR;
}
else if( IID_IViewObject == riid )
{
AddRef();
*ppv = reinterpret_cast<LPVOID>(vlcViewObject);
return NOERROR;
}
*ppv = NULL;
@ -702,19 +713,19 @@ BOOL VLCPlugin::hasFocus(void)
return GetActiveWindow() == _inplacewnd;
};
void VLCPlugin::onPaint(PAINTSTRUCT &ps, RECT &pr)
void VLCPlugin::onPaint(HDC hdc, const RECT &bounds, const RECT &pr)
{
/*
** if VLC is playing, it may not display any VIDEO content
** hence, draw control logo
*/
int width = _bounds.right-_bounds.left;
int height = _bounds.bottom-_bounds.top;
int width = bounds.right-bounds.left;
int height = bounds.bottom-bounds.top;
HBITMAP pict = _p_class->getInPlacePict();
if( NULL != pict )
{
HDC hdcPict = CreateCompatibleDC(ps.hdc);
HDC hdcPict = CreateCompatibleDC(hdc);
if( NULL != hdcPict )
{
BITMAP bm;
@ -728,26 +739,26 @@ void VLCPlugin::onPaint(PAINTSTRUCT &ps, RECT &pr)
if( dstHeight > height-4 )
dstHeight = height-4;
int dstX = (width-dstWidth)/2;
int dstY = (height-dstHeight)/2;
int dstX = bounds.left+(width-dstWidth)/2;
int dstY = bounds.top+(height-dstHeight)/2;
SelectObject(hdcPict, pict);
StretchBlt(ps.hdc, dstX, dstY, dstWidth, dstHeight,
StretchBlt(hdc, dstX, dstY, dstWidth, dstHeight,
hdcPict, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
DeleteDC(hdcPict);
ExcludeClipRect(ps.hdc, dstX, dstY, dstWidth+dstX, dstHeight+dstY);
ExcludeClipRect(hdc, dstX, dstY, dstWidth+dstX, dstHeight+dstY);
}
}
}
FillRect(ps.hdc, &pr, (HBRUSH)GetStockObject(WHITE_BRUSH));
SelectObject(ps.hdc, GetStockObject(BLACK_BRUSH));
FillRect(hdc, &pr, (HBRUSH)GetStockObject(WHITE_BRUSH));
SelectObject(hdc, GetStockObject(BLACK_BRUSH));
MoveToEx(ps.hdc, 0, 0, NULL);
LineTo(ps.hdc, width-1, 0);
LineTo(ps.hdc, width-1, height-1);
LineTo(ps.hdc, 0, height-1);
LineTo(ps.hdc, 0, 0);
MoveToEx(hdc, bounds.left, bounds.top, NULL);
LineTo(hdc, bounds.left+width-1, bounds.top);
LineTo(hdc, bounds.left+width-1, bounds.top+height-1);
LineTo(hdc, bounds.left, bounds.top+height-1);
LineTo(hdc, bounds.left, bounds.top);
};
void VLCPlugin::onPositionChange(LPCRECT lprcPosRect, LPCRECT lprcClipRect)

View File

@ -118,7 +118,7 @@ public:
// container events
void onPositionChange(LPCRECT lprcPosRect, LPCRECT lprcClipRect);
void onPaint(PAINTSTRUCT &ps, RECT &pr);
void onPaint(HDC hdc, const RECT &bounds, const RECT &pr);
// control events
void firePropChangedEvent(DISPID dispid);
@ -146,6 +146,7 @@ private:
class VLCConnectionPointContainer *vlcConnectionPointContainer;
class VLCObjectSafety *vlcObjectSafety;
class VLCControl *vlcControl;
class VLCViewObject *vlcViewObject;
// in place activated window (Clipping window)
HWND _inplacewnd;

88
activex/viewobject.cpp Normal file
View File

@ -0,0 +1,88 @@
/*****************************************************************************
* 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#include "plugin.h"
#include "viewobject.h"
#include <iostream>
using namespace std;
STDMETHODIMP VLCViewObject::Draw(DWORD dwAspect, LONG lindex, PVOID pvAspect,
DVTARGETDEVICE *ptd, HDC hicTargetDev, HDC hdcDraw, LPCRECTL lprcBounds,
LPCRECTL lprcWBounds, BOOL(CALLBACK *pfnContinue)(DWORD), DWORD dwContinue)
{
switch( dwAspect )
{
case DVASPECT_CONTENT:
if( _p_instance->getVisible() )
{
RECT bounds;
bounds.left = lprcBounds->left;
bounds.top = lprcBounds->top;
bounds.right = lprcBounds->right;
bounds.bottom = lprcBounds->bottom;
_p_instance->onPaint(hdcDraw, bounds, bounds);
}
return S_OK;
case DVASPECT_THUMBNAIL:
break;
case DVASPECT_ICON:
break;
case DVASPECT_DOCPRINT:
break;
}
return E_NOTIMPL;
};
STDMETHODIMP VLCViewObject::Freeze(DWORD dwAspect, LONG lindex,
PVOID pvAspect, LPDWORD pdwFreeze)
{
if( NULL != pvAspect )
return E_INVALIDARG;
return OLE_E_BLANK;
};
STDMETHODIMP VLCViewObject::GetAdvise(LPDWORD pdwAspect, LPDWORD padvf,
LPADVISESINK *ppAdviseSink)
{
return E_NOTIMPL;
};
STDMETHODIMP VLCViewObject::GetColorSet(DWORD dwAspect, LONG lindex,
PVOID pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LPLOGPALETTE *ppColorSet)
{
return E_NOTIMPL;
};
STDMETHODIMP VLCViewObject::SetAdvise(DWORD dwAspect, DWORD advf,
LPADVISESINK pAdvSink)
{
return OLE_E_ADVISENOTSUPPORTED;
};
STDMETHODIMP VLCViewObject::Unfreeze(DWORD dwFreeze)
{
return E_NOTIMPL;
};

67
activex/viewobject.h Normal file
View File

@ -0,0 +1,67 @@
/*****************************************************************************
* persiststorage.h: 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#ifndef __VIEWOBJECT_H__
#define __VIEWOBJECT_H__
#include <oleidl.h>
class VLCViewObject : public IViewObject
{
public:
VLCViewObject(VLCPlugin *p_instance) : _p_instance(p_instance) {};
virtual ~VLCViewObject() {};
// IUnknown methods
STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
{
if( (NULL != ppv)
&& (IID_IUnknown == riid)
&& (IID_IPersist == riid)
&& (IID_IViewObject == riid) ) {
AddRef();
*ppv = reinterpret_cast<LPVOID>(this);
return NOERROR;
}
return _p_instance->QueryInterface(riid, ppv);
};
STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };
STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };
// IViewObject methods
STDMETHODIMP Draw(DWORD,LONG,PVOID,DVTARGETDEVICE*,HDC,HDC,LPCRECTL,LPCRECTL,BOOL(CALLBACK *)(DWORD),DWORD);
STDMETHODIMP Freeze(DWORD,LONG,PVOID,LPDWORD);
STDMETHODIMP GetAdvise(LPDWORD,LPDWORD,LPADVISESINK *);
STDMETHODIMP GetColorSet(DWORD,LONG,PVOID,DVTARGETDEVICE *,HDC,LPLOGPALETTE *);
STDMETHODIMP SetAdvise(DWORD,DWORD,LPADVISESINK);
STDMETHODIMP Unfreeze(DWORD);
private:
VLCPlugin *_p_instance;
};
#endif