注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

回首望星辰

See you in the next world

 
 
 

日志

 
 

windows mobile 菜单总结  

2009-04-28 17:21:45|  分类: 手机开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

牵扯到的知识点:
1. 下方那个叫做MenuBar(其实是工具栏),但不要理解成字面上的,实质上它上面既可以放软键,也可以放菜单。
用SHCreateMenuBar 来创建MenuBar

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)

==============================================

1。创建并显示菜单
 SHMENUBARINFO mbi;
  ZeroMemory(&mbi, sizeof(SHMENUBARINFO));
  mbi.cbSize=sizeof(SHMENUBARINFO);
  mbi.hwndParent=m_hWnd;
  mbi.hInstRes=::AfxGetInstanceHandle();

//注意下面的SHCMBF_HMENU,意思是直接使用菜单资源,那样创建的工具栏条只有一个菜单

//如果要创建SHMENUBAR(RCDATA)定义的工具栏,则不能添加 SHCMBF_HMENU
  mbi.dwFlags=SHCMBF_HMENU|SHCMBF_HIDESIPBUTTON;//隐藏SIP
  mbi.nToolBarId=IDR_MYMENU;
  SHCreateMenuBar(&mbi);

2。隐藏菜单
HWND hwnd=::SHFindMenuBar(m_hWnd);
 if(hwnd!=NULL)
  ::ShowWindow(hwnd,SW_HIDE);

3。隐藏某个子菜单
 TBBUTTONINFO tbbi = {0};
   tbbi.cbSize = sizeof(TBBUTTONINFO);
   tbbi.dwMask = TBIF_LPARAM | TBIF_BYINDEX;        

//只有当软键为菜单的时候才能获取到HMENU        
   ::SendMessageW(mbi.hwndMB, TB_GETBUTTONINFO,1, (LPARAM)&tbbi); //0为SK1(左软键),1为SK2(右软键)
   g_hMenu = (HMENU)tbbi.lParam;//g_hMenu为全局变量,这样就可以在任何地方隐藏子菜单了

 EnableMenuItem(g_Menu,ID_TEST,MF_GRAYED);//隐藏子菜单

//隐藏菜单::RemoveMenu(m_hRightMenu,ID_SETTINGS_SYNC, MF_BYCOMMAND);
//显示子菜单 EnableMenuItem(g_Menu,ID_TEST,MF_ENABLED);

4。使某个SK不可用
::SHEnableSoftkey(mbi.hwndMB,0,TRUE,FALSE);

  评论这张
 
阅读(590)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017