【问题标题】:MFC Change CMFCToolBar button to Toggle instead of press/release?MFC 将 CMFCToolBar 按钮更改为切换而不是按下/释放?
【发布时间】:2020-06-11 05:38:21
【问题描述】:

我在网上找到一篇文章说将工具栏按钮设置为保持按下状态的类型,您只需在按钮上设置样式TBBS_CHECKBOX,但它对我不起作用(它仍然像普通按钮一样) .我确认样式已设置,就在创建和CMainFrame::OnCreate()SetWindowText() MFC 向导设置之后。我做错了什么?

 for (int i=0; ; i++) {
    int id=m_wndToolBar.GetItemID(i);
    if (id==0) {
      break;
    }
    if (id == ID_THE_ID) {
      m_wndToolBar.SetButtonStyle(i, TBBS_CHECKBOX);
    }
  }

【问题讨论】:

  • 如果您发布该文章的链接可能会很有用。
  • 推荐的实现是使用UI Update MechanismON_COMMAND 处理程序应该切换一个布尔变量,ON_UPDATE_COMMAND_UI 相应地更新项目。请参阅我的帖子 here 中的一些提示。
  • 这是很好的信息,但是激活时按住不放呢,命令 ui 是否只提供启用/禁用或也可以设置状态?它将是一个过滤器按钮(上面有漏斗图),它要么处于活动状态,要么处于非活动状态。

标签: winapi mfc toolbar


【解决方案1】:

这里推荐使用Command Handlers。一个命令 ID 可以用在多个 UI 项中,例如一个菜单项和一个工具栏按钮。处理程序会影响具有相同 ID 的所有项目,因此您不需要为每个项目单独设置一个。 CCmdUI Class 提供的方法除了启用/禁用之外,还可以使菜单或工具栏按钮等 UI 项目表现为按钮、复选框或单选按钮。

在您的示例中,假设是否过滤的选项是基于每个文档实例化的,即文档的所有视图将同时被过滤或不过滤。您应该在文档类中定义一个布尔变量:

BOOL m_bFilterData = FALSE;

然后是带有过滤器图片(也可能是菜单项)的工具栏按钮的 ON_COMMANDON_UPDATE_COMMAND_UI 处理程序:

BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
  .
  .
    ON_COMMAND(ID_VIEW_FILTERDATA, OnViewFilterData)
    ON_UPDATE_COMMAND_UI(ID_VIEW_FILTERDATA, OnUpdateViewFilterData)
  .
  .
END_MESSAGE_MAP()

void CMyDoc::OnViewFilterData()
{
    // Toggle filtered state
    m_bFilterData = !m_bFilterData;
    // Tell all views to refresh - You can limit this using the lHint/pHint params 
    UpdateAllViews(NULL, 0L, NULL);
}

void CMyDoc::OnUpdateViewFilterData(CCmdUI* pCmdUI)
{
    // Enable/Disable as needed
    pCmdUI->Enable(m_nTotalItems>0);
    // Show pressed/checked if data filtered
    pCmdUI->SetCheck(m_bFilterData);
}

现在,如果过滤器选项是按视图实例化的,即每个视图都可以单独过滤或不过滤,则上述内容必须转到您的视图类(-es):

void CMyView::OnViewFilterData()
{
    // Toggle filtered state
    m_bFilterData = !m_bFilterData;
    // Refresh this view only
    .
    .
}

void CMyView::OnUpdateViewFilterData(CCmdUI* pCmdUI)
{
    // Enable/Disable as needed
    pCmdUI->Enable(GetDocument()->m_nTotalItems > 0);
    // Show pressed/checked if data filtered
    pCmdUI->SetCheck(m_bFilterData);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
相关资源
最近更新 更多