一. MFC下创建菜单
从网上得知,基于SDK的程序,菜单的创建是从SHCreateMenuBar开始,于是我想基于MFC的单文档应用程序最终也是调用了这个函数的吧,果不其然。m_wndCommandBar.InsertMenuBar里面就调用了SHCreateMenuBar这个函数,既然基于SDK和MFC的应用程序的运行是差不多的,而结果是不一样,则事情最后应该是归结到了菜单资源的创建上了。细观MFC 的应用程序的菜单,仅仅有一个IDR_MAINFRAME的菜单,一个OK按钮而已。
后来到网上找一些资料,发现要创建自己的菜单,并且要修改res目录下的<工程名>.rc2这个资源文件。
最终,我在<工程名>.rc中创建了个菜单,菜单项的定义如下:
IDR_MENU MENU
BEGIN
POPUP "Test"
BEGIN
MENUITEM "Pop", ID_TEST_POP
END
END
后来在<工程名>.rc2增加了这个:
IDR_MENUBAR SHMENUBAR DISCARDABLE
BEGIN
IDR_MENU,
2,
I_IMAGENONE, IDM_START, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, IDS_START, 0, NOMENU,
I_IMAGENONE, IDM_STOP,TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_STOP, 0, 0,
END
在Resourcesp.h中定义了相应的标识符以及字符串资源后,编译运行后,终于在模拟器中出现了我所定义的菜单。
各个项的说明如下:
IDR_MENU 是我定义的弹出菜单,注意这里的名字要和下面IDR_MENUBAR SHMENUBAR中紧接在BEGIN后面的第一个参数一致。这样才能实现按right soft key时可以弹出菜单来。
IDR_MENUBAR SHMENUBAR中的参数下面逐一说明:
IDR_MENU 我们要用软键显示的菜单的子菜单名字
2 说明这个MenuBar上有几个菜单项,Smartphone只能有两个(为什么?如果你的Smartphone有三个软键你可以定义三个,哈哈)
I_IMAGENONE Smartphone菜单不支持带有bitmap的,所以这里采用这个定义
IDM_START 这个是我们用来在WM_COMMAND中处理控件的标识
TBSTATE_ENABLED 这个代表菜单的启用状态
TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE 菜单的样式,具体可以查MSDN中WinCE ToolBar Sytle。
TBSTYLE_DROPDOWN 这个也是样式,如果你的菜单有子菜单,那么这里必须要用这个样式
IDS_START 菜单上显示的字,实现在字符串资源中定义
最后的0 子菜单的索引,大家注意,我的IDR_MENU的定义第一项就是一个POPUP式的菜单,所以我这里设置的是0
NOMENU 代表该菜单项没有子菜单
”
二. 动态更改菜单的文字
HWND hMenu = SHFindMenuBar( hWnd );
TBBUTTONINFO buttonInfo;
ZeroMemory( &buttonInfo, sizeof( TBBUTTONINFO ) );
buttonInfo.cbSize = sizeof( TBBUTTONINFO );
buttonInfo.dwMask = TBIF_TEXT;
buttonInfo.pszText = _T("Test");
::SendMessage( hMenu, TB_SETBUTTONINFO, IDM_OK, (LPARAM)buttonInfo );
::UpdateWindow( hMenu );