MFC将CMFCToolBar按钮更改为切换,而不是按下/释放?

问题描述 投票:0回答:1

[我在网上找到了一篇文章,说将工具栏按钮设置为持续按下的类型,您只需在按钮上设置样式TBBS_CHECKBOX,但对我不起作用(它仍然像普通按钮一样起作用)。在创建和SetWindowText()CMainFrame::OnCreate() 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);
    }
  }
winapi mfc toolbar
1个回答
2
投票

在此处建议使用Command Handlers。可以在多个UI项(例如菜单项和工具栏按钮)中使用命令ID。处理程序会影响具有相同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);
}
© www.soinside.com 2019 - 2024. All rights reserved.