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

📄 rctlkeys.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:  rctlkeys.cpp

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

--*/

#include "stdafx.h"
#include "stbihost.h"
#include "mainwnd.h"
#include "rctlkeys.h"

#define RCTL_KEY_CASE(key, bit)	\
	case key:					\
		m_bmKeys |= bit;		\
		break

// transaction constants
#define TRANS_BEGIN	1
#define TRANS_END	2
#define TRANS_COMPLETE TRANS_BEGIN + TRANS_END


// BeginRequest sets up the initial bitmask
// EndRequest translates the final bitmask into a new
//   accelerator table
STDMETHODIMP CRCtlKeys::BeginRequest()
{
	ASSERT(m_pMainWnd);

	m_bytTrans = TRANS_BEGIN;

	m_bmKeys = 0;	// reset bitmask

	if (!m_pMainWnd->_hAccelTblNew)
		return S_OK;

	// enumerate the current accelerator table to set
	// the state of each key (1 = key handler overridden,
	// 0 = key handled by default handler in host)
	for (int i = 0; i < m_pMainWnd->_cNewAccels; i++)
	{
		switch (m_pMainWnd->_rgNewAccels[i].key)
		{
			RCTL_KEY_CASE(VK_MEDIA_STOP, RCTL_BM_STOP);
			RCTL_KEY_CASE(VK_PLAY, RCTL_BM_PLAY);
			RCTL_KEY_CASE(VK_PAUSE, RCTL_BM_PAUSE);
			RCTL_KEY_CASE(VK_MEDIA_PREV_TRACK, RCTL_BM_PREV);
			RCTL_KEY_CASE(VK_MEDIA_NEXT_TRACK, RCTL_BM_NEXT);
			RCTL_KEY_CASE(VK_PRIOR, RCTL_BM_BACK);
			RCTL_KEY_CASE(VK_NEXT, RCTL_BM_FWD);
			RCTL_KEY_CASE(VK_VOLUME_UP, RCTL_BM_VOLUP);
			RCTL_KEY_CASE(VK_VOLUME_DOWN, RCTL_BM_VOLDN);
			RCTL_KEY_CASE(VK_VOLUME_MUTE, RCTL_BM_MUTE);
			RCTL_KEY_CASE(VK_LEFT, RCTL_BM_LEFT);
			RCTL_KEY_CASE(VK_RIGHT, RCTL_BM_RIGHT);
			RCTL_KEY_CASE(VK_UP, RCTL_BM_UP);
			RCTL_KEY_CASE(VK_DOWN, RCTL_BM_DOWN);
			RCTL_KEY_CASE(VK_RETURN, RCTL_BM_SELECT);
			RCTL_KEY_CASE(VK_MENU, RCTL_BM_MENU);
		}
	}

	return S_OK;
}

STDMETHODIMP CRCtlKeys::EndRequest()
{
	BOOL fRet = m_pMainWnd->CreateAccelTbl(m_bmKeys);

	if (fRet)
	{
		m_bytTrans |= TRANS_END;
	}
	else
	{
		ASSERT(FALSE);
		return E_FAIL;
	}

	return S_OK;
}

STDMETHODIMP CRCtlKeys::ReleaseRequest()
{
	if (TRANS_COMPLETE != m_bytTrans)
	{
		ASSERT(FALSE);
		return E_UNEXPECTED;
	}

	m_bytTrans = 0;

	BOOL fRet = m_pMainWnd->DestroyAccelTbl();
	if (!fRet)
	{
		ASSERT(FALSE);
		return E_FAIL;
	}

	return S_OK;
}

#define RCTL_PROPDECL(name, bit)	\
	STDMETHODIMP CRCtlKeys::get_##name(/*[out, retval]*/ VARIANT_BOOL* pVal) {	\
		if (!pVal) {															\
			ASSERT(FALSE);														\
			return E_POINTER; }													\
		if (TRANS_BEGIN != m_bytTrans) {										\
			ASSERT(FALSE);														\
			return E_UNEXPECTED; }												\
		*pVal = (m_bmKeys & bit != 0 ? VARIANT_TRUE : VARIANT_FALSE);			\
		return S_OK; }															\
	STDMETHODIMP CRCtlKeys::put_##name(/*[in]*/ VARIANT_BOOL newVal) {			\
		if (TRANS_BEGIN != m_bytTrans) {										\
			ASSERT(FALSE);														\
			return E_UNEXPECTED; }												\
		if (VARIANT_TRUE == newVal) m_bmKeys |= bit;							\
		else m_bmKeys &= ~bit;													\
		DEBUGMSG(1, (TEXT("remote control key bitmask: %u\r\n"), m_bmKeys));	\
		return S_OK; }

RCTL_PROPDECL(Stop, RCTL_BM_STOP)
RCTL_PROPDECL(Play, RCTL_BM_PLAY)
RCTL_PROPDECL(Previous, RCTL_BM_PREV)
RCTL_PROPDECL(Next, RCTL_BM_NEXT)
RCTL_PROPDECL(Forward, RCTL_BM_FWD)
RCTL_PROPDECL(Backward, RCTL_BM_BACK)
RCTL_PROPDECL(Pause, RCTL_BM_PAUSE)
RCTL_PROPDECL(VolumeUp, RCTL_BM_VOLUP)
RCTL_PROPDECL(VolumeDown, RCTL_BM_VOLDN)
RCTL_PROPDECL(Mute, RCTL_BM_MUTE)
RCTL_PROPDECL(Menu, RCTL_BM_MENU)
RCTL_PROPDECL(Up, RCTL_BM_UP)
RCTL_PROPDECL(Down, RCTL_BM_DOWN)
RCTL_PROPDECL(Left, RCTL_BM_LEFT)
RCTL_PROPDECL(Right, RCTL_BM_RIGHT)
RCTL_PROPDECL(Select, RCTL_BM_SELECT)

⌨️ 快捷键说明

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