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

📄 bcgpkeyboardmanager.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	return TRUE;
}
//************************************************************************************************
BOOL CBCGPKeyboardManager::SaveState (LPCTSTR lpszProfileName, CFrameWnd* pDefaultFrame)
{
	CString strProfileName = ::BCGPGetRegPath (strKbProfile, lpszProfileName);

	CDocManager* pDocManager = AfxGetApp ()->m_pDocManager;
	if (pDocManager != NULL)
	{
		//---------------------------------------
		// Walk all templates in the application:
		//---------------------------------------
		for (POSITION pos = pDocManager->GetFirstDocTemplatePosition (); pos != NULL;)
		{
			CBCGPMultiDocTemplate* pTemplate = 
				(CBCGPMultiDocTemplate*) pDocManager->GetNextDocTemplate (pos);
			ASSERT_VALID (pTemplate);
			ASSERT_KINDOF (CDocTemplate, pTemplate);

			//-----------------------------------------------------
			// We are interessing CMultiDocTemplate objects in
			// the shared accelerator table only....
			//-----------------------------------------------------
			if (!pTemplate->IsKindOf (RUNTIME_CLASS (CMultiDocTemplate)) ||
				pTemplate->m_hAccelTable == NULL)
			{
				continue;
			}

			UINT uiResId = pTemplate->GetResId ();
			ASSERT (uiResId != 0);

			SaveAccelaratorState (strProfileName, uiResId, pTemplate->m_hAccelTable);
		}
	}

	//--------------------------------
	// Save default accelerator table:
	//--------------------------------
	if (pDefaultFrame == NULL)
	{
		pDefaultFrame = DYNAMIC_DOWNCAST (CFrameWnd, AfxGetMainWnd ());
	}

	if (pDefaultFrame != NULL && pDefaultFrame->m_hAccelTable != NULL)
	{
		SaveAccelaratorState (strProfileName, 0, pDefaultFrame->m_hAccelTable);
	}

	return TRUE;
}
//******************************************************************
void CBCGPKeyboardManager::ResetAll ()
{
	CDocManager* pDocManager = AfxGetApp ()->m_pDocManager;
	if (pDocManager != NULL)
	{
		//---------------------------------------
		// Walk all templates in the application:
		//---------------------------------------
		for (POSITION pos = pDocManager->GetFirstDocTemplatePosition (); pos != NULL;)
		{
			CBCGPMultiDocTemplate* pTemplate = 
				(CBCGPMultiDocTemplate*) pDocManager->GetNextDocTemplate (pos);
			ASSERT_VALID (pTemplate);
			ASSERT_KINDOF (CDocTemplate, pTemplate);

			//-----------------------------------------------------
			// We are interessing CMultiDocTemplate objects in
			// the shared accelerator table only....
			//-----------------------------------------------------
			if (!pTemplate->IsKindOf (RUNTIME_CLASS (CMultiDocTemplate)) ||
				pTemplate->m_hAccelTable == NULL)
			{
				continue;
			}

			UINT uiResId = pTemplate->GetResId ();
			ASSERT (uiResId != 0);

			HINSTANCE hInst = AfxFindResourceHandle(
				MAKEINTRESOURCE (uiResId), RT_MENU);

			HACCEL hAccellTable = ::LoadAccelerators(hInst, MAKEINTRESOURCE (uiResId));
			if (hAccellTable != NULL)
			{
				UpdateAcellTable (pTemplate, hAccellTable);
			}
		}
	}

	//-----------------------------------
	// Restore default accelerator table:
	//-----------------------------------
	CFrameWnd* pWndMain = DYNAMIC_DOWNCAST (CFrameWnd, AfxGetMainWnd ());
	if (pWndMain != NULL && pWndMain->m_hAccelTable != NULL)
	{
		UINT uiResId = 0;

		CBCGPMDIFrameWnd* pMDIFrame = DYNAMIC_DOWNCAST (CBCGPMDIFrameWnd, AfxGetMainWnd ());
		if (pMDIFrame != NULL)
		{
			uiResId = pMDIFrame->GetDefaultResId ();
		}
		else	// Maybe, SDI frame...
		{
			CBCGPFrameWnd* pFrame = DYNAMIC_DOWNCAST (CBCGPFrameWnd, AfxGetMainWnd ());
			if (pFrame != NULL)
			{
				uiResId = pFrame->GetDefaultResId ();
			}
			else	// Maybe, OLE frame...
			{
				CBCGPOleIPFrameWnd* pOleFrame = 
					DYNAMIC_DOWNCAST (CBCGPOleIPFrameWnd, AfxGetMainWnd ());
				if (pOleFrame != NULL)
				{
					uiResId = pOleFrame->GetDefaultResId ();
				}
			}
		}
		
		if (uiResId != 0)
		{
			HINSTANCE hInst = AfxFindResourceHandle(
				MAKEINTRESOURCE (uiResId), RT_MENU);

			HACCEL hAccellTable = ::LoadAccelerators(hInst, MAKEINTRESOURCE (uiResId));
			if (hAccellTable != NULL)
			{
				UpdateAcellTable (NULL, hAccellTable);
			}
		}
	}
}
//******************************************************************
BOOL CBCGPKeyboardManager::FindDefaultAccelerator (UINT uiCmd, CString& str, 
												CFrameWnd* pWndFrame,
												BOOL bIsDefaultFrame)
{
	str.Empty ();

	if (pWndFrame == NULL)
	{
		return FALSE;
	}

	HACCEL hAccelTable = pWndFrame->GetDefaultAccelerator ();
	if (hAccelTable == NULL)
	{
		return FALSE;
	}

	int& nSize = bIsDefaultFrame ? m_nAccelDefaultSize : m_nAccelSize;
	LPACCEL& lpAccel = bIsDefaultFrame ? m_lpAccelDefault : m_lpAccel;

	SetAccelTable (	lpAccel,
					bIsDefaultFrame ? m_hAccelDefaultLast : m_hAccelLast,
					nSize, hAccelTable);

	ASSERT (lpAccel != NULL);

	BOOL bFound = FALSE;
	for (int i = 0; !bFound && i < nSize; i ++)
	{
		if (lpAccel [i].cmd == uiCmd)
		{
			CBCGPKeyHelper helper (&lpAccel [i]);
			helper.Format (str);

			bFound = TRUE;
		}
	}

	return bFound;
}
//*********************************************************************************************
void CBCGPKeyboardManager::SetAccelTable (LPACCEL& lpAccel, HACCEL& hAccelLast, 
										 int& nSize, const HACCEL hAccelCur)
{
	ASSERT (hAccelCur != NULL);
	if (hAccelCur == hAccelLast)
	{
		ASSERT (lpAccel != NULL);
		return;
	}

	//--------------------------------
	// Destroy old acceleration table:
	//--------------------------------
	if (lpAccel != NULL)
	{
		delete lpAccel;
		lpAccel = NULL;
	}

	nSize = ::CopyAcceleratorTable (hAccelCur, NULL, 0);

	lpAccel = new ACCEL [nSize];
	ASSERT (lpAccel != NULL);

	::CopyAcceleratorTable (hAccelCur, lpAccel, nSize);

	hAccelLast = hAccelCur;
}
//************************************************************************************
UINT CBCGPKeyboardManager::TranslateCharToUpper (const UINT nChar)
{
	if (nChar < VK_NUMPAD0 || nChar > VK_NUMPAD9 ||
		(::GetAsyncKeyState (VK_MENU) & 0x8000))
	{
		if (!CBCGPToolBar::m_bExtCharTranslation ||
			nChar < 0x41 || nChar > 0x5A)
		{
			if (::GetAsyncKeyState (VK_MENU) & 0x8000)
			{
				return nChar;
			}
			else
			{
				return toupper (nChar);
			}
		}
	}

	WORD wChar;
	BYTE lpKeyState [256];
	::GetKeyboardState (lpKeyState);

	::ToAsciiEx (nChar,
				MapVirtualKey (nChar, 0),
				lpKeyState,
				&wChar,
				1,
				::GetKeyboardLayout (AfxGetThread()->m_nThreadID));

	TCHAR szChar [2] = {(TCHAR) wChar, '\0'};
	CharUpper(szChar);

	return (UINT)szChar [0];
}
//************************************************************************************
void CBCGPKeyboardManager::CleanUp ()
{
	if (m_lpAccel != NULL)
	{
		delete m_lpAccel;
		m_lpAccel = NULL;

	}

	if (m_lpAccelDefault != NULL)
	{
		delete m_lpAccelDefault;
		m_lpAccelDefault = NULL;
	}
}
//******************************************************************
BOOL CBCGPKeyboardManager::IsKeyHandled (WORD nKey, BYTE fVirt,
										CFrameWnd* pWndFrame,
										BOOL bIsDefaultFrame)
{
	if (pWndFrame == NULL)
	{
		return FALSE;
	}

	HACCEL hAccelTable = pWndFrame->GetDefaultAccelerator ();
	if (hAccelTable == NULL)
	{
		return FALSE;
	}

	int& nSize = bIsDefaultFrame ? m_nAccelDefaultSize : m_nAccelSize;
	LPACCEL& lpAccel = bIsDefaultFrame ? m_lpAccelDefault : m_lpAccel;

	SetAccelTable (	lpAccel,
					bIsDefaultFrame ? m_hAccelDefaultLast : m_hAccelLast,
					nSize, hAccelTable);

	ASSERT (lpAccel != NULL);

	for (int i = 0; i < nSize; i ++)
	{
		if (lpAccel [i].key == nKey &&
			lpAccel [i].fVirt == fVirt)
		{
			return TRUE;
		}
	}

	return FALSE;
}

⌨️ 快捷键说明

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