Меню в стиле Mac в Windows, для всей системы - PullRequest
3 голосов
/ 05 марта 2010

Я пользователь Mac и пользователь Windows (и однажды я был пользователем Amiga). Я очень предпочитаю подход «строка меню в верхней части экрана», который используют Mac (и Amiga) (/ взял), и я хотел бы написать что-то для Windows, которое может обеспечить эту функциональность (и работать с существующими приложениями).

Я знаю, что это немного амбициозно, тем более, что это просто проект типа «нуля», и благодаря растущей семье у меня практически нет свободного времени. Я посмотрел на это несколько лет назад и пришел к выводу, что это было очень сложно, но это было до StackOverflow;)

Я предполагаю, что мне нужно было бы сделать что-то подобное, чтобы достичь желаемого результата:

  • Создайте приложение, которое будет настраиваемой строкой меню, расположенной поверх всех других окон. Пользовательские меню должны обеспечивать все функциональные возможности для замены стандартных оконных меню Win32. Это нормально, это просто приложение, которое ведет себя как строка меню.

  • Он будет непрерывно перечислять окна, чтобы найти окна, которые создаются / уничтожаются. Было бы перечислить дочернюю коллекцию окон, чтобы найти строку меню.

  • Это создаст меню, которое представляет пункты меню в окне.

  • Было бы скрыть строку меню в окне и переместить все прямые дочерние окна вверх на соответствующую величину в пикселях. Это также сократило бы высоту окна.

  • Он будет захватывать все сообщения, которые приложение отправляет в свое меню, для соответствующей настройки пользовательского меню.

  • Он будет постоянно опрашивать текущее активное окно, поэтому он может переключать меню при необходимости.

  • Когда происходит попадание в меню, оно отправляет сообщение в окно, используя hwnd реального дочернего элемента меню.

Вот и все! Легко, а? Нет, наверное нет.

Я был бы очень признателен за любой совет от гуру Win32 о том, с чего начать, идеи, подводные камни, мысли о том, если это вообще возможно. Я не программист на Win32 C ++ днем, но я потратил немного времени и не возражаю копаться в документации по SDK платформы MSDN ...

(У меня также есть другая идея - создать панель задач для каждого экрана в настройке с несколькими мониторами и показать активные окна для рабочего стола - но я думаю, что могу сделать это в управляемом коде и сэкономить много работы ).

Ответы [ 2 ]

3 голосов
/ 05 марта 2010

Реальная разница между меню Mac сверху и подходом Windows заключается не только в меню: - Это то, как меню используется для взлома приложений MDI.

В окнах приложения MDI, такие как dev studio и office, размещают все окна документов внутри окна фрейма приложения. На Mac нет окон фрейма для каждого приложения, все окна документов имеют общий рабочий стол со всеми остальными окнами документов из других приложений.

Отсутствие возможности глубоко переделать традиционные приложения MDI, чтобы вывести окна их документов на рабочий стол, попытка, хотя и благородная, получить меню рабочего стола, кажется обреченной на новизну без реального использования или использования. .

Я, учитывая все обстоятельства, довольно подавлен текущим состоянием оконных менеджеров как на Mac, так и на Windows (и Linux): такие вещи, как вкладки в браузерах, на самом деле являются отчаянием разработчиков приложений, которым не давали таких вещей. как часть стандартного оконного менеджера - вот где я считаю, что вкладки действительно принадлежат. Почему в notepad ++ должен быть набор вкладок, Chrome, Firefox, Internet Explorer (да, я знаю, что я запускал все 4), а также док-станция для разработчиков, различные программы рисования.

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

0 голосов
/ 05 марта 2010

Строка меню в типичном окне является частью не-клиентской области окна. Он рисуется, когда WndProc получает сообщение WM_NCPAINT и передает его DefWindowProc, который является частью User32.dll - кода главного оконного менеджера.

Другие вещи, которые нарисованы в том же сообщении? Заголовок, границы окна, поля min / max / close. Все они нарисованы при обработке одного сообщения. Таким образом, чтобы скрыть меню для приложения, вам придется взять на себя обработку этого сообщения, что означает изменение поведения user32.dll. Сокрытие меню будет означать, что вы несете ответственность за рисование всех области, не являющейся клиентом.

И внешний вид всех этих элементов - заголовок, границы и т. Д. Меняется с каждой основной версией Windows. Таким образом, вы должны преследовать это также.

Это всего лишь одна из дюжины непреодолимых проблем с этой идеей. Даже Microsoft, вероятно, не смогла справиться с этим, и у них есть доступ к исходному коду user32.dll!

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

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

...