如何使 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);
}