TEXTOUT.H

//==========================================================================; 
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright (c) 1992 - 1997 Microsoft Corporation. All Rights Reserved.
//
//--------------------------------------------------------------------------;

// You MUST change this when adapting this sample!
// Run uuidgen.exe from any SDK to get a new GUID

DEFINE_GUID(CLSID_PlainText,
0x48025242, 0x2d39, 0x11ce, 0x87, 0x5d, 0x0, 0x60, 0x8c, 0xb7, 0x80, 0x66);

class CTextOutFilter;
class CTextOutWindow;

// These are our video window styles

const LPTSTR TextClassName = TEXT("TextRendererBaseClass");
const DWORD TextClassStyles = (CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNCLIENT);
const DWORD TextWindowStyles = (WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN);

// Derived class handling window interactions. We did have the main renderer
// object inheriting from CBaseControlWindow so that we didn't have to have
// a separate class but that means there are two many classes derived from
// CUnknown, so when in the final text out filter class you call something
// like GetOwner it gets really confusing to know who is actually going to
// be called. So in the end we made it a separate class for the window. We
// have to specialise the base class to provide the PURE virtual method that
// returns the class and window information (GetClassWindowStyles). We are
// also interested in certain window messages like WM_PAINT and WM_NCHITTEST

class CTextOutWindow : public CBaseControlWindow
{
CTextOutFilter *m_pRenderer;

public:

CTextOutWindow(TCHAR *pName, // Object description
LPUNKNOWN pUnk, // Normal COM ownership
HRESULT *phr, // OLE failure code
CCritSec *pLock, // Our interface Lock
CTextOutFilter *pRenderer); // Delegates locking to

~CTextOutWindow();
BOOL OnClose();

LRESULT OnReceiveMessage(HWND hwnd, // Window handle
UINT uMsg, // Message ID
WPARAM wParam, // First parameter
LPARAM lParam); // Other parameter

LPTSTR GetClassWindowStyles(DWORD *pClassStyles,
DWORD *pWindowStyles,
DWORD *pWindowStylesEx);

}; // CTextOutWindow

// Overall filter object for the text renderer. We have to provide our own
// version of NonDelegatingQueryInterface so that we can expose not only the
// interfaces supported by the base renderer but also pass on queries for
// IVideoWindow to our window handling class (m_TextWindow). The rest of the
// methods we override are pretty dull, dealing with type checking and so on

class CTextOutFilter : public CBaseRenderer
{
CTextOutWindow m_TextWindow;

public:

static CUnknown * WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *phr);

CTextOutFilter(LPUNKNOWN pUnk,HRESULT *phr);
~CTextOutFilter();
STDMETHODIMP NonDelegatingQueryInterface(REFIID, void **);

STDMETHODIMP Pause();
HRESULT BreakConnect();
HRESULT CheckMediaType(const CMediaType *pmt);
BOOL OnPaint(COLORREF WindowColour);
HRESULT DoRenderSample(IMediaSample *pMediaSample);
void OnReceiveFirstSample(IMediaSample *pMediaSample);
void DrawText(IMediaSample *pMediaSample);

}; // CTextOutFilter