CSDN博客

img mrdone

如何使用VC自定义菜单

发表于2008/9/28 10:54:00  2218人阅读

 菜单条在很多方面都像一个工具条控件。查看菜单条使用的资源,会看到这两个对象的一些差别是在于外观上。图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 0

相关文章推荐

img
取 消
img