📄 bcgpkeyboardmanager.cpp
字号:
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 + -