Приложения Chrome С#?

Я не говорю о функции стекла vista, я уже знаю, как это сделать. Функция, о которой я говорю, это добавить элементы управления в заголовок, например, Office 2007 с логотипом и панелью инструментов.

Ответы

Ответ 1

Для достижения этого эффекта вам нужно сделать несколько комбинаций Win32. В зависимости от того, используете ли вы Winforms или WPF, способ обращения к обработке сообщений отличается (я не помню Winforms, поэтому я приведу все примеры для WPF). Но в обоих случаях вам необходимо:

  • Перехватите создание окна и измените стили окон и расширенные стили. В WPF вам нужно наследовать HwndSource и изменить HwndSourceParameters, чтобы достичь этого. Вам нужны WS_OVERLAPPEDWINDOW, WS_CLIPSIBLINGS и WS_VISIBLE для обычных стилей и расширенных стилей WS_EX_WINDOWEDGE и WS_EX_APPWINDOW.

  • Добавить обработчик сообщений через его параметры HwndSource HwndSourceHook.

  • В сообщении proc, добавленном через hook на втором шаге, вам нужно обработать несколько сообщений:

    • WM_NCACTIVATE - изменить окраску названия при активации приложения или нет
    • WM_NCCALCSIZE - вернуть ОС, что у вас нет неклиентских областей
    • WM_NCPAINT - в общем случае вам нужно invaldate window rect только здесь, WPF позаботится о фактической картине)
    • WM_NCHITTEST - обрабатывать перемещение окна, минимизировать и максимизировать.
  • Как только вы сделаете это, ваша клиентская область, в которой WPF будет рисовать ваше визуальное дерево, будет охватывать всю область окна. Вам нужно будет добавить визуальные эффекты "без клитора", чтобы ваше приложение выглядело как обычное приложение для пользователя.

  • Вам может понадобиться еще несколько сообщений:

    • WM_THEMECHANGED, если вы хотите изменить рисование области "неклиент", чтобы соответствовать теме ОС
    • WM_DWMCOMPOSITIONCHANGED, если вы хотите расширить стекло и получить стандартную окраску ОС NC-стекла, когда стекло включено и переключиться на вашу пользовательскую логику когда стекла нет.
  • Возможно, вам захочется взглянуть на API-интерфейсы Win32, если вы хотите получить стандартные ресурсы Win32 для границ, кнопок заголовка, закрытия, миниминирования и максимизации для использования в своей области "неклиент".

  • Если вы хотите расширить Glass в свое окно, вы можете посмотреть:

    • DwmExtendFrameIntoClientArea - чтобы получить стандартную стеклянную область NC
    • DwmDefWindowProc - чтобы менеджер рабочего стола рисовал Glass и стандартные элементы управления NC
    • DwmIsCompositionEnabled - определить, включено ли стекло; вы можете использовать вышеуказанные два API только тогда, когда Glass включен. Если "Стекло" не включено, вам необходимо сделать собственный рисунок области ЧПУ.

Вы можете найти правильные определения С# для всех сообщений, стилей и соответствующих API-интерфейсов Win32 на P/Invoke.

Вы также можете добиться аналогичного эффекта, используя стандартное окно WPF с WindowStyle=none. Тем не менее, будут некоторые различия между поведением рабочего стола к вашему приложению и другим приложениям; наиболее очевидным из них является то, что вы не сможете укладывать или нарезать свое окно, щелкнув правой кнопкой мыши на панели задач.

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

Ответ 3

Joe Castro, разработчик продуктов WPF, имеет проект галереи MSDN-кода под названием "WPF Chrome", который может использоваться для создания пользовательского интерфейса, подобный Office 2007 (т.е. элементы управления, которые охватывают как клиентскую, так и неклиентскую области окна).

Найдите его здесь: http://code.msdn.microsoft.com/chrome

Ответ 4

Я использовал пакет управления DotNetBar с хорошим успехом.