?? winutil.h
字號:
//------------------------------------------------------------------------------
// File: WinUtil.h
//
// Desc: DirectShow base classes - defines generic handler classes.
//
// Copyright (c) 1992-2002 Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
// Make sure that you call PrepareWindow to initialise the window after
// the object has been constructed. It is a separate method so that
// derived classes can override useful methods like MessageLoop. Also
// any derived class must call DoneWithWindow in its destructor. If it
// doesn't a message may be retrieved and call a derived class member
// function while a thread is executing the base class destructor code
#ifndef __WINUTIL__
#define __WINUTIL__
const int DEFWIDTH = 320; // Initial window width
const int DEFHEIGHT = 240; // Initial window height
const int CAPTION = 256; // Maximum length of caption
const int TIMELENGTH = 50; // Maximum length of times
const int PROFILESTR = 128; // Normal profile string
const WORD PALVERSION = 0x300; // GDI palette version
const LONG PALETTE_VERSION = (LONG) 1; // Initial palette version
const COLORREF VIDEO_COLOUR = 0; // Defaults to black background
const HANDLE hMEMORY = (HANDLE) (-1); // Says to open as memory file
#define WIDTH(x) ((*(x)).right - (*(x)).left)
#define HEIGHT(x) ((*(x)).bottom - (*(x)).top)
#define SHOWSTAGE TEXT("WM_SHOWSTAGE")
#define SHOWSTAGETOP TEXT("WM_SHOWSTAGETOP")
#define REALIZEPALETTE TEXT("WM_REALIZEPALETTE")
class AM_NOVTABLE CBaseWindow
{
protected:
HINSTANCE m_hInstance; // Global module instance handle
HWND m_hwnd; // Handle for our window
HDC m_hdc; // Device context for the window
LONG m_Width; // Client window width
LONG m_Height; // Client window height
BOOL m_bActivated; // Has the window been activated
LPTSTR m_pClassName; // Static string holding class name
DWORD m_ClassStyles; // Passed in to our constructor
DWORD m_WindowStyles; // Likewise the initial window styles
DWORD m_WindowStylesEx; // And the extended window styles
UINT m_ShowStageMessage; // Have the window shown with focus
UINT m_ShowStageTop; // Makes the window WS_EX_TOPMOST
UINT m_RealizePalette; // Makes us realize our new palette
HDC m_MemoryDC; // Used for fast BitBlt operations
HPALETTE m_hPalette; // Handle to any palette we may have
BYTE m_bNoRealize; // Don't realize palette now
BYTE m_bBackground; // Should we realise in background
BYTE m_bRealizing; // already realizing the palette
CCritSec m_WindowLock; // Serialise window object access
BOOL m_bDoGetDC; // Should this window get a DC
bool m_bDoPostToDestroy; // Use PostMessage to destroy
CCritSec m_PaletteLock; // This lock protects m_hPalette.
// It should be held anytime the
// program use the value of m_hPalette.
// Maps windows message procedure into C++ methods
friend LRESULT CALLBACK WndProc(HWND hwnd, // Window handle
UINT uMsg, // Message ID
WPARAM wParam, // First parameter
LPARAM lParam); // Other parameter
virtual LRESULT OnPaletteChange(HWND hwnd, UINT Message);
public:
CBaseWindow(BOOL bDoGetDC = TRUE, bool bPostToDestroy = false);
#ifdef DEBUG
virtual ~CBaseWindow();
#endif
virtual HRESULT DoneWithWindow();
virtual HRESULT PrepareWindow();
virtual HRESULT InactivateWindow();
virtual HRESULT ActivateWindow();
virtual BOOL OnSize(LONG Width, LONG Height);
virtual BOOL OnClose();
virtual RECT GetDefaultRect();
virtual HRESULT UninitialiseWindow();
virtual HRESULT InitialiseWindow(HWND hwnd);
HRESULT CompleteConnect();
HRESULT DoCreateWindow();
HRESULT PerformanceAlignWindow();
HRESULT DoShowWindow(LONG ShowCmd);
void PaintWindow(BOOL bErase);
void DoSetWindowForeground(BOOL bFocus);
virtual HRESULT SetPalette(HPALETTE hPalette);
void SetRealize(BOOL bRealize)
{
m_bNoRealize = !bRealize;
}
// Jump over to the window thread to set the current palette
HRESULT SetPalette();
void UnsetPalette(void);
virtual HRESULT DoRealisePalette(BOOL bForceBackground = FALSE);
void LockPaletteLock();
void UnlockPaletteLock();
virtual BOOL PossiblyEatMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{ return FALSE; };
// Access our window information
bool WindowExists();
LONG GetWindowWidth();
LONG GetWindowHeight();
HWND GetWindowHWND();
HDC GetMemoryHDC();
HDC GetWindowHDC();
#ifdef DEBUG
HPALETTE GetPalette();
#endif // DEBUG
// This is the window procedure the derived object should override
virtual LRESULT OnReceiveMessage(HWND hwnd, // Window handle
UINT uMsg, // Message ID
WPARAM wParam, // First parameter
LPARAM lParam); // Other parameter
// Must be overriden to return class and window styles
virtual LPTSTR GetClassWindowStyles(
DWORD *pClassStyles, // Class styles
DWORD *pWindowStyles, // Window styles
DWORD *pWindowStylesEx) PURE; // Extended styles
};
// This helper class is entirely subservient to the owning CBaseWindow object
// All this object does is to split out the actual drawing operation from the
// main object (because it was becoming too large). We have a number of entry
// points to set things like the draw device contexts, to implement the actual
// drawing and to set the destination rectangle in the client window. We have
// no critical section locking in this class because we are used exclusively
// by the owning window object which looks after serialising calls into us
// If you want to use this class make sure you call NotifyAllocator once the
// allocate has been agreed, also call NotifyMediaType with a pointer to a
// NON stack based CMediaType once that has been set (we keep a pointer to
// the original rather than taking a copy). When the palette changes call
// IncrementPaletteVersion (easiest thing to do is to also call this method
// in the SetMediaType method most filters implement). Finally before you
// start rendering anything call SetDrawContext so that we can get the HDCs
// for drawing from the CBaseWindow object we are given during construction
class CDrawImage
{
protected:
CBaseWindow *m_pBaseWindow; // Owning video window object
CRefTime m_StartSample; // Start time for the current sample
CRefTime m_EndSample; // And likewise it's end sample time
HDC m_hdc; // Main window device context
HDC m_MemoryDC; // Offscreen draw device context
RECT m_TargetRect; // Target destination rectangle
RECT m_SourceRect; // Source image rectangle
BOOL m_bStretch; // Do we have to stretch the images
BOOL m_bUsingImageAllocator; // Are the samples shared DIBSECTIONs
CMediaType *m_pMediaType; // Pointer to the current format
int m_perfidRenderTime; // Time taken to render an image
LONG m_PaletteVersion; // Current palette version cookie
// Draw the video images in the window
void SlowRender(IMediaSample *pMediaSample);
void FastRender(IMediaSample *pMediaSample);
void DisplaySampleTimes(IMediaSample *pSample);
void UpdateColourTable(HDC hdc,BITMAPINFOHEADER *pbmi);
void SetStretchMode();
public:
// Used to control the image drawing
CDrawImage(CBaseWindow *pBaseWindow);
BOOL DrawImage(IMediaSample *pMediaSample);
BOOL DrawVideoImageHere(HDC hdc, IMediaSample *pMediaSample,
LPRECT lprcSrc, LPRECT lprcDst);
void SetDrawContext();
void SetTargetRect(RECT *pTargetRect);
void SetSourceRect(RECT *pSourceRect);
void GetTargetRect(RECT *pTargetRect);
void GetSourceRect(RECT *pSourceRect);
virtual RECT ScaleSourceRect(const RECT *pSource);
// Handle updating palettes as they change
LONG GetPaletteVersion();
void ResetPaletteVersion();
void IncrementPaletteVersion();
// Tell us media types and allocator assignments
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -