65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (4投票s)

2003年3月20日

CPOL

2分钟阅读

viewsIcon

84309

downloadIcon

167

如何在 PocketPC 2002 应用程序的命令栏中启用和禁用顶级弹出菜单。

Sample Image - CeMultiBarMenu.jpg

引言

本文介绍了一种禁用使用 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 注意到某些按钮的文本在灰显时被截断。 事实上,当工具栏禁用文本按钮时,它会以白色阴影的灰色绘制它,使文本宽一个像素。 不用说,容纳此文本的矩形没有改变,文本被剪裁了...

下一种方法基于支持所有工具栏的 CToolBarCtrlGetButtonInfoSetButtonInfo 方法。 通过这些方法,我设置了 TBBUTTONINFO 结构的多个属性,即 fsStatecx。 第一个用于设置按钮状态(启用或禁用),第二个用于在禁用时增加按钮大小,并在启用时将其减小。

我将解决方案封装在 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 中的多个工具栏 中使用的同一项目的改编,但有一些变化,即

  • 所有工具栏上的工具提示
  • 工具栏现在是独占显示的
© . All rights reserved.