【问题标题】:How to make MFC Ribbon Statusbar act like the regular CStatusBar如何使 MFC 功能区状态栏像常规 CStatusBar 一样工作
【发布时间】:2016-10-19 14:18:53
【问题描述】:

第一张图片显示了我想要做什么。第二个显示我得到了什么。

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

提前致谢。

【问题讨论】:

  • 我不知道您为什么认为发布源代码的屏幕截图会有所帮助。它肯定会使几乎所有视力受损的开发人员甚至无法理解您的问题。停止这种疯狂。
  • 请问我该如何改进?
  • 通过将文本作为文本发布,对于初学者。这不像您将图像粘贴到代码编辑器中,或者从代码编辑器中复制图像。在这里应用一些常识。
  • 我很抱歉。我认为问题出在我的代码中,并想通过发布图像来解释更多。

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


【解决方案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);        

}

【讨论】:

  • 感谢您的回复。
  • 这不起作用,它总是被称为 CFrameWnd::OnUpdateKeyIndi​​cator,而不是我定义的那个,就像你上面建议的那样。当我按下 CAPS 键时,状态栏中的指示器会启用/禁用。我希望它出现/消失。
  • 万岁!它现在正在工作。我应该将所有代码移动到 CChildFrame 而不是 CMainFrame。 :) 非常感谢。
  • 你没有提到你有 MDI 应用程序。无论如何,我已经更新了涵盖 MDI 的答案。
【解决方案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);
}

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多