mediactrl.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,438 行 · 第 1/5 页
CPP
1,438 行
/////////////////////////////////////////////////////////////////////////////
// Name: msw/mediactrl.cpp
// Purpose: Built-in Media Backends for Windows
// Author: Ryan Norton <wxprojects@comcast.net>
// Modified by:
// Created: 11/07/04
// RCS-ID: $Id: mediactrl.cpp,v 1.56.2.5 2006/03/11 14:33:25 JS Exp $
// Copyright: (c) Ryan Norton
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
/*
FIXME FIXME FIXME:
- extract different backends in different files (better yet, make backends
dynamically loadable...), they have nothing to do with each other and
this file is huge and also separate the standard contents from our code
itself
*/
//===========================================================================
// DECLARATIONS
//===========================================================================
//---------------------------------------------------------------------------
// Pre-compiled header stuff
//---------------------------------------------------------------------------
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "mediactrl.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
//---------------------------------------------------------------------------
// MediaCtrl include
//---------------------------------------------------------------------------
#include "wx/mediactrl.h"
//---------------------------------------------------------------------------
// Compilation guard
//---------------------------------------------------------------------------
#if wxUSE_MEDIACTRL
//---------------------------------------------------------------------------
// WX Includes
//---------------------------------------------------------------------------
#include "wx/log.h" //wxLogDebug
#include "wx/math.h" //log10 & pow
#include "wx/dcclient.h"
#include "wx/timer.h"
#include "wx/dynlib.h"
#include "wx/settings.h"
#include "wx/msw/private.h" //user info and wndproc setting/getting
#include "wx/msw/registry.h" //wxRegKey etc. in wxQTMediaBackend
//---------------------------------------------------------------------------
// Externals (somewhere in src/msw/app.cpp and src/msw/window.cpp)
//---------------------------------------------------------------------------
extern "C" WXDLLIMPEXP_BASE HINSTANCE wxGetInstance(void);
#ifdef __WXWINCE__
extern WXDLLIMPEXP_CORE wxChar *wxCanvasClassName;
#else
extern WXDLLIMPEXP_CORE const wxChar *wxCanvasClassName;
#endif
LRESULT WXDLLIMPEXP_CORE APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam);
//---------------------------------------------------------------------------
// Killed MSVC warnings
//---------------------------------------------------------------------------
//disable "cast truncates constant value" for VARIANT_BOOL values
//passed as parameters in VC5 and up
#ifdef _MSC_VER
#pragma warning (disable:4310)
#endif
//===========================================================================
// BACKEND DECLARATIONS
//===========================================================================
//---------------------------------------------------------------------------
//
// wxAMMediaBackend
//
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// wxActiveXContainer - includes all the COM-specific stuff we need
//---------------------------------------------------------------------------
#include "wx/msw/ole/activex.h"
//---------------------------------------------------------------------------
// IIDS - used by CoCreateInstance and IUnknown::QueryInterface
//
// [idl name] [idl decription]
// amcompat.idl Microsoft Active Movie Control (Ver 2.0)
// nscompat.idl Microsoft NetShow Player (Ver 1.0)
// msdxm.idl Windows Media Player (Ver 1.0)
// quartz.idl
//
// First, when I say I "from XXX.idl", I mean I go into the COM Browser
// ($Microsoft Visual Studio$/Common/Tools/OLEVIEW.EXE), open
// "type libraries", open a specific type library (for quartz for example its
// "ActiveMovie control type library (V1.0)"), save it as an .idl, compile the
// idl using the midl compiler that comes with visual studio
// ($Microsoft Visual Studio$/VC98/bin/midl.exe on VC6) with the /h argument
// to make it generate stubs (a .h & .c file), then clean up the generated
// interfaces I want with the STDMETHOD wrappers and then put them into
// mediactrl.cpp.
//
// According to the MSDN docs, IMediaPlayer requires Windows 98 SE
// or greater. NetShow is available on Windows 3.1 and I'm guessing
// IActiveMovie is too. IMediaPlayer is essentially the Windows Media
// Player 6.4 SDK.
//
// Some of these are not used but are kept here for future reference anyway
//---------------------------------------------------------------------------
const IID IID_IActiveMovie = {0x05589FA2,0xC356,0x11CE,{0xBF,0x01,0x00,0xAA,0x00,0x55,0x59,0x5A}};
const IID IID_IActiveMovie2 = {0xB6CD6554,0xE9CB,0x11D0,{0x82,0x1F,0x00,0xA0,0xC9,0x1F,0x9C,0xA0}};
const IID IID_IActiveMovie3 = {0x265EC140,0xAE62,0x11D1,{0x85,0x00,0x00,0xA0,0xC9,0x1F,0x9C,0xA0}};
const IID IID_INSOPlay = {0x2179C5D1,0xEBFF,0x11CF,{0xB6,0xFD,0x00,0xAA,0x00,0xB4,0xE2,0x20}};
const IID IID_INSPlay = {0xE7C4BE80,0x7960,0x11D0,{0xB7,0x27,0x00,0xAA,0x00,0xB4,0xE2,0x20}};
const IID IID_INSPlay1 = {0x265EC141,0xAE62,0x11D1,{0x85,0x00,0x00,0xA0,0xC9,0x1F,0x9C,0xA0}};
const IID IID_IMediaPlayer = {0x22D6F311,0xB0F6,0x11D0,{0x94,0xAB,0x00,0x80,0xC7,0x4C,0x7E,0x95}};
const IID IID_IMediaPlayer2 = {0x20D4F5E0,0x5475,0x11D2,{0x97,0x74,0x00,0x00,0xF8,0x08,0x55,0xE6}};
const CLSID CLSID_ActiveMovie = {0x05589FA1,0xC356,0x11CE,{0xBF,0x01,0x00,0xAA,0x00,0x55,0x59,0x5A}};
const CLSID CLSID_MediaPlayer = {0x22D6F312,0xB0F6,0x11D0,{0x94,0xAB,0x00,0x80,0xC7,0x4C,0x7E,0x95}};
const CLSID CLSID_NSPlay = {0x2179C5D3,0xEBFF,0x11CF,{0xB6,0xFD,0x00,0xAA,0x00,0xB4,0xE2,0x20}};
const IID IID_IAMOpenProgress = {0x8E1C39A1, 0xDE53, 0x11CF,{0xAA, 0x63, 0x00, 0x80, 0xC7, 0x44, 0x52, 0x8D}};
// QUARTZ
const CLSID CLSID_FilgraphManager = {0xE436EBB3,0x524F,0x11CE,{0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70}};
const IID IID_IMediaEvent = {0x56A868B6,0x0AD4,0x11CE,{0xB0,0x3A,0x00,0x20,0xAF,0x0B,0xA7,0x70}};
//?? QUARTZ Also?
const CLSID CLSID_VideoMixingRenderer9 ={0x51B4ABF3, 0x748F, 0x4E3B,{0xA2, 0x76, 0xC8, 0x28, 0x33, 0x0E, 0x92, 0x6A}};
const IID IID_IVMRWindowlessControl9 = {0x8F537D09, 0xF85E, 0x4414,{0xB2, 0x3B, 0x50, 0x2E, 0x54, 0xC7, 0x99, 0x27}};
const IID IID_IFilterGraph = {0x56A8689F, 0x0AD4, 0x11CE,{0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}};
const IID IID_IGraphBuilder = {0x56A868A9, 0x0AD4, 0x11CE,{0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}};
const IID IID_IVMRFilterConfig9 = {0x5A804648, 0x4F66, 0x4867,{0x9C, 0x43, 0x4F, 0x5C, 0x82, 0x2C, 0xF1, 0xB8}};
const IID IID_IBaseFilter = {0x56A86895, 0x0AD4, 0x11CE,{0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}};
//---------------------------------------------------------------------------
// QUARTZ COM INTERFACES (dumped from quartz.idl from MSVC COM Browser)
//---------------------------------------------------------------------------
struct IAMOpenProgress : public IUnknown
{
STDMETHOD(QueryProgress)(LONGLONG *pllTotal, LONGLONG *pllCurrent) PURE;
STDMETHOD(AbortOperation)(void) PURE;
};
struct IMediaEvent : public IDispatch
{
STDMETHOD(GetEventHandle)(LONG_PTR *) PURE;
STDMETHOD(GetEvent)(long *, LONG_PTR *, LONG_PTR *, long) PURE;
STDMETHOD(WaitForCompletion)(long, long *) PURE;
STDMETHOD(CancelDefaultHandling)(long) PURE;
STDMETHOD(RestoreDefaultHandling)(long) PURE;
STDMETHOD(FreeEventParams)(long, LONG_PTR, LONG_PTR) PURE;
};
//---------------------------------------------------------------------------
// ACTIVEMOVIE COM INTERFACES (dumped from amcompat.idl from MSVC COM Browser)
//---------------------------------------------------------------------------
enum ReadyStateConstants
{
amvUninitialized = 0,
amvLoading = 1,
amvInteractive = 3,
amvComplete = 4
};
enum StateConstants
{
amvNotLoaded = -1,
amvStopped = 0,
amvPaused = 1,
amvRunning = 2
};
enum DisplayModeConstants
{
amvTime = 0,
amvFrames = 1
};
enum WindowSizeConstants
{
amvOriginalSize = 0,
amvDoubleOriginalSize = 1,
amvOneSixteenthScreen = 2,
amvOneFourthScreen = 3,
amvOneHalfScreen = 4
};
enum AppearanceConstants
{
amvFlat = 0,
amv3D = 1
};
enum BorderStyleConstants
{
amvNone = 0,
amvFixedSingle = 1
};
struct IActiveMovie : public IDispatch
{
STDMETHOD(AboutBox)( void) PURE;
STDMETHOD(Run)( void) PURE;
STDMETHOD(Pause)( void) PURE;
STDMETHOD(Stop)( void) PURE;
STDMETHOD(get_ImageSourceWidth)(long __RPC_FAR *pWidth) PURE;
STDMETHOD(get_ImageSourceHeight)(long __RPC_FAR *pHeight) PURE;
STDMETHOD(get_Author)(BSTR __RPC_FAR *pbstrAuthor) PURE;
STDMETHOD(get_Title)(BSTR __RPC_FAR *pbstrTitle) PURE;
STDMETHOD(get_Copyright)(BSTR __RPC_FAR *pbstrCopyright) PURE;
STDMETHOD(get_Description)(BSTR __RPC_FAR *pbstrDescription) PURE;
STDMETHOD(get_Rating)(BSTR __RPC_FAR *pbstrRating) PURE;
STDMETHOD(get_FileName)(BSTR __RPC_FAR *pbstrFileName) PURE;
STDMETHOD(put_FileName)(BSTR pbstrFileName) PURE;
STDMETHOD(get_Duration)(double __RPC_FAR *pValue) PURE;
STDMETHOD(get_CurrentPosition)(double __RPC_FAR *pValue) PURE;
STDMETHOD(put_CurrentPosition)(double pValue) PURE;
STDMETHOD(get_PlayCount)(long __RPC_FAR *pPlayCount) PURE;
STDMETHOD(put_PlayCount)(long pPlayCount) PURE;
STDMETHOD(get_SelectionStart)(double __RPC_FAR *pValue) PURE;
STDMETHOD(put_SelectionStart)(double pValue) PURE;
STDMETHOD(get_SelectionEnd)(double __RPC_FAR *pValue) PURE;
STDMETHOD(put_SelectionEnd)(double pValue) PURE;
STDMETHOD(get_CurrentState)(StateConstants __RPC_FAR *pState) PURE;
STDMETHOD(get_Rate)(double __RPC_FAR *pValue) PURE;
STDMETHOD(put_Rate)(double pValue) PURE;
STDMETHOD(get_Volume)(long __RPC_FAR *pValue) PURE;
STDMETHOD(put_Volume)(long pValue) PURE;
STDMETHOD(get_Balance)(long __RPC_FAR *pValue) PURE;
STDMETHOD(put_Balance)(long pValue) PURE;
STDMETHOD(get_EnableContextMenu)(VARIANT_BOOL __RPC_FAR *pEnable) PURE;
STDMETHOD(put_EnableContextMenu)(VARIANT_BOOL pEnable) PURE;
STDMETHOD(get_ShowDisplay)(VARIANT_BOOL __RPC_FAR *Show) PURE;
STDMETHOD(put_ShowDisplay)(VARIANT_BOOL Show) PURE;
STDMETHOD(get_ShowControls)(VARIANT_BOOL __RPC_FAR *Show) PURE;
STDMETHOD(put_ShowControls)(VARIANT_BOOL Show) PURE;
STDMETHOD(get_ShowPositionControls)(VARIANT_BOOL __RPC_FAR *Show) PURE;
STDMETHOD(put_ShowPositionControls)(VARIANT_BOOL Show) PURE;
STDMETHOD(get_ShowSelectionControls)(VARIANT_BOOL __RPC_FAR *Show) PURE;
STDMETHOD(put_ShowSelectionControls)(VARIANT_BOOL Show) PURE;
STDMETHOD(get_ShowTracker)(VARIANT_BOOL __RPC_FAR *Show) PURE;
STDMETHOD(put_ShowTracker)(VARIANT_BOOL Show) PURE;
STDMETHOD(get_EnablePositionControls)(VARIANT_BOOL __RPC_FAR *Enable) PURE;
STDMETHOD(put_EnablePositionControls)(VARIANT_BOOL Enable) PURE;
STDMETHOD(get_EnableSelectionControls)(VARIANT_BOOL __RPC_FAR *Enable) PURE;
STDMETHOD(put_EnableSelectionControls)(VARIANT_BOOL Enable) PURE;
STDMETHOD(get_EnableTracker)(VARIANT_BOOL __RPC_FAR *Enable) PURE;
STDMETHOD(put_EnableTracker)(VARIANT_BOOL Enable) PURE;
STDMETHOD(get_AllowHideDisplay)(VARIANT_BOOL __RPC_FAR *Show) PURE;
STDMETHOD(put_AllowHideDisplay)(VARIANT_BOOL Show) PURE;
STDMETHOD(get_AllowHideControls)(VARIANT_BOOL __RPC_FAR *Show) PURE;
STDMETHOD(put_AllowHideControls)(VARIANT_BOOL Show) PURE;
STDMETHOD(get_DisplayMode)(DisplayModeConstants __RPC_FAR *pValue) PURE;
STDMETHOD(put_DisplayMode)(DisplayModeConstants pValue) PURE;
STDMETHOD(get_AllowChangeDisplayMode)(VARIANT_BOOL __RPC_FAR *fAllow) PURE;
STDMETHOD(put_AllowChangeDisplayMode)(VARIANT_BOOL fAllow) PURE;
STDMETHOD(get_FilterGraph)(IUnknown __RPC_FAR *__RPC_FAR *ppFilterGraph) PURE;
STDMETHOD(put_FilterGraph)(IUnknown __RPC_FAR *ppFilterGraph) PURE;
STDMETHOD(get_FilterGraphDispatch)(IDispatch __RPC_FAR *__RPC_FAR *pDispatch) PURE;
STDMETHOD(get_DisplayForeColor)(unsigned long __RPC_FAR *ForeColor) PURE;
STDMETHOD(put_DisplayForeColor)(unsigned long ForeColor) PURE;
STDMETHOD(get_DisplayBackColor)(unsigned long __RPC_FAR *BackColor) PURE;
STDMETHOD(put_DisplayBackColor)(unsigned long BackColor) PURE;
STDMETHOD(get_MovieWindowSize)(WindowSizeConstants __RPC_FAR *WindowSize) PURE;
STDMETHOD(put_MovieWindowSize)(WindowSizeConstants WindowSize) PURE;
STDMETHOD(get_FullScreenMode)(VARIANT_BOOL __RPC_FAR *pEnable) PURE;
STDMETHOD(put_FullScreenMode)(VARIANT_BOOL pEnable) PURE;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?