Win32 Изменить меню в коде - PullRequest
       11

Win32 Изменить меню в коде

2 голосов
/ 24 января 2012

Я не много занимаюсь программированием Windows, но не могу понять, как это сделать ...

У меня есть панель инструментов для моего приложения, которая позволит пользователю включать и выключать определенные функции. У меня есть окна, распознающие, когда нажата одна из этих панелей инструментов, однако одна из опций использует функциональность «Проверено».

Вопрос в том, как узнать, является ли это текущим значением true или false в моем коде, а также как мне установить значение false в моем коде?

В основном мне это нужно ...

enter image description here

Чтобы выглядеть так ...

enter image description here

После того, как пользователь щелкнет по нему

Код до сих пор ...

switch (wmId)
        {
        case ID_SETTINGS_ENABLEGRAVITY:
            {
                MENUITEMINFO mii = { sizeof(MENUITEMINFO) };
                mii.fMask = MIIM_STATE;
                GetMenuItemInfo((HMENU)IDR_MENU1,ID_SETTINGS_ENABLEGRAVITY, FALSE, &mii);
                mii.fState ^= MFS_CHECKED;

                SetMenuItemInfo((HMENU)IDR_MENU1,ID_SETTINGS_ENABLEGRAVITY, FALSE, &mii);
                break;
            }

Спасибо

1 Ответ

5 голосов
/ 24 января 2012

Для Win32 вы делаете это с помощью функций GetMenuItemInfo и SetMenuItemInfo:

MENUITEMINFO mii = { sizeof(MENUITEMINFO) };
mii.fMask = MIIM_STATE;
GetMenuItemInfo(hMenu, uItem, FALSE, &mii);
mii.fState ^= MFS_CHECKED;
SetMenuItemInfo(hMenu, uItem, FALSE, &mii);

Этот код переключает проверенное свойство.Предполагается, что вы идентифицируете пункт меню по идентификатору, а не по позиции.


При просмотре введенного вами кода, (HMENU)IDR_MENU1 выглядит подозрительно.Я представляю, что IDR_MENU1 является идентификатором, а не HMENU.Кастинг всегда является признаком потенциальной проблемы.Если у вас нет HMENU для передачи, позвоните GetMenu, чтобы получить его.

В вашем коде вы должны проверять возвращаемое значение вызовов API, и если ониверните FALSE, затем вам нужно позвонить GetLastError для получения дополнительной информации о сбое.

...