Обсуждение завершено Программируем панель задач Windows 7:

Саныч

Ветеран
Сообщения
860
Симпатии
1,096
Баллы
553
#1
прогресс-бар: Часть 1

Новая операционная система Windows 7 содержит большое количество нововведений и улучшений. Эти улучшения касаются безопасности, производительности, надежности и т.д. Серьезное внимание также уделено и пользовательскому интерфейсу. Для разработчиков ПО на платформе Windows новая ОС также представляет интерес, т.к. в ней содержатся элементы, на которые можно воздействовать программно. В течении нескольких постов мы поговорим об основных нововведениях и программной модели для них.
Первое что бросается в глаза при работе с Windows 7 - это, конечно, обновленный task bar. В новом taskbar’е действительно много концептуальных изменений. Одно из таких изменений - возможность отображения прогресса выполнения задачи (progress bar).

proxy.php?image=http%3A%2F%2Fimg230.imageshack.us%2Fimg230%2F7043%2F98669135.png&hash=9c249dc13e317343343c64918b1839e8


proxy.php?image=http%3A%2F%2Fimg230.imageshack.us%2Fimg230%2F1993%2Fimage3j.png&hash=e71c2e0e283eb573e03247d34d63b2d7


На этом рисунке хорошо видно, что прямо на панели задач отображается информация о процессе копирования. Такая функциональность реализована в Windows 7 для копирования файлов на диске, загрузке данных из сети (IE8). Однако, важно, что эту функциональность мы можем использовать и для своих приложений. Сценариев может быть огромное количество - отображение процесса преобразования, копирования, формирования данных, построение отчетов, генерация изображений, и т.д.

С точки зрения разработчика клиентских приложений для Windows, процесс использования данной функциональности представляется достаточно просто. Взаимодействие с ОС происходит на unmanaged уровне, поэтому для .NET приложений необходима реализация управляемых оберток. Всю эту работу уже проделали разработчики из Microsoft и поместили это в библиотеку .NET Interop Sample Library.

Библиотека .NET Interop Sample Library состоит из множества компонентов и демонстрационных приложений. Мы не будем подробно останавливаться на каждом из них. Для нас важно, что в ее состав входит Vista Bridge Sample Library, Windows7.DesktopIntegration и Windows7.DesktopIntegration.Registration.

Проект "Windows7.DesktopIntegration" содержит те классы, которые необходимы нам для работы с taskbar’ом. В составе этого проекта есть класс WindowsFormsExtensions, который содержит набор методов расширения (extension methods) для класса Form (Windows Forms). В нашем случае нас интересуют сдледующие методы:

SetTaskbarProgress(float percent)
SetTaskbarProgressState(ThumbnailProgressState state)

Вызов первого метода позволяет указать процент выполнения текущей задачи. Т.к. это методы расширения для класса Form, то этот класс передается в метод в качестве параметра. Это необходимо для того, чтобы определить handle окна, для которого выполняются действия.

Код:

/ процесс выполнения = 35%

// вызов метода расширения
WindowsFormsExtensions.SetTaskbarProgress(this, 35);

// или так
(this = Form)this.SetTaskbarProgress(35);


У нас также имеется возможность указать состояние прогресс-бара. Доступные состояния:

NoProgress - прогресс не отображается
Indeterminate - прогресс бар постоянно мерцает
Normal - обычное отображение прогресса
Error - отображение ошибки
Paused - отображение паузы

Задание состояние прогресс-бара осуществляется при помощи второго метода.

Код:

WindowsFormsExtensions.SetTaskbarProgressState(this, Windows7Taskbar.ThumbnailProgressState.Normal);

// или так

this.SetTaskbarProgressState(Windows7Taskbar.ThumbnailProgressState.Normal);


К сожалению, методы расширения существуют только для WinForms приложений. Однако, несложно построить подобный класс и для WPF приложений (см. демо-приложение).

В итоге я собрал небольшое приложение, которое демонстрирует возможности прогресс-бара в панели задач Windows 7. Выглядит оно следующим образом.

proxy.php?image=http%3A%2F%2Fimg230.imageshack.us%2Fimg230%2F4034%2Fimage6ibb.png&hash=dcd8d8eab757a88942aaed2382ff7214


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

proxy.php?image=http%3A%2F%2Fimg230.imageshack.us%2Fimg230%2F3481%2Fimage17s.png&hash=1aa617030b484987dc191877a543943e

Режим "Normal"

proxy.php?image=http%3A%2F%2Fimg230.imageshack.us%2Fimg230%2F5427%2Fimage18.png&hash=34761da33dd2a51fe327b1c92eee2be3

Режим "Indeterminate"
proxy.php?image=http%3A%2F%2Fimg230.imageshack.us%2Fimg230%2F3944%2Fimage19x.png&hash=a0a3c99cb9627889b1a0407b1ab26b03

Режим "Error"
proxy.php?image=http%3A%2F%2Fimg230.imageshack.us%2Fimg230%2F930%2Fimage20q.png&hash=9963624dcdb8ed37d7d17d6a65cb2266

