SHMenuBar学习整理
来源:互联网 发布:淘宝安卓版官方下载 编辑:程序博客网 时间:2024/05/01 04:41
原文来自:http://hi.baidu.com/donghaozheng/blog/item/2165c3112f5c8d17b8127bc7.html
stuido 2008
New Project -- Other languages-- virual c++ -- Smart Device-- Win32 Smart Device Project
生成的工程模型比较简洁,下方menu bar 左边是一个用来退出程序的soft key,右边是一个菜单。
牵扯到的知识点:
1. 下方那个叫做MenuBar,但不要理解成字面上的,实质上它上面既可以放软键,也可以放菜单。
用SHCreateMenuBar 来创建MenuBar,摘录小段代码:
SHMENUBARINFO mbi;
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hwndParent = hWnd;
mbi.nToolBarId = IDR_MENU;
mbi.hInstRes = g_hInst;
if (!SHCreateMenuBar(&mbi))
{
g_hWndMenuBar = NULL;
}
else
{
g_hWndMenuBar = mbi.hwndMB;
}
2. 工程里有个以rc2后缀的文件,也是工程的资源文件, 用于VC++不能直接进行编辑的资源,以及被多个工程使用的资源。这个文件中的资源不能在VC的集成环境下直接进行编辑和修改, 而是由我们自己根据需要手工地编辑这个文件。
这里生成的rc2文件就是定义了SHMenuBar的资源。
//
// SHMENUBAR
//
IDR_MENU SHMENUBAR DISCARDABLE //资源类型(实际就是RCDATA)
BEGIN
IDR_MENU, //菜单资源的ID,因为不同的资源类型ID可以相同,系统这里用了与SHMENUBAR 相同的ID。
2,//MenuBar上按钮或菜单数目
I_IMAGENONE, IDM_OK, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE,
IDS_OK, 0, NOMENU,
I_IMAGENONE, IDM_HELP, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE,
IDS_HELP, 0, 0,//最后这个数字是对应的菜单资源的菜单项的序号(0代表一个菜单项)
END
一般来说,WM建议左边键是一个常用的操作,右边键是菜单。所以默认生成的也正是这种模式。
两边都是菜单一般不会用,太不友好,如果两边都想是按钮,可以如下改:
IDR_MENU SHMENUBAR DISCARDABLE
BEGIN
0,
2,
I_IMAGENONE, IDM_OK, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE,
IDS_OK, 0, NOMENU,
I_IMAGENONE, IDM_HELP, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE,
IDS_HELP, 0, NOMENU,
END
在消息处理函数里,处理WM_COMMAND消息,来处理不同的按键。
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_HELP:
DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);
break;
case IDM_OK:
SendMessage (hWnd, WM_CLOSE, 0, 0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
3.可以通过参数设置,来通过不同方式或者完成不同效果的MenuBar
//set up menu bar structure
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hwndParent = hDlg;
mbi.hInstRes = g_hInst;
switch(g_dwCreateMenuType)
{
case ID_SHCREATEMENUBAR_RCDATA:
mbi.nToolBarId = IDR_CMB_CMDBAR;//RCDATA资源类型,二进制
break;
case ID_SHCREATEMENUBAR_HMENU:
mbi.dwFlags = SHCMBF_HMENU;
mbi.nToolBarId = IDM_CMB_MENU;//菜单资源
break;
case ID_SHCREATEMENUBAR_EMPTYBAR:
mbi.dwFlags = SHCMBF_EMPTYBAR;
break;
case ID_SHCREATEMENUBAR_NOSIPBUTTON:
mbi.dwFlags = SHCMBF_EMPTYBAR|SHCMBF_HIDESIPBUTTON;
break;
case ID_SHCREATEMENUBAR_HIDDENMENUBAR:
mbi.dwFlags = SHCMBF_HMENU;//设置此单数但不设置nToolBarId,会隐藏MenuBar
break;
default:
break;
}
if (FALSE == SHCreateMenuBar(&mbi))
{
MessageBox(hDlg, _T("SHCreateMenuBar Failed"), _T("Error"), MB_OK);
}
//retain the hwnd to the toolbar to destroy it if necessary
hwndMB = mbi.hwndMB;
4. RCDATA 格式说明
/////////////////////////////////////////////////////////////////////////////
//
// RCDATA
//
IDR_MENUOK RCDATA
BEGIN
0, // menu
1, // Count of buttons
I_IMAGENONE,
IDC_OK,
TBSTATE_ENABLED,
TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE,
IDS_OK,
0,
NOMENU,
END
IDM_MAIN_MENU RCDATA
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
说明:
IDR_MENU 我们要用软键显示的菜单的子菜单名字
2 说明这个MenuBar上有几个菜单项
I_IMAGENONE 菜单不支持带有bitmap(0xfffe)
IDM_START 用来在WM_COMMAND中处理控件的标识
TBSTATE_ENABLED 代表菜单的启用状态(0x0004)
TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE
菜单的样式,具体可以查MSDN中WinCE ToolBar Sytle。
TBSTYLE_DROPDOWN 这个也是样式,如果你的菜单有子菜单,那么这里必须要用这个样式
IDS_START 菜单上显示的字,实现在字符串资源中定义
最后的0 子菜单的索引
NOMENU 代表该菜单项没有子菜单(0xffff)
- SHMenuBar学习整理
- SHMenuBar学习整理
- SHMenuBar学习整理
- Android学习整理-Intent整理
- OWB学习经验整理
- MO学习整理
- 学习整理清单
- J2ME学习笔记整理
- OPENSSL 学习整理-介绍
- OPENSSL 学习整理-介绍
- spring 学习jpetstore整理(-)
- 正则表达式学习整理
- java学习整理笔记
- 整理学习笔记
- .NET(C#)学习整理
- linux 学习笔记整理
- MSSQL学习资料整理
- MSSQL学习资料整理
- Firefox最新版本存在内存溢出漏洞或被攻击的可能性
- 如何在X64系统上配置ASP.NET程序
- 报textcopy不是可执行文件的话,解决方法(接上篇内容)
- 运行MapXtreme的Web应用程序报错; COM+ 激活方法!
- 调用server.createObject("excel.application")时发生错误
- SHMenuBar学习整理
- aspx页面事件执行顺序
- j2me 程序优化
- HTML -- Head -- Meta的功效
- liferay资源
- 隐藏在SWT/Swing背后的故事
- 创建ACCESS 2000数据库
- JQuery
- JBPM揭密