禁用 PocketPC 2002 中的顶级弹出菜单






4.75/5 (4投票s)
如何在 PocketPC 2002 应用程序的命令栏中启用和禁用顶级弹出菜单。
引言
本文介绍了一种禁用使用 MFC 构建的 PocketPC 2002 应用程序的命令栏中嵌入的顶级弹出菜单的技术。 这是我与 John Simmons / outlaw programmer 就 MFC 下 PocketPC 2002 用户界面 API 的“易用性”进行的持续讨论的结果。 在我们上次讨论这些问题时,我们发现禁用顶级弹出菜单并非易事。 这是一个解决方案。
顶级弹出菜单
它们不是弹出菜单。 它们是伪造的。 它们是工具栏按钮! 我通过查看 CCeCommandBar::LoadToolBar
的实现方式得出结论。 您提供的菜单资源被分解为其弹出窗口,并为每个弹出窗口创建一个文本工具栏按钮。 因此,尝试使用 CMenu
方法启用或禁用这些按钮是没有用的,您必须操作底层按钮。
弹出菜单按钮使用从 0xF000 开始的标准 ID 创建,第一个按钮的 ID 为 0xF000,下一个按钮的 ID 递增 1。 因此,为了知道您要访问哪个按钮,您必须知道它的顺序位置。 如果您使用“共享新建”按钮,则 0xF000 将是它右边的第一个。
解决方案
我的第一个方法是使用 TB_ENABLEBUTTON
消息。 它似乎有效,直到 John Simmons 注意到某些按钮的文本在灰显时被截断。 事实上,当工具栏禁用文本按钮时,它会以白色阴影的灰色绘制它,使文本宽一个像素。 不用说,容纳此文本的矩形没有改变,文本被剪裁了...
下一种方法基于支持所有工具栏的 CToolBarCtrl
的 GetButtonInfo
和 SetButtonInfo
方法。 通过这些方法,我设置了 TBBUTTONINFO
结构的多个属性,即 fsState
和 cx
。 第一个用于设置按钮状态(启用或禁用),第二个用于在禁用时增加按钮大小,并在启用时将其减小。
我将解决方案封装在 CCeCommandBarEx
类中,该类只有一个方法(除了标准构造函数和析构函数):EnablePopupMenu
。 实现如下
BOOL CCeCommandBarEx::EnablePopupMenu(int iIndex, BOOL bEnable) { CToolBarCtrl& rToolBar = GetToolBarCtrl(); TBBUTTONINFO tbi; int nID = 0xf000 + iIndex; CSize sizeImage(16,15), sizeButton(23, 21); BOOL bRval; tbi.cbSize = sizeof(tbi); tbi.dwMask = TBIF_STATE | TBIF_SIZE | TBIF_COMMAND; tbi.idCommand = nID; bRval = rToolBar.GetButtonInfo(nID, &tbi); if(bRval) { if(tbi.fsState & TBSTATE_ENABLED) tbi.cx += bEnable ? 0 : 1; else tbi.cx -= bEnable ? 1 : 0; if(bEnable) tbi.fsState |= TBSTATE_ENABLED; else tbi.fsState &= ~TBSTATE_ENABLED; rToolBar.SetButtonInfo(nID, &tbi); SetSizes(sizeButton, sizeImage); } return bRval; }
请注意,我必须调用 SetSizes
以避免我发现的一个难以理解的错误:当增加弹出菜单按钮大小时,所有其他按钮也会改变大小。
演示项目
您会发现演示项目是我在另一篇文章 PocketPC 2002 中的多个工具栏 中使用的同一项目的改编,但有一些变化,即
- 所有工具栏上的工具提示
- 工具栏现在是独占显示的