Windows mobileメニュー(Menu Bar)変更ソリューション
3826 ワード
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);