📄 winutil.h
字号:
//------------------------------------------------------------------------------// File: WinUtil.h//// Desc: DirectShow base classes - defines generic handler classes.//// Copyright (c) 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 widthconst int DEFHEIGHT = 240; // Initial window heightconst int CAPTION = 256; // Maximum length of captionconst int TIMELENGTH = 50; // Maximum length of timesconst int PROFILESTR = 128; // Normal profile stringconst WORD PALVERSION = 0x300; // GDI palette versionconst LONG PALETTE_VERSION = (LONG) 1; // Initial palette versionconst COLORREF VIDEO_COLOUR = 0; // Defaults to black backgroundconst 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 constructionclass 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 + -