Using 命令处理程序 https://learn.microsoft.com/en-us/cpp/mfc/how-to-update-user-interface-objects?view=vs-2019是这里推荐的实现。命令ID可以用在多个UI项目中,例如菜单项目和工具栏按钮。处理程序会影响具有相同 ID 的所有项目,因此您不需要为每个项目单独设置一个处理程序。这CCmdUI类 https://learn.microsoft.com/en-us/cpp/mfc/reference/ccmdui-class?view=vs-2019除了启用/禁用之外,还提供了一些方法,可以使菜单或工具栏按钮等 UI 项目充当按钮、复选框或单选按钮。
在您的示例中,假设是否过滤的选项是在每个文档的基础上实例化的,即文档的所有视图都将同时被过滤或不过滤。您应该在文档类中定义一个布尔变量:
BOOL m_bFilterData = FALSE;
然后ON_COMMAND
and ON_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);
}