guest
浏览(0) +
2007-10-15 15:11:21 发表
编辑
关键字:
ppc 菜单问题收集贴 来自 http://blog.csdn.net/tellmenow/archive/2006/08/06/1026197.aspx [翻译]-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。因为菜单条从菜单条项中取名字,而不是从菜单资源中取,所以这个改变并没有影响应用程序。 对菜单条的长篇描述是让您了解基础知识。只有在很少见的情况下,才需要您手工操纵资源。当然,这些知识很容易使用的。
guest
2007-10-15 15:12:27 发表
编辑
一个声称解决的人 http://bbs.mscommunity.com/FORUMS/ShowThread.aspx?PostID=30273 如何在Smartphone的Win32程序中使用Windows的通用菜单资源(MENU而不是SHMENUBAR)? 请教高手:如何在Smartphone的Win32程序中使用Windows的通用菜单资源(MENU而不是SHMENUBAR)? 我的项目是 Smartphone 的 Win32 应用程序,SHMENUBAR 的资源太不好编辑,想用Windows的通用的菜单资源(MENU),可用了好多办法,搞了快一天,始终也没有成功,请高手指点一下! 如有那位高手帮我解决,不胜感激,在下免费赠送一套Visual Studio 2005(Team)安装光盘! 我的MSN:whikiey@hotmail.com IP 地址: 已记录 2006-03-24, 10:33 AM BLOODream 性别: 等级: 新手上路 注册: 2005-05-20 发贴: 14 职务: 会员 Re: 请教高手:如何在Smartphone的Win32程序中使用Windows的通用菜单资源(MENU而不是SHMENUBAR)? 没有人回复,本人已经搞定了,只是安装光盘没有送出,真可惜! IP 地址: 已记录 2006-03-28, 04:32 PM freerabbit 等级: 新手上路 注册: 2005-12-16 发贴: 5 职务: 会员 Re: 请教高手:如何在Smartphone的Win32程序中使用Windows的通用菜单资源(MENU而不是SHMENUBAR)? 请问能否告诉我如何解决的吗?我也正好遇到同样一个问题。资源文件里的RCDATA不知怎么来的? IP 地址: 已记录 2006-04-10, 10:25 AM BLOODream 性别: 等级: 新手上路 注册: 2005-05-20 发贴: 14 职务: 会员 Re: 如何在Smartphone的Win32程序中使用Windows的通用菜单资源(MENU而不是SHMENUBAR)? 前一段由于时间比较忙没有将解决办法贴给大家,本人也只是经过一整天摸索,才对SHMENUBAR资源有些了解,现将源代码放出,希望对大家在写菜单程序的时候能有所帮助。 VS 2005 里生成的资源文件分为两部分,一个*.rc,一个*.rc2,在*.rc2中有一个SHMENUBAR的资源,我们可以将这个资源和普通菜单资源建立关联,下面是某个*.rc2资源里的一段代码,我加了注释: ///////////////////////////////////////////////////////////////////////////// // // Data // IDR_MENUBAR SHMENUBAR DISCARDABLE BEGIN IDR_MENU, // 与之对应的Windows菜单资源的ID 2, // 主菜单个数 // 子菜单1 I_IMAGENONE, // 应该是菜单位图的标志(没用到,应该是BITMAP的ID), IDM_OPEN, // SHMENUBAR 资源的ID TBSTATE_ENABLED, // 菜单项的最初状态 TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, // 菜单的样式 // TBSTYLE_BUTTON 表示没有子项 // TBSTYLE_DROPDOWN 为包含子菜单的项 // TBSTYLE_AUTOSIZE为自动调整大小 IDS_OPEN, // 与菜单的文字对应的字符串资源中的ID 0, // 这个“0”一直也没搞懂 NOMENU, // 这个菜单项对应的Windows菜单资源中的从0开始的索引(NOMENU为-1,表示没有子菜单) // 子菜单2 I_IMAGENONE, IDM_OPTIONMENU, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_OPTION, 0, 1, END 好,知道这些功能就可以很容易和 Windows 菜单建立关联了。 谢谢大家的支持,如果有什么问题可以给我发邮件,或者MSN,我们一块来研究解决 whikiey@hotmail.com
guest
2007-10-15 15:16:22 发表
编辑
http://www.winbile.net/Detail.aspx?D=260,1116062 VS2005开发本地代码Smartphone程序,菜单编辑器有严重Bug Author: 杰仔 转载时间: 2007-06-29. [文章来源:blog.csdn] 无论怎么编辑,编译出来的菜单都是默认的。因为RES目录的rc2资源文件VS2005没有改。总是这样的: IDR_MAINFRAME SHMENUBAR DISCARDABLE BEGIN IDR_MAINFRAME, 1, I_IMAGENONE, IDOK, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, IDS_OK, 0, NOMENU, END 所以,无论怎么编辑都不行。 解决方法: 先改一下这个文件再编辑菜单。 比如说,改成这样: IDR_MAINFRAME SHMENUBAR DISCARDABLE BEGIN IDM_MENU, 2, I_IMAGENONE, IDOK, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, IDS_OK, 0, NOMENU, I_IMAGENONE, IDM_MENU, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_MENU, 0, 0, END 那么,需要在编辑器中创建一个ID为IDM_MENU的菜单条,再建立一个IDS_MENU的字符串资源,改字符串就是显示出来的菜单的名字。 经过后续查证,VS2005针对Smartphone的菜单编辑器就是这样设计的,也就是在菜单编辑器中编辑的只是菜单的内容,这些内容是保存在rc文件中的,而菜单条是作为RCDATA保存在rc2资源文件中。 其思路应该源于WM5.0对与菜单的全新设计。在WM5.0中,无论是ppc中的菜单还是sp中的菜单,都是一样的,即支持左右软键,左右软键 分别可以弹出一个菜单。所以,微软认为这个东西不是菜单,是工具条,而真正的菜单是左右软键弹出的那个东西。所以,在菜单编辑器中编辑的是左右软键弹出的 菜单,而在rc2文件中保存的是工具条的定义。 也就是说,我们把编辑菜单的问题称为Bug也好,称为其他也好,但是总而言之,现在基于Smpartphone和wm5.0的本地代码开发,对于“工具条”的定义需要我们自己手动完成了。 针对RCDATA的定义,有一些说明: IDR_MAINFRAME SHMENUBAR DISCARDABLE IDR_MAINFRAME是在程序中load工具条的ID,在resources.h中定义一个ID就可以了。 SHMENUBAR DISCARDABLE不清楚,照抄就可以了。 BEGIN IDM_MENU, IDM_MENU是在菜单编辑中编辑菜单的ID,此菜单对于smartphone2003来说,横向的定义只能有一项(且文字内容是什么无关紧要),因为smartphone2003只支持左右键中一个是弹出菜单。对于wm5.0来说,可以有两项(尚未验证)。 2, 1或者2,取决于要左键还是左右都要。 I_IMAGENONE, IDOK, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, IDS_OK, 0, NOMENU, 如果是button性质的,要定义为TBSTYLE_BUTTON,并且最后是NOMENU。IDOK为在资源头文件中随便定义的ID就可以,IDS_OK对应的字符串资源是将来显示的内容。 I_IMAGENONE, IDM_MENU, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_MENU, 0, 0, 如果是弹出式菜单,定义为TBSTYLE_DROPDOWN,且最后一位为0。IDM_MENU为在资源头文件中随便定义的ID就可以。 END END之后一定要加一个回车,否则编译报fatal error RC1004的错误。 更详细的内容,可以看一下这个网址: http://blogs.msdn.com/johnkenn/archive/2005/08/22/454858.aspx
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.