Режим "Paused"

Загрузить демо-приложение Taskbar-Progress можно отсюда. Удачи вам в разработке ваших приложений для Windows 7!

sergey.zwezdin, TheVista.Ru Team
Microsoft Most Valuable Professional, Microsoft Regional Director
июнь 2009



Источник

Добавлено через 22 часа 25 минут 51 секунду
Программируем панель задач Windows 7 (ч.2)

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

Подобную функциональность вы уже могли заметить при использовании Windows 7. Например, подобные кнопки существуют для Windows Media Player. Они позволяют переключать треки, а также останавливать воспроизведение. Всего таких кнопок можно создать не более семи.

proxy.php?image=http%3A%2F%2Fimg512.imageshack.us%2Fimg512%2F6578%2Fimage35f.png&hash=742d6487e82f936d92758de5c360fcbd


Несомненно, такая функциональность может быть полезна не только для Media Player, но и для наших приложений. Давайте посмотрим как можно реализовать это в нашем приложении.
Как я уже говорил, для всех системных функций Windows 7 существует набор библиотек на .NET, который называется .NET Interop Sample Library. Мы пользовались услугами этой библиотеки, когда управляли состоянием прогресс-бара. Сейчас мы вновь воспользуемся этой библиотекой.

proxy.php?image=http%3A%2F%2Fimg512.imageshack.us%2Fimg512%2F5711%2F41111039.png&hash=a8190bf2788a4e3b7460816976091fdb


Создание наших кнопок должно происходить в момент обработки события WM_TaskbarButtonCreated. Поэтому в форме необходимо переопределить метод WndProc и обрабатывать моменты появления этого события.

Код:
protected override void WndProc(ref Message m)
{
if (m.Msg == Windows7Taskbar.TaskbarButtonCreatedMessage) {
// initialize buttons
}
base.WndProc(ref m);
}


Для инициализации кнопок необходим объект ThumbButtonManager. Этот объект управляет поведением и отображением этих кнопок. Этот объект можно создать, используя метод расширения CreateThumbButtonManager. После этого необходимо воспользоваться методом CreateThumbButton и создать объект кнопки. После того, как все кнопки будут созданы, необходимо добавить их на панель задач при помощи метода AddThumbButtons.

Код:
protected override void WndProc(ref Message m)
{
if (m.Msg == Windows7Taskbar.TaskbarButtonCreatedMessage)
{
InitializeThumbButtons();
}
base.WndProc(ref m);
}

protected void InitializeThumbButtons()
{
ThumbButtonManager thumbButtonManager =
WindowsFormsExtensions.CreateThumbButtonManager(this);

var decreaseThumbButton = thumbButtonManager.CreateThumbButton(1,
Icons.Navigation_First_2, "To reduce the progress");
decreaseThumbButton.Clicked += delegate
{ // ..
}; thumbButtonManager.AddThumbButtons(decreaseThumbButton);
}


Теперь при запуске приложения можно увидеть что появилась одна кнопка управления. Однако, если мы попробуем нажать на нее, то увидим, что обработчик события не срабатывает. Для того, чтобы обработчик начал работать, необходимо в методе WndProc явно передать возможность объекту ThumbButtonManager обрабатывать события.

В итоге получим следующий несложный код:

Код:

private ThumbButtonManager _thumbButtonManager;
protected override void WndProc(ref Message m)
{
if (m.Msg == Windows7Taskbar.TaskbarButtonCreatedMessage)
{
InitializeThumbButtons();
}
if (_thumbButtonManager != null)
_thumbButtonManager.DispatchMessage(ref m);

base.WndProc(ref m);
}

protected void InitializeThumbButtons()
{
if (_thumbButtonManager == null)
{
_thumbButtonManager = WindowsFormsExtensions.CreateThumbButtonManager(this);
}
var decreaseThumbButton = _thumbButtonManager.CreateThumbButton(1, Icons.Navigation_First_2, "To reduce the progress"); decreaseThumbButton.Clicked += delegate
{
Progress.Text = (float.Parse(Progress.Text) - 10).ToString();
WindowsFormsExtensions.SetTaskbarProgress(this, float.Parse(Progress.Text));
};
// other buttons
_thumbButtonManager.AddThumbButtons(decreaseThumbButton, normalStateThumbButton, indeterminateStateThumbButton, pauseStateThumbButton, errorStateThumbButton, increaseThumbButton);
Это приложение содержит кнопки для управления прогрессом (как и в прошлом случае) и содержит 6 кнопок. Загрузить демо-приложение ThumbButtons можно отсюда.

proxy.php?image=http%3A%2F%2Fimg512.imageshack.us%2Fimg512%2F6195%2Fimage34.png&hash=ea3ba68629e1172d7c829518ad090dd9




sergey.zwezdin, TheVista.Ru Team
Microsoft Most Valuable Professional, Microsoft Regional Director
июнь 2009


Источник
 
Сверху Снизу