如何使MFC功能区状态栏像常规CStatusBar一样

时间:2016-10-19 14:18:54

标签: c++ mfc statusbar ribbon-control capslock

第一张图片显示了我想要做的事情。第二个显示我得到的东西。

我希望状态栏显示特殊键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)

提前致谢。

2 个答案:

答案 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);
}