Windows mobileメニュー(Menu Bar)変更ソリューション



Windows Mobileメニュー(Menu Bar,CommandBar)は変更ソリューションを使用しています。
 
この記事は以下の2つのブログを参照してください。
 
http://hi.baidu.com/angelmeng86/blog/item/8af9570820d7e388d1581bd2.html
http://blog.163.com/aiding_001/blog/static/2290819201052445753/
 
長い間windows mobileの開発をしました。ずっとwindows mobileのMenubarを使っていますが、よくまとめてみませんでした。今日はこの方面のことを詳しく紹介します。
 
MFCで使うなら、私は普通使います。
CCommadBar m_dgCommandBar;
OnInitDialog関数で初期化してください。IDR_MENUMY_POSITIONとは、Resourceで作成されたMENUです。
 
if (!m_dlgCommandBar.Create(this) ||
        !m_dlgCommandBar.InsertMenuBar(IDR_MENU_MY_POSITION))
    {
        TRACE0("Failed to create CommandBar
"); return FALSE; // fail to create }
 
 
もちろん、CCommadBarを使わなくても、次のように作成できます。
 
SHMENUBARINFO* smb=new SHMENUBARINFO();
smb->cbSize = sizeof(SHMENUBARINFO);
smb->hInstRes = ::AfxGetInstanceHandle();
smb->hwndParent = m_hWnd;
smb->nToolBarId =IDR_DAYPLANSTART;
smb->nBmpId = 0;
smb->cBmpImages = 0;
smb->dwFlags = SHCMBF_HMENU|SHCMBF_HIDESIPBUTTON;
SHCreateMenuBar(smb);
 
このように作成すれば、以下のように直接MenuBarのハンドルを取得することができます。
 
HWND hwndMB=smb->hwndMB;
TBBUTTONINFO tbbi={0};
tbbi.cbSize=sizeof(tbbi);
tbbi.dwMask=TBIF_LPARAM|TBIF_BYINDEX;
::SendMessage(hwndMB,TB_GETBUTTONINFO,0,(LPARAM)&tbbi);
HMENU m_hMenuBar=(HMENU)tbbi.lParam;
 
コマンドバーがMFC方式で作成された場合、ここのhwndMBはCCmandBarタイプのメンバー変数m_を使用することができます。dgCommandBar.m_hWndの代わり
 
そうすれば、私たちはHMENUを得ることができます。次にHMENUを操作することができます。
 
注:
このhMenuは、MFC方式で生成されるダイアログクラスのm_を第3の点の方法で得なければならない。dgCommandBar.GetMenu()で得られたHMENUは3番目の点で得られた結果とは一致しないので、m_を操作してみたことがあります。dgCommandBar.GetMenu()方式で得られたHMENUの結果、メニューは確かに変更されましたが、効果がないと表示されました。3番目の方法で得られたhMenuは効果があります。
 
メニューの変更:
2、隠しメニュー
 
HWND hwnd = ::SHFindMenuBar(m_hWnd);

if(hwnd != NULL)

::ShowWindow(hwnd, SW_HIDE);
 
3、あるサブメニューを隠す
 
HMENU hMenu = NULL;

TBBUTTONINFO tbbi = {0};

tbbi.cbSize = sizeof(TBBUTTONINFO);

tbbi.dwMask = TBIF_LPARAM | TBIF_BYINDEX;

::SendMessageW(mbi.hwndMB, TB_GETBUTTONINFO, 1, (LPARAM)&tbbi); // 0 SoftKey1,1 SoftKey2

hMenu = (HMENU)tbbi.lParam;

EnableMenuItem(hMenu, IDM_TEST, MF_GRAYED); //      

EnableMenuItem(hMenu, IDM_TEST, MF_ENABLED); //      
 
4、あるソフトキーが使えなくなります。
::SHEnableSoftkey(mbi.hwndMB, 0, TRUE, FALSE);
 
5、メニューを動的に変更する
 
ModifyMenu(hMenu, IDM_TEST, MF_DISABLED | MF_STRING, IDM_TEST, L"      ");

InsertMenu(hMenu, beforeItem, MF_BYCOMMAND, afterItem, L”      ”); //              
DeleteMenu(hMenu, beforeItem, MF_BYCOMMAND); //         
DrawMenuBar(); //     
 
メニューハンドルを使って中のメニュー項目を修正します。また、次のような方法があります。
 
TCHAR szDrawText[100];
wcscpy(&szDrawText[0],sChangeText);sChangeText CString  ,         szDrawText     。
MENUITEMINFO mii;
memset((char *)&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE;
mii.dwTypeData = &szDrawText[0];
mii.cch = 100;
mii.fType =MFT_STRING;
GetMenuItemInfo(m_hMenuBar, ID_TAKEPHOTO, FALSE, &mii);//       
SetMenuItemInfo(m_hMenuBar, ID_TAKEPHOTO, FALSE, &mii);//       

ID_TAKEPHOTO     ID
 
6.MenuBarの選択状態を設定する
 
CheckMenuItem(m_hMenuBar,ID_MENU_MY_POSITION_DISPLAY_MY_POSITION,MF_UNCHECKED);