VC toolbar group

aerospace 2008-04-25 09:20:42

VC中,toolbar中,我把按钮设置成group 的形式 m_wndToolBar.SetButtonStyle(0,TBBS_CHECKGROUP );
m_wndToolBar.SetButtonStyle(1,TBBS_CHECKGROUP );
m_wndToolBar.SetButtonStyle(2,TBBS_CHECKGROUP );
操作中,3个按钮互斥

我想初始化的时候一个按钮处于被按下状态,怎么搞?

会的人估计很简单,找了一下没找到例子。有例子的说下怎么搞?

我想菜单和toolbar上快捷按钮关联, 当选择某个菜单时,在菜单前面打勾,相应按钮按下;同样,某个按钮按下时,在相应菜单前打勾。
...全文
91 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2008-04-26
  • 打赏
  • 举报
回复
MFC的OnUpdateCmdUI机制就是做这个的啊。为菜单添加一个UPDATE_COMMAND_UI事件消息的响应。


通常情况下,菜单项和工具栏按钮具有一个以上的状态。例如,如果菜单项在当前上下文中不可用,则它会变灰(无效)。也可选中或取消选中菜单项。如果工具栏按钮不可用,也可将其禁用;否则可以选中它。

当程序条件更改时,谁更新这些项的状态?在逻辑上,如果菜单项生成由某个对象(比方说文档)处理的命令,让文档更新菜单项是合情理的。文档可能包含更新所依据的信息。

如果命令具有多个用户界面对象(或许是一个菜单项和一个工具栏按钮),则两者都传送到同一处理函数。这将封装单个位置上的所有等效用户界面对象的用户界面更新代码。

框架提供了用于自动更新用户界面对象的便利接口。您可选择以其他方式进行更新,但框架提供的接口效率高且容易使用。


假设用户在“文件”菜单上单击鼠标,从而生成 WM_INITMENUPOPUP 消息。框架的更新机制在菜单下拉前集中更新“文件”菜单上的所有项,以便用户可以看到该消息。

为此,框架沿标准命令路径为弹出菜单中的所有菜单项传送更新命令。路径上的命令目标将有机会更新所有菜单项,进行更新的方法是将更新命令同 ON_UPDATE_COMMAND_UI 窗体的适当消息映射项相匹配,然后调用“更新处理”函数。因而,对于有六个菜单项的菜单会发送六个更新命令。如果菜单项的命令 ID 有更新处理程序,则将调用该处理程序进行更新。如果没有,框架将检查该命令 ID 的处理程序是否存在,然后根据需要启用或禁用该菜单项。

如果框架在命令传送过程中没有找到 ON_UPDATE_COMMAND_UI 项,它将自动启用用户界面对象,前提是某处存在具有相同命令 ID 的 ON_COMMAND 项。否则框架将禁用用户界面对象。因此,若要确保启用用户界面对象,请提供该对象所生成命令的处理程序或提供它的更新处理程序。请参见用户界面对象和命令 ID 主题中的图。

可以禁用用户界面对象的默认禁用。有关更多信息,请参见“MFC 参考”中 CFrameWnd 类的 m_bAutoMenuEnable 成员。

菜单初始化在框架中自动完成,并在应用程序接收到 WM_INITMENUPOPUP 消息时发生。在空闲循环过程中,框架在命令路径中搜索按钮更新处理程序,所采用的方式与搜索菜单基本相同。


使用“属性”窗口将用户界面对象连接到命令目标对象中的命令更新处理程序。它自动将用户界面对象的 ID 连接到 ON_UPDATE_COMMAND_UI 宏,并在对象中创建将要处理更新的处理程序。有关更多信息,请参见将消息映射到函数。

例如,若要更新程序“编辑”菜单中的“全部清除”命令,请使用“属性”窗口在所选类中添加消息映射项,在类声明中添加称为 OnUpdateEditClearAll 的命令更新处理程序的函数声明,以及在类的实现文件中添加空函数模板。函数原型如下所示:

afx_msg void OnUpdateEditClearAll( CCmdUI* pCmdUI );
与所有处理程序一样,该函数也显示 afx_msg 关键字。与所有更新处理程序一样,它也采用一个参数,即指向 CCmdUI 对象的指针。



当框架将更新命令传送到其处理程序时,它将指向 CCmdUI 对象(或指向 CCmdUI 派生类对象)的指针传递给处理程序。该对象表示生成此命令的菜单项、工具栏按钮或其他用户界面对象。更新处理程序通过指针调用 CCmdUI 结构的成员函数以更新用户界面对象。例如,下面是“全部清除”菜单项的更新处理程序:

void CMyClass::OnUpdateToolsMyTool( CCmdUI* pCmdUI )
{
if( ToolAvailable() )
pCmdUI->Enable( TRUE );
}
该处理程序调用可访问此菜单项的对象的 Enable 成员函数。Enable 使此菜单项可用。



(从MSDN复制的)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