⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osdwrapper.cpp

📁 Windows CE 下的机顶盒应用实例
💻 CPP
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++
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.

Module Name:  osdwrapper.cpp

Abstract:  Implements IOSDWrapper; see header file for more info.

--*/

#include "stdafx.h"
#include "stbihost.h"
#include <amovie.h>
#include "osdwrapper.h"

EXTERN_C const IID IID_IActiveMovie = { 0x05589FA2, 0xC356, 0x11CE,
										{ 0xBF, 0x01, 0x00, 0xAA,
										  0x00, 0x55, 0x59, 0x5A } };

extern HINSTANCE g_hInstance;

void COSDWrapper::ResetInternalPointers()
{
	if (m_pdispWMP)
			m_pdispWMP->Release();

	if (m_pVideoWindow)
		m_pVideoWindow->Release();

	if (m_pOSD)
		delete m_pOSD;

	m_pdispWMP = NULL;
	m_pVideoWindow = NULL;
	m_pOSD = NULL;
}

STDMETHODIMP COSDWrapper::InitForMediaPlayer(/*[in]*/ IDispatch* pVal)
{
	if (!pVal) return E_POINTER;

	if (m_pdispWMP)
		m_pdispWMP->Release();

	m_pdispWMP = pVal;
	m_pdispWMP->AddRef();

	return S_OK;
}

STDMETHODIMP COSDWrapper::SignalOpenState(/*[in]*/ VARIANT_BOOL fOpen)
{
	DEBUGMSG(1, (TEXT("COSDWrapper::SignalOpenState(%s)\r\n"),
		VARIANT_TRUE == fOpen ? TEXT("TRUE") : TEXT("FALSE")));

	if (m_pOSD)
	{
		delete [] m_pOSD;
		m_pOSD = NULL;
	}

	if (!fOpen)
		return S_OK;

	ASSERT(m_pdispWMP);
	if (!m_pdispWMP)
		return E_UNEXPECTED;

	HRESULT hr;
	IActiveMovie* pActiveMovie = NULL;
	IUnknown* pUnkFilterGraph = NULL;

	// make sure we have access to IVideoWindow
	hr = m_pdispWMP->QueryInterface(IID_IActiveMovie,
					(void**)&pActiveMovie);
	if (SUCCEEDED(hr))
	{
		hr = pActiveMovie->get_FilterGraph(&pUnkFilterGraph);
		if (SUCCEEDED(hr))
		{
			hr = pUnkFilterGraph->QueryInterface(IID_IVideoWindow,
							(void**)&m_pVideoWindow);
			if (SUCCEEDED(hr))
			{
				HWND hwnd;
				hr = m_pVideoWindow->get_Owner(reinterpret_cast<OAHWND*>(&hwnd));
				if (SUCCEEDED(hr))
				{
					// get child window from owner
					POINT pt = {320, 240};
					HWND hwndChild = ChildWindowFromPoint(hwnd, pt);

					// now we have the info we need to init
					// the OSD
					m_pOSD = new CWinOSD();
					if (!m_pOSD)
						hr = E_OUTOFMEMORY;
					else
						hr = m_pOSD->SetWindow(hwndChild, g_hInstance);
				}
			}
		}
	}

	if (FAILED(hr))
		ResetInternalPointers();

	if (pActiveMovie)
		pActiveMovie->Release();

	if (pUnkFilterGraph)
		pUnkFilterGraph->Release();
	
	return hr;
}

STDMETHODIMP COSDWrapper::ProvideFeedback(long cmd, long cmdResult)
{
	if (!m_pOSD)
		return E_UNEXPECTED;

	if (cmd < NoCmd || cmd >= End)
		return E_INVALIDARG;

	m_pOSD->ProvideFeedback((CPlayerCommand)cmd, cmdResult);

	return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -