如何使 MFC 功能区状态栏像常规 CStatusBar
How to make MFC Ribbon Statusbar act like the regular CStatusBar
第一张图片显示了我想要做的事情。第二个显示了我得到的结果。
我想让状态栏显示特殊键CAPS LOCK、NUM LOCK和SCROLL LOCK的状态。此图像来自使用 CStatusBar 的旧项目。
此快照来自 CMainFrame class.
此图显示了我在 Visual C++ 2015 MFC 中的操作方式以及我得到的结果。此快照也来自 CMainFrame class。
我的问题是:谁能告诉我我的应用程序如何拦截切换按钮 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
支持。
好消息是实现相同的行为非常容易。
为了在您的应用程序中实施它,您必须执行以下操作:
将此添加到主框架 class 或 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 class.
解决了这个问题
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);
}
第一张图片显示了我想要做的事情。第二个显示了我得到的结果。
我想让状态栏显示特殊键CAPS LOCK、NUM LOCK和SCROLL LOCK的状态。此图像来自使用 CStatusBar 的旧项目。 此快照来自 CMainFrame class.
此图显示了我在 Visual C++ 2015 MFC 中的操作方式以及我得到的结果。此快照也来自 CMainFrame class。
我的问题是:谁能告诉我我的应用程序如何拦截切换按钮 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
支持。
好消息是实现相同的行为非常容易。 为了在您的应用程序中实施它,您必须执行以下操作:
将此添加到主框架 class 或 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 class.
解决了这个问题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);
}