[翻译]-Windows CE 程序设计 (3rd 版)--5.2 公共控件(十二)

菜单条资源                                                 翻译:tellmenow
如前所述,菜单条在很多方面都像一个工具条控件。查看菜单条使用的资源,会看到这两个对象的一些差别是在于外观上。图5-7显示了一个简单菜单条。
图5-7(略):一个打开了编辑菜单(Edit)的简单菜单条。

当创建菜单条时,SHMENUBARINFO结构中的nToolBarId域被适当的设置,因为nToolBarID标识的资源不是菜单资源,而是一个用于菜单条控件的定制资源。为了创建图5-7所展示的菜单条,资源编辑器将在.RC文件中创建下面的文本:
///
// Data
//
IDM_MENU SHMENUBAR MOVEABLE PURE
BEGIN
    IDM_MENU, 4,
    I_IMAGENONE, IDM_SHAREDNEW, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, IDS_SHNEW,
    0, NOMENU,
    I_IMAGENONE, ID_EDIT, TBSTATE_ENABLED,
    TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_EDIT, 0, 0,
    I_IMAGENONE, IDM_MAIN_COMMAND1, TBSTATE_ENABLED,
    TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_HELP, 0, 1,
    0, ID_BACKBTN, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, 0, ID_BACKBTN, 2,
END
  
///
// Menu bar
//
IDM_MENU MENU DISCARDABLE
BEGIN
    POPUP "Edit"
    BEGIN
        MENUITEM "Cut",                         ID_EDIT_CUT
        MENUITEM "Copy",                        ID_EDIT_COPY
        MENUITEM "Paste",                       ID_EDIT_PASTE
    END
    POPUP "Tools"
    BEGIN
        MENUITEM "About",                       IDM_HELP_ABOUT
        MENUITEM "Options",                     ID_TOOLS_OPTIONS
    END
END

大多数情况下,不需要准确的知道资源编辑器在资源中放置了什么资源。然而,有必要了解格式,这样可以容易的更改使用了菜单条的应用程序,也可以在碰到使用的设备上资源编辑器不能创建菜单条控件的时候,来方便使用。资源实际上就是对工具条上按钮的描述。下面的代码提供了前述数据的格式:
IDM_MENU SHMENUBAR MOVEABLE PURE
BEGIN
    IDM_MENU, 4,
  
    I_IMAGENONE, IDM_SHAREDNEW,     TBSTATE_ENABLED,
      TBSTYLE_AUTOSIZE,                    IDS_SHNEW,    0,         NOMENU,
  
    I_IMAGENONE, ID_EDIT,           TBSTATE_ENABLED,
      TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_EDIT, 0,         0,
  
    I_IMAGENONE, IDM_MAIN_COMMAND1, TBSTATE_ENABLED,
      TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_HELP,     0,         1,
  
    0,           ID_BACKBTN,        TBSTATE_ENABLED,
      TBSTYLE_AUTOSIZE,                    0,           ID_BACKBTN, 2,
END

资源文件中的第一行中,IDM_MENU是资源ID,SHMENUBAR是资源类型,MOVEABLE和PURE是资源标志。IDM_MENU作为ID需要传递到SHCreateMenuBar的SHMENUBARINFO 结构中。资源类型SHMENUBAR实际上被向导定义成了RCDATA,资源编译器将它理解成一个由应用程序使用的简单资源数据块。这一点很重要,因为SHMENUBAR并没有被定义在Pocket PC 的包含文件(include files)中,只有使用Pocket PC 应用向导(AppWizard)来创建菜单条资源时才会包含它。所以,对于非向导产生的菜单条资源文件,需要加入以下内容到RC文件中:#define  SHMENUBAR RCDATA

BEGIN/END块中第一行数据是:IDM_MENU, 4。这一行定义了菜单资源,用于创建菜单条上单独的弹出菜单。数字4表示该项在SHMENUBAR资源中的编号。每一项要么是菜单条上的弹出菜单,要么就是一个按钮。

因为书本印刷格式的原因,导致大家看到的前面的资源描述中每项的描述都被折成了两行。让我们看一下资源中的最后一项--回退(Back)按钮项:
0,    ID_BACKBTN, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, 0,  ID_BACKBTN, 2,

对该行进行垂直折行,加入注释后,资源描述如下:

0,                            // Bitmap index
ID_BACKBTN,                   // WM_COMMAND ID value
TBSTATE_ENABLED,              // Initial state of "button"
TBSTYLE_AUTOSIZE,             // Style of "button"
0,                            // String resource ID of text label
ID_BACKBTN,                   // String resource ID of tooltip
2,                            // Submenu index

