[我在网上找到了一篇文章,说将工具栏按钮设置为持续按下的类型,您只需在按钮上设置样式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);
}
}
在此处建议使用Command Handlers。可以在多个UI项(例如菜单项和工具栏按钮)中使用命令ID。处理程序会影响具有相同ID的所有项目,因此您无需为每个项目单独设置一个项目。 CCmdUI Class提供的方法除了启用/禁用之外,还可以使UI项(如菜单或工具栏按钮)充当按钮,复选框或单选按钮。
在您的示例中,假设是否要过滤的选项是在每个文档的基础上实例化的,即文档的所有视图将同时过滤或不过滤。您应该在文档类中定义一个布尔变量:
BOOL m_bFilterData = FALSE;
然后使用筛选器图片(可能还有菜单项)为工具栏按钮的ON_COMMAND
和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);
}