Первое изображение показывает, что я хочу сделать. Второй показывает, что я получаю.
Я хочу, чтобы в строке состояния отображалось состояние специальных клавиш CAPS LOCK, NUM LOCK и SCROLL LOCK. Это изображение из старого проекта, использующего CStatusBar.
Этот снимок из класса CMainFrame.
Это изображение показывает, как я это делаю в Visual C ++ 2015 MFC, и результаты, которые я получаю. Этот снимок тоже из класса CMainFrame.
Мой вопрос: может ли кто-нибудь сказать мне, как мое приложение может перехватить изменение от переключателей CAPS LOCK и NUM LOCK, а затем обновить пользовательский интерфейс.
Я пытался использовать этот код, но он не работает:
ON_UPDATE_COMMAND_UI(ID_INDICATOR_STYLE, &CMainFrame::OnUpdateStyle)
ON_UPDATE_COMMAND_UI(ID_INDICATOR_FOLD, &CMainFrame::OnUpdateFold)
ON_UPDATE_COMMAND_UI(ID_INDICATOR_OVR, &CMainFrame::OnUpdateInsert)
Заранее спасибо.
Прежде всего стандартное поведение CStatusBar
не поддерживается CMFCRibbonStatusBar
,
Хорошей новостью является то, что такое поведение очень легко реализовать.
Вот что вы должны сделать, чтобы реализовать это в своем приложении:
Добавьте это к карте сообщений вашего основного класса кадров или дочернего кадра в случае MDI:
ON_UPDATE_COMMAND_UI(ID_INDICATOR_CAPS, &CMainFrame::OnUpdateButtonsState)
ON_UPDATE_COMMAND_UI(ID_INDICATOR_NUM, &CMainFrame::OnUpdateButtonsState)
ON_UPDATE_COMMAND_UI(ID_INDICATOR_SCRL, &CMainFrame::OnUpdateButtonsState)
Фактический обработчик обновления должен выглядеть так:
void CMainFrame::OnUpdateButtonsState(CCmdUI* pCmdUI)
{
UINT nVK;
UINT flag = 0x0001;
switch (pCmdUI->m_nID)
{
case ID_INDICATOR_CAPS:
nVK = VK_CAPITAL;
break;
case ID_INDICATOR_NUM:
nVK = VK_NUMLOCK;
break;
case ID_INDICATOR_SCRL:
nVK = VK_SCROLL;
break;
case ID_INDICATOR_KANA:
nVK = VK_KANA;
break;
default:
TRACE(traceAppMsg, 0, "Warning: OnUpdateKeyIndicator - unknown indicator 0x%04X.\n",
pCmdUI->m_nID);
pCmdUI->ContinueRouting();
return; // not for us
}
pCmdUI->SetCheck(::GetKeyState(nVK) & flag);
}
Я решил это, переместив код в класс CChildFrame.
ON_UPDATE_COMMAND_UI(ID_INDICATOR_CAPS, &CChildFrame::OnUpdateIndicators)
ON_UPDATE_COMMAND_UI(ID_INDICATOR_NUM, &CChildFrame::OnUpdateIndicators)
ON_UPDATE_COMMAND_UI(ID_INDICATOR_SCRL, &CChildFrame::OnUpdateIndicators)
А потом
void CChildFrame::OnUpdateIndicators(CCmdUI *pCmdUI)
{
pCmdUI->Enable();
// ... the rest of the above code
CString text;
if (::GetKeyState(nVK) & flag)
text.LoadStringW(pCmdUI->m_nID);
pCmdUI->SetText(text);
}