Как сделать так, чтобы MFC Ribbon Statusbar работал как обычный CStatusBar

Первое изображение показывает, что я хочу сделать. Второй показывает, что я получаю.

Я хочу, чтобы в строке состояния отображалось состояние специальных клавиш 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)

Заранее спасибо.

1

Решение

Прежде всего стандартное поведение 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);

}
2

Другие решения

Я решил это, переместив код в класс 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);
}
0

По вопросам рекламы [email protected]