第一张图片显示了我想要做的事情。第二个显示我得到的东西。
我希望状态栏显示特殊键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)
提前致谢。
答案 0 :(得分:3)
首先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);
}
答案 1 :(得分:1)
我通过将代码移动到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);
}