菜单条上该项的图片在位图数组中的索引就包含在第一个域中。如果该项没有位图,就设置成I_IMAGENONE。在上面的例子中,使用的图片是位图数组中的第一个。下一个域包含该项的ID值。对按钮来说,该值就是当按钮被点压时随WM_COMMAND消息发送到父窗口的那个ID值。对于菜单来说,当查询子菜单句柄的时候可以用这个ID来标识子菜单。因为shell在菜单条中会使用自己的ID集合,所以应用程序不应该使用小于100的值。这条规则一样适用于菜单、按钮以及字符串资源ID。

菜单条使用两个预定义的菜单项ID:IDM_SHAREDNEW 和 IDM_SHAREDNEWDEFAULT。这两个ID会添加一个New(新建)菜单项,用来显示其它应用程序注册的菜单项。两个ID的区别是,简单的点一下菜单项,IDM_SHAREDNEWDEFAULT就会显示一个新的菜单项。而使用IDM_SHAREDNEW,则将New菜单变成了一个带下拉箭头的按钮。在New按钮上点击,会发送WM_COMMAND消息到父窗口,指出应该创建一个新文档。在箭头上点击则显示新菜单自身。对于非Pocket PC系统,只有当shell为系统提供New菜单支持的时候,New菜单才会显示在菜单条上,否则,预定义的新菜单项ID将被忽略。

接下来的两个域是按钮/根菜单项的初始状态和风格。状态域使用的是工具条的状态标志来进行描述的,例如TBSTATE_ENABLED 和TBSTATE_CHECKED。对于菜单,状态几乎总是TBSTATE_ENABLED。风格域也是使用工具条风格标志来描述的,例如用于按钮的TBSTYLE_BUTTON,用于菜单项的TBSTYLE_DROPDOWN。有文本而不是位图的项以及包含位图的项通常也会设置TBSTYLE_AUTOSIZE 来告诉菜单条调整按钮的尺寸来适应菜单项中的文本。

下一个域是菜单项文本的字符串资源ID。文字和第一个域中指定的图片是并排摆放的。在上面的例子中,该项只是一个简单的位图按钮,所以没有指定字符串资源。对菜单项来说,是字符串资源来标记菜单,而不是在菜单资源中指定的子菜单名。如果需要的话,您可以使用7个预定义的字符串ID,它们作为自解释型常量被定义在Aygshell.h文件中。
#define IDS_SHNEW           1
#define IDS_SHEDIT          2
#define IDS_SHTOOLS         3
#define IDS_SHVIEW          4
#define IDS_SHFILE          5
#define IDS_SHGO            6
#define IDS_SHFAVORITES     7
#define IDS_SHOPEN          8
如果您需要一个不同的文本,那么您的应用程序必须用字符串资源定义文本,并将ID传递到这个域中。下一个域是工具提示信息(tool tip)域。同样,您必须使用字符串资源ID来填充这个域。

最后一个域规定了子菜单,当用户点这个项,就会弹出来。只有风格域包含TBSTYLE_DROPDOWN标志(表示该项附加了一个菜单),这个子菜单值才是有效的。这个值代表子菜单的菜单资源索引。本节提到的例子中有两个子菜单:编辑(Eidt)菜单,包含了Cut,Copy和Paste三个菜单项;工具(Tools)菜单,包含About和选项(Options)两个菜单项。 按钮上显示的文字是来自菜单条资源中,而不是来自菜单资源。例如,

可以按下面的代码来修改菜单资源,而不用改变菜单条中的文本。
///
// Menu bar
//
IDM_MENU MENU DISCARDABLE
BEGIN
    POPUP "Cat"
    BEGIN
        MENUITEM "Cut",                         ID_EDIT_CUT
        MENUITEM "Copy",                        ID_EDIT_COPY
        MENUITEM "Paste",                       ID_EDIT_PASTE
    END
    POPUP "Dog"
    BEGIN
        MENUITEM "About",                       IDM_HELP_ABOUT
        MENUITEM "Options",                     ID_TOOLS_OPTIONS
    END
END
现在,根菜单名字是Cat和Dog,而不是Edit和Options。因为菜单条从菜单条项中取名字,而不是从菜单资源中取,所以这个改变并没有影响应用程序。

对菜单条的长篇描述是让您了解基础知识。只有在很少见的情况下,才需要您手工操纵资源。当然,这些知识很容易使用的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值