Приложения Chrome Style C #? - PullRequest
       16

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

14 голосов
/ 22 февраля 2009

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

Ответы [ 4 ]

22 голосов
/ 22 февраля 2009

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

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

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

  3. В процедуре обработки сообщений, добавленной через ловушку на втором шаге, вам необходимо обработать несколько сообщений:

    • WM_NCACTIVATE - изменить рисунок заголовка, когда приложение активировано или нет
    • WM_NCCALCSIZE - чтобы вернуться к ОС, в которой у вас нет клиентских областей
    • WM_NCPAINT - в общем случае вам нужно отменить прямоугольник окна только здесь, WPF позаботится о реальной картине)
    • WM_NCHITTEST - для обработки перемещения окна, минимизации и максимизации.
  4. Как только вы сделаете вышеописанное, ваша клиентская область, где WPF будет рисовать ваше визуальное дерево, охватит всю область окна. Вам нужно будет добавить визуалы «non-cliet», чтобы ваше приложение выглядело как обычное приложение для пользователя.

  5. Вам может потребоваться еще несколько сообщений:

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

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

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

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

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

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

8 голосов
/ 09 марта 2009

Джо Кастро (Joe Castro), разработчик группы продуктов WPF, имеет проект галереи кодов MSDN под названием «WPF Chrome», который можно использовать для создания офисного пользовательского интерфейса 2007 года (т. Е. Элементов управления, охватывающих как клиентские, так и не клиентские области окна).

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

8 голосов
/ 22 февраля 2009

Как упоминает Фрэнси, вам нужно DwmExtendFrameIntoClientArea. Вот пример из Codeproject, который показывает, как это сделать.

http://www.codeproject.com/KB/dialog/AeroNonClientAreaButtons.aspx

2 голосов
/ 22 февраля 2009

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

...