Этот вопрос задавался ранее, но нет ответа «Ну, это зависит от каждого приложения, чтобы поддерживать различные варианты». Тем не менее, когда вы щелкаете правой кнопкой мыши на выделении в блокноте, браузере, что угодно, что-то строит контекстное меню. Как приложение делает это? Почему я не могу добавить к этому? Как добавить в контекстное меню hightlight? Нет ответа лучше, чем не ответ.

1 ответ1

1

Краткий ответ: Если вы добавите новый пункт меню, программа не будет знать, что делать, когда щелкнет этот элемент. Вам действительно нужно изменить код программы, чтобы новые пункты меню что-то делали. Вот почему «Это зависит от каждого приложения» является правильным ответом.


Windows, как и большинство других операционных систем, предоставляет набор функций для создания программ с графическим интерфейсом - некоторые являются частью системы ("создать окно"), другие в основном для удобства («нарисовать кнопку, на которую можно нажать»).

Большинство программ отображают свои меню (обычные и контекстные) с помощью этих функций - они в основном предоставляют Windows список элементов и запрашивают его отображение на экране в виде меню, а также информируют программу о том, что вы выбрали.

Windows не особенно заботится, откуда берется список элементов. Некоторые меню создаются самой программой (например, список "Недавние файлы"); Вы не можете изменить их, не переписав ту часть программы, которая создает список последних файлов. Другие меню, такие как "Файл", "Редактировать" или "Справка" в "Блокноте", создаются из "ресурса", хранящегося в самом файле .exe , и существуют инструменты для редактирования таких ресурсов (например, для изменения порядка пунктов меню или изменить значок программы).

Но если вы используете такой инструмент для добавления новых пунктов меню, они не будут работать, потому что программа не будет знать, что делать. Нет волшебства, связанного с каждым пунктом меню, только одно число, "идентификатор команды". Например, "Копирование", которое является обычным во многих программах, имеет назначенный идентификатор команды 12 ("IDM_COPY"), и что-то специфическое для отдельной программы (например, "Новая игра") может иметь 1234 или 2468 или что-то еще. Когда вы открываете контекстное меню и нажимаете "Копировать", Windows сообщает "Блокноту" только то, что "был выбран идентификатор команды 12", и именно в "Блокноте" можно фактически поместить выбранный текст в буфер обмена всякий раз, когда это происходит.

  • Вырезать → ID 11 → Блокнот помещает текст в буфер обмена, а затем удаляет его из документа
  • Копировать → ID 12 → Блокнот помещает текст в буфер обмена
  • Вставить → ID 13 → Блокнот получает текст из буфера обмена, а затем вставляет его в документ
  • Sing → ID 12 → Блокнот помещает текст в буфер обмена
  • Снова скопируйте → ID 3456 → Блокнот ничего не делает, так как не имеет понятия, что должен означать ID 3456

Примечание: выше немного упрощено. Контекстное меню в Блокноте фактически реализовано с помощью элемента управления "редактируемый текст", который является частью вышеупомянутых служебных функций, предоставляемых Windows. Главное меню, однако, полностью является частью Блокнота.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .