| //------------------------------------------------------------------------------ | |
| // File: WinCtrl.h | |
| // | |
| // Desc: DirectShow base classes - defines classes for video control | |
| // interfaces. | |
| // | |
| // Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. | |
| //------------------------------------------------------------------------------ | |
| #ifndef __WINCTRL__ | |
| #define __WINCTRL__ | |
| #define ABSOL(x) (x < 0 ? -x : x) | |
| #define NEGAT(x) (x > 0 ? -x : x) | |
| // Helper | |
| BOOL WINAPI PossiblyEatMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); | |
| class CBaseControlWindow : public CBaseVideoWindow, public CBaseWindow | |
| { | |
| protected: | |
| CBaseFilter *m_pFilter; // Pointer to owning media filter | |
| CBasePin *m_pPin; // Controls media types for connection | |
| CCritSec *m_pInterfaceLock; // Externally defined critical section | |
| COLORREF m_BorderColour; // Current window border colour | |
| BOOL m_bAutoShow; // What happens when the state changes | |
| HWND m_hwndOwner; // Owner window that we optionally have | |
| HWND m_hwndDrain; // HWND to post any messages received | |
| BOOL m_bCursorHidden; // Should we hide the window cursor | |
| public: | |
| // Internal methods for other objects to get information out | |
| HRESULT DoSetWindowStyle(long Style,long WindowLong); | |
| HRESULT DoGetWindowStyle(__out long *pStyle,long WindowLong); | |
| BOOL IsAutoShowEnabled() { return m_bAutoShow; }; | |
| COLORREF GetBorderColour() { return m_BorderColour; }; | |
| HWND GetOwnerWindow() { return m_hwndOwner; }; | |
| BOOL IsCursorHidden() { return m_bCursorHidden; }; | |
| inline BOOL PossiblyEatMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) | |
| { | |
| return ::PossiblyEatMessage(m_hwndDrain, uMsg, wParam, lParam); | |
| } | |
| // Derived classes must call this to set the pin the filter is using | |
| // We don't have the pin passed in to the constructor (as we do with | |
| // the CBaseFilter object) because filters typically create the | |
| // pins dynamically when requested in CBaseFilter::GetPin. This can | |
| // not be called from our constructor because is is a virtual method | |
| void SetControlWindowPin(CBasePin *pPin) { | |
| m_pPin = pPin; | |
| } | |
| public: | |
| CBaseControlWindow(__inout CBaseFilter *pFilter, // Owning media filter | |
| __in CCritSec *pInterfaceLock, // Locking object | |
| __in_opt LPCTSTR pName, // Object description | |
| __inout_opt LPUNKNOWN pUnk, // Normal COM ownership | |
| __inout HRESULT *phr); // OLE return code | |
| // These are the properties we support | |
| STDMETHODIMP put_Caption(__in BSTR strCaption); | |
| STDMETHODIMP get_Caption(__out BSTR *pstrCaption); | |
| STDMETHODIMP put_AutoShow(long AutoShow); | |
| STDMETHODIMP get_AutoShow(__out long *AutoShow); | |
| STDMETHODIMP put_WindowStyle(long WindowStyle); | |
| STDMETHODIMP get_WindowStyle(__out long *pWindowStyle); | |
| STDMETHODIMP put_WindowStyleEx(long WindowStyleEx); | |
| STDMETHODIMP get_WindowStyleEx(__out long *pWindowStyleEx); | |
| STDMETHODIMP put_WindowState(long WindowState); | |
| STDMETHODIMP get_WindowState(__out long *pWindowState); | |
| STDMETHODIMP put_BackgroundPalette(long BackgroundPalette); | |
| STDMETHODIMP get_BackgroundPalette(__out long *pBackgroundPalette); | |
| STDMETHODIMP put_Visible(long Visible); | |
| STDMETHODIMP get_Visible(__out long *pVisible); | |
| STDMETHODIMP put_Left(long Left); | |
| STDMETHODIMP get_Left(__out long *pLeft); | |
| STDMETHODIMP put_Width(long Width); | |
| STDMETHODIMP get_Width(__out long *pWidth); | |
| STDMETHODIMP put_Top(long Top); | |
| STDMETHODIMP get_Top(__out long *pTop); | |
| STDMETHODIMP put_Height(long Height); | |
| STDMETHODIMP get_Height(__out long *pHeight); | |
| STDMETHODIMP put_Owner(OAHWND Owner); | |
| STDMETHODIMP get_Owner(__out OAHWND *Owner); | |
| STDMETHODIMP put_MessageDrain(OAHWND Drain); | |
| STDMETHODIMP get_MessageDrain(__out OAHWND *Drain); | |
| STDMETHODIMP get_BorderColor(__out long *Color); | |
| STDMETHODIMP put_BorderColor(long Color); | |
| STDMETHODIMP get_FullScreenMode(__out long *FullScreenMode); | |
| STDMETHODIMP put_FullScreenMode(long FullScreenMode); | |
| // And these are the methods | |
| STDMETHODIMP SetWindowForeground(long Focus); | |
| STDMETHODIMP NotifyOwnerMessage(OAHWND hwnd,long uMsg,LONG_PTR wParam,LONG_PTR lParam); | |
| STDMETHODIMP GetMinIdealImageSize(__out long *pWidth,__out long *pHeight); | |
| STDMETHODIMP GetMaxIdealImageSize(__out long *pWidth,__out long *pHeight); | |
| STDMETHODIMP SetWindowPosition(long Left,long Top,long Width,long Height); | |
| STDMETHODIMP GetWindowPosition(__out long *pLeft,__out long *pTop,__out long *pWidth,__out long *pHeight); | |
| STDMETHODIMP GetRestorePosition(__out long *pLeft,__out long *pTop,__out long *pWidth,__out long *pHeight); | |
| STDMETHODIMP HideCursor(long HideCursor); | |
| STDMETHODIMP IsCursorHidden(__out long *CursorHidden); | |
| }; | |
| // This class implements the IBasicVideo interface | |
| class CBaseControlVideo : public CBaseBasicVideo | |
| { | |
| protected: | |
| CBaseFilter *m_pFilter; // Pointer to owning media filter | |
| CBasePin *m_pPin; // Controls media types for connection | |
| CCritSec *m_pInterfaceLock; // Externally defined critical section | |
| public: | |
| // Derived classes must provide these for the implementation | |
| virtual HRESULT IsDefaultTargetRect() PURE; | |
| virtual HRESULT SetDefaultTargetRect() PURE; | |
| virtual HRESULT SetTargetRect(RECT *pTargetRect) PURE; | |
| virtual HRESULT GetTargetRect(RECT *pTargetRect) PURE; | |
| virtual HRESULT IsDefaultSourceRect() PURE; | |
| virtual HRESULT SetDefaultSourceRect() PURE; | |
| virtual HRESULT SetSourceRect(RECT *pSourceRect) PURE; | |
| virtual HRESULT GetSourceRect(RECT *pSourceRect) PURE; | |
| virtual HRESULT GetStaticImage(__inout long *pBufferSize,__out_bcount_part(*pBufferSize, *pBufferSize) long *pDIBImage) PURE; | |
| // Derived classes must override this to return a VIDEOINFO representing | |
| // the video format. We cannot call IPin ConnectionMediaType to get this | |
| // format because various filters dynamically change the type when using | |
| // DirectDraw such that the format shows the position of the logical | |
| // bitmap in a frame buffer surface, so the size might be returned as | |
| // 1024x768 pixels instead of 320x240 which is the real video dimensions | |
| __out virtual VIDEOINFOHEADER *GetVideoFormat() PURE; | |
| // Helper functions for creating memory renderings of a DIB image | |
| HRESULT GetImageSize(__in VIDEOINFOHEADER *pVideoInfo, | |
| __out LONG *pBufferSize, | |
| __in RECT *pSourceRect); | |
| HRESULT CopyImage(IMediaSample *pMediaSample, | |
| __in VIDEOINFOHEADER *pVideoInfo, | |
| __inout LONG *pBufferSize, | |
| __out_bcount_part(*pBufferSize, *pBufferSize) BYTE *pVideoImage, | |
| __in RECT *pSourceRect); | |
| // Override this if you want notifying when the rectangles change | |
| virtual HRESULT OnUpdateRectangles() { return NOERROR; }; | |
| virtual HRESULT OnVideoSizeChange(); | |
| // Derived classes must call this to set the pin the filter is using | |
| // We don't have the pin passed in to the constructor (as we do with | |
| // the CBaseFilter object) because filters typically create the | |
| // pins dynamically when requested in CBaseFilter::GetPin. This can | |
| // not be called from our constructor because is is a virtual method | |
| void SetControlVideoPin(__inout CBasePin *pPin) { | |
| m_pPin = pPin; | |
| } | |
| // Helper methods for checking rectangles | |
| virtual HRESULT CheckSourceRect(__in RECT *pSourceRect); | |
| virtual HRESULT CheckTargetRect(__in RECT *pTargetRect); | |
| public: | |
| CBaseControlVideo(__inout CBaseFilter *pFilter, // Owning media filter | |
| __in CCritSec *pInterfaceLock, // Serialise interface | |
| __in_opt LPCTSTR pName, // Object description | |
| __inout_opt LPUNKNOWN pUnk, // Normal COM ownership | |
| __inout HRESULT *phr); // OLE return code | |
| // These are the properties we support | |
| STDMETHODIMP get_AvgTimePerFrame(__out REFTIME *pAvgTimePerFrame); | |
| STDMETHODIMP get_BitRate(__out long *pBitRate); | |
| STDMETHODIMP get_BitErrorRate(__out long *pBitErrorRate); | |
| STDMETHODIMP get_VideoWidth(__out long *pVideoWidth); | |
| STDMETHODIMP get_VideoHeight(__out long *pVideoHeight); | |
| STDMETHODIMP put_SourceLeft(long SourceLeft); | |
| STDMETHODIMP get_SourceLeft(__out long *pSourceLeft); | |
| STDMETHODIMP put_SourceWidth(long SourceWidth); | |
| STDMETHODIMP get_SourceWidth(__out long *pSourceWidth); | |
| STDMETHODIMP put_SourceTop(long SourceTop); | |
| STDMETHODIMP get_SourceTop(__out long *pSourceTop); | |
| STDMETHODIMP put_SourceHeight(long SourceHeight); | |
| STDMETHODIMP get_SourceHeight(__out long *pSourceHeight); | |
| STDMETHODIMP put_DestinationLeft(long DestinationLeft); | |
| STDMETHODIMP get_DestinationLeft(__out long *pDestinationLeft); | |
| STDMETHODIMP put_DestinationWidth(long DestinationWidth); | |
| STDMETHODIMP get_DestinationWidth(__out long *pDestinationWidth); | |
| STDMETHODIMP put_DestinationTop(long DestinationTop); | |
| STDMETHODIMP get_DestinationTop(__out long *pDestinationTop); | |
| STDMETHODIMP put_DestinationHeight(long DestinationHeight); | |
| STDMETHODIMP get_DestinationHeight(__out long *pDestinationHeight); | |
| // And these are the methods | |
| STDMETHODIMP GetVideoSize(__out long *pWidth,__out long *pHeight); | |
| STDMETHODIMP SetSourcePosition(long Left,long Top,long Width,long Height); | |
| STDMETHODIMP GetSourcePosition(__out long *pLeft,__out long *pTop,__out long *pWidth,__out long *pHeight); | |
| STDMETHODIMP GetVideoPaletteEntries(long StartIndex,long Entries,__out long *pRetrieved,__out_ecount_part(Entries, *pRetrieved) long *pPalette); | |
| STDMETHODIMP SetDefaultSourcePosition(); | |
| STDMETHODIMP IsUsingDefaultSource(); | |
| STDMETHODIMP SetDestinationPosition(long Left,long Top,long Width,long Height); | |
| STDMETHODIMP GetDestinationPosition(__out long *pLeft,__out long *pTop,__out long *pWidth,__out long *pHeight); | |
| STDMETHODIMP SetDefaultDestinationPosition(); | |
| STDMETHODIMP IsUsingDefaultDestination(); | |
| STDMETHODIMP GetCurrentImage(__inout long *pBufferSize,__out_bcount_part(*pBufferSize, *pBufferSize) long *pVideoImage); | |
| }; | |
| #endif // __WINCTRL__ | |