1

C/C++ で Windows Mobile 6 用のアプリケーションを作成しています。通常どおり、2 つのソフトキーがあり、そのうちの 1 つはメニューです。このメニューにはポップアップ メニューがあります。以下は、 からのソフト キーの (削除されたresources.rc) ソースと、 からのいくつかの定義ですresource.h

#define IDR_MAIN_MENU  130
#define IDM_LOCK       30006
#define IDM_MAIN_MENU  30007

IDR_MAIN_MENU RCDATA
{
    IDR_MAIN_MENU,
    2,
    I_IMAGENONE, IDM_LOCK     , TBSTATE_ENABLED, TBSTYLE_AUTOSIZE | TBSTYLE_BUTTON  , IDS_LOCK, 0, NOMENU,
    I_IMAGENONE, IDM_MAIN_MENU, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE | TBSTYLE_DROPDOWN, IDS_MENU, 0, 0,
}

IDR_MAIN_MENU MENU
{
    POPUP "Menu"
    {
        MENUITEM "Keep display"     IDM_KEEP_DISPLAY_TURNED_ON
        MENUITEM "Keep backlight"   IDM_KEEP_BACKLIGHT_TURNED_ON
        POPUP "Min battery level"
        {
            MENUITEM "None" 0
            MENUITEM SEPARATOR
            MENUITEM "5%"  0
            MENUITEM "10%" 0
            ...
        }
        MENUITEM "Exit"             IDM_EXIT
    }
}

ユーザーがメニューを開いたときに、それを変更したい-チェック、チェックを外す、有効にする、アイテムを無効にするなど.だから私はWM_INITMENUPOPUPメッセージを次のように処理するWndProc():

case WM_INITMENUPOPUP:        
    switch (LOWORD(lParam))
    {
    case IDM_MAIN_MENU:
        OnMainMenuInit(reinterpret_cast<HMENU>(wParam));
        break;
    }
    break;

これで、ユーザーがメイン メニューを開くと、OnMainMenuInit() が呼び出されます。これはうまくいきます。

今問題について。「最小バッテリーレベル」サブメニューを開く処理を別途行いたいです。サブメニューを開くとWM_INITMENUPOPUPメッセージが表示され、メニューのハンドル (メイン メニューの場合は 0x0A5B0B74、サブメニューの場合は 0x0A5BA924 など) も取得されますが、「最小バッテリー レベル」サブメニューには、識別に使用できる「コマンド ID」がありません。2メインメニューの「最小バッテリーレベル」項目の位置であるとして取得しますが、 「最小バッテリーレベル」サブメニューを識別するためにLOWORD(lParam)これをハードコーディングするという考えは好きではありません。メニュー項目を追加すると、2このハードコードも変更2します。

の「最小バッテリーレベル」サブメニューを識別する方法に関するアドバイスはありWM_INITMENUPOPUPますか? 「識別」とは、「このメニューが最小バッテリーレベルであることをどのように知るか」(「最小バッテリーレベルサブメニューのハンドルとは」ではなく) を意味します。

4

2 に答える 2

1

2 を使用して、 経由でメニュー項目 ID を復元できますGetMenuItemID

switch (GetMenuItemID(GetMenu(hwnd), LOWORD(lParam)))
{
case IDM_MIN_BATTERY_LEVEL: ...
}

MENUEXサブメニューに ID を付与するには、を使用する必要があります。

于 2011-11-28T00:19:27.133 に答える
0

これは古い質問であることは承知していますが、WM_INITMENUPOPUP メッセージがどのように機能するかについてのわずかな誤解が問題を引き起こしています。

LOWORD(lParam) 値は、メイン メニュー項目の 0 ベースのインデックス値です。したがって、通常のアプリケーションでは、ファイル メニューの値は 0 で、その右隣は編集メニューの値が 1 である可能性があります。すぐ。

HIWORD(lParam) の値は、復元、最小化、閉じるメニューなどのシステム メニュー用です。

だからここに問題に対する私の解決策があります

case WM_INITMENUPOPUP:        
    switch (lParam)
    {
    case 0: // The Menu item
        OnMainMenuInit(reinterpret_cast<HMENU>(wParam));
        break;
    }
    break;

ファイルや編集メニューのような最上位のポップアップ メニューのインデックス番号を推測するのは簡単ですが、この質問 (POPUP "最小バッテリー レベル") のような第 2 レベルのポップアップ メニューはやや難しいです。

于 2015-01-05T23:42:58.220 に答える