Win32 - полноэкранное всплывающее меню с темпераментной активацией - PullRequest
0 голосов
/ 02 сентября 2010

Используя C ++ в VS2008, я начинаю программу DirectX, которая до сих пор без проблем отображала изображение токена и переключалась между полноэкранным и оконным режимами.

Имеет строку меню, которая невидима, как и ожидалось в полноэкранном режиме.Клавиша ALT все еще могла активировать это меню в полноэкранном режиме, но оно было очень неуклюжим, поскольку его элементы не были видны до тех пор, пока не были выделены, и даже тогда оно реагировало только примерно на 1 из 5 нажатий клавиши ALT.Я решил реализовать всплывающее меню, которое реагирует на правую кнопку мыши.Моя проблема в том, что это всплывающее меню также является темпераментным в полноэкранном режиме.Он также играет с пользовательским курсором, который я использую.

Неправильное поведение определяется следующим образом:

1 · Щелчок правой кнопкой мыши в любом месте активирует всплывающее меню, нотакже деактивируйте пользовательский курсор и замените его системным значением по умолчанию.

2 · Как только меню станет видимым, нажатие ПРАВОЙ кнопкой мыши вне меню отключит его, но при этом курсор по умолчанию останетсяна.Однако, если снова щелкнуть правой кнопкой мыши, меню снова активируется, и это будет продолжаться идеально, если не для отсутствующего пользовательского курсора.

3 · Как только меню станет видимым, щелчок ВЛЕВОЙ за пределами меню деактивирует его, и при этом снова отобразится пользовательский курсор.Теперь он становится немного более грязным, потому что теперь:
3a · Если я щелкну правой кнопкой мыши, он вернется к шагу 1. Меню вкл. + Курсор выключен.
3b · Если я щелкну левой кнопкой мыши второй раз (как будто я получаю фокус или что-то еще), то щелчок правой кнопкой мыши активирует курсор по умолчанию, но НЕ активирует меню (как если бы я наполовину не сделал, а половина не восстановила фокус иличто-то).Меню выключено + курсор выключен.
3c · Если я переместлю мышь, а затем щелкну правой кнопкой мыши, произойдет одно из указанных выше действий.Шаг 1 или шаг 3b.Меню включено + курсор выключен, или меню выключено + курсор выключен.Разочарование.

4 · Наиболее очевидно, что если выполняется шаг 3b (меню выключено + курсор выключен), пользователь может постоянно включать и выключать пользовательский курсор.Щелкните левой кнопкой мыши, щелкните правой кнопкой мыши.Мало того, что меню никогда не появляется, но это просто не то, что я хочу, чтобы пользователь видел в моей программе ... курсор меняется без причины.

Я предполагаю, что изменение курсора связано ссамо меню фокусировки или что-то в этом роде.Я хотел бы избежать этого, если это возможно, но реальная проблема заключается в том, почему во-первых, темперамент активизации меню?

Мой код для всплывающего меню:

case WM_RBUTTONDOWN:
    cout << "Right button in fullscreen" << endl;

    TrackPopupMenu(GetSubMenu(g_menu,0), TPM_LEFTALIGN|TPM_HORPOSANIMATION, 
    30, 30, 0, g_parentWindow, NULL);

    // SetActiveWindow(g_parentWindow);  // Makes no difference.
    // SetForegroundWindow(g_parentWindow);  // Makes no difference.

break;

Oneеще вещь.Если я вместо этого использую F3 , чтобы активировать меню, абсолютно ничего не происходит.

Проблема 1: Могу ли я обеспечить надежную активацию меню?
Проблема 2: Могу ли я остановить изменение курсора?
Проблема 3: Почему не работает ключевая команда?

Спасибо за прочтение.Есть идеи?

1 Ответ

0 голосов
/ 03 ноября 2010

вы можете использовать эту маленькую функцию, чтобы установить курсор обратно на ваш курсор настройки SetCursor(CURSOR_ID);, вы можете добавить это в WM_RBUTTONDOWN

...