SuperBarCoding под Windows 7. Готовые решения для взаимодействия с новым таскбаромИгорь Антонов (antonov.igor.khv@gmail.com, www.vr-online.ru) Панель задач, носящая гордое название «SuperBar» - не просто симпатичная панелька в стиле Mac OS. Это абсолютно новый компонент системы, способный выполнять кучу полезных функций.
Если ты планируешь всерьез заняться разработкой софта под новую ОС и хочешь, чтобы твои программы не выглядели белыми воронами в сравнении с конкурентами, – ты просто обязан разобраться и реализовать в них полную поддержку всех новых фишек таскбара. Тем более, все эти штучки делают работу с приложением более комфортной и удобной. Что нам потребуетсяДля знакомства с возможностями нового таскбара тебе понадобится Visual Studio и библиотека .NET Interop Sample Library (http://code.msdn.microsoft.com). В эту либу входят уже известная Vista-разработчикам библиотека - Vista Bridge – и многочисленные примеры, демонстрирующие использование некоторых новых технологий Windows 7 (SuperBar, Librarys, Sensor and Location Platform и т.д.). Мы затронем лишь SuperBar, но, если захочешь узнать подробнее о перечисленных технологиях, то намыль письмецо редактору рубрики и, возможно, в одном из ближайших номеров появится соответствующая статья. ProgressBar на панели задачНачинать наше знакомство с программированием SuperBar мы будем с самого простого – с создания элегантного ProgressBar. Ты, наверное, уже смог заметить, что некоторые приложения (такие, как IE8, Проводник) могут отображать ход выполнения какой-либо операции прямо на панели задач. Такой подход очень удобен и позволяет лишний раз не дергаться и не разворачивать окно приложения с целью посмотреть, скопировался/закачался ли очередной файл или нет.
К тому же, одним отображением процесса выполнения операции дело не ограничивается. Например, ты без особого труда можешь проинформировать пользователя о неудаче или приостановке выполнения задачи – либо вовсе намекнуть на неизвестное количество времени, необходимого для завершения операции. Все это реализуется путем изменения состояния ProgressBar. В общем, вариантов применения этой возможности SuperBar можно найти огромное множество, и сейчас мы рассмотрим, как реализовать все на практике. Изменение состояния ProgressBar
Для решения этой задачи потребуется воспользоваться услугами класса WindowsFormExtensions. Точнее, нас интересуют всего лишь два метода:
Кинь на форму своего проекта две кнопки, одну надпись и один компонент типа ComboBox. Для первой кнопки в свойстве Text укажи «+», а для второй «-». Как нетрудно догадаться, по нажатию первой пимпы мы будем сознательно увеличивать процент выполнения операции, а по нажатию второй - наоборот, уменьшать. Компонент ComboBox мы будем использовать для хранения списка возможных состояний:
Теперь создавай обработчик события Clicked для первой кнопки (та которая «+») и пиши в нем две незамысловатые строчки кода:
Аналогичным образом создавай обработчик события нажатия для второй кнопки и напиши в нем точно такие же строчки, как и в первом случае, только «плюс» поменяй на «минус». Вот так, с помощью всего лишь одной строчки кода мы добились отображения ProgressBar для нашего приложения на SuperBar. Чтобы программа успешно запустилась, не забудь добавить namespace Windows7.DesktopIntegration, Windows7.DesktopIntegration.WindowsForms и объявить приватную переменную totalProgress. Попробуй запустить приложение и поиграться с кнопками, а я тем временем приступлю к рассмотрению статусов ProgressBar.
Как ты помнишь, возможные типы статусов мы забили в ComboBox. Вдохнем жизнь в наш список выбора! Создавай для него обработчик события SelectedIndexChanged и напиши туда код из соответствующей врезки («Изменение статуса ProgressBar»). Изменение статуса ProgressBar
Код для установки состояния ProgressBar затруднений вызвать не должен. По сути, весь листинг (я его привел не полностью) - это сплошной case и вызов метода SetTaskbarProgressState(). В качестве параметров я передаю методу хэндл формы и значение из перечисления Windows7Taskbar.ThumbnailProgressState, соответствующее определенному статусу. Списки переходов на практике (JumpList)Другой очень заметной новинкой SuperBar стали так называемые списки переходов. Они позволяют хранить список задач (функций), ассоциированных с приложением, ссылки на недавно открытые файлы и т.д. Если ты юзаешь Windows 7 в первый раз, то, чтобы познакомиться с функцией JumpList, кликни правой клавишей мыши по какому-нибудь значку на таскбаре (например, по IE8). В появившемся контекстном меню будут содержаться ссылки на основные функции программы – «Создать новое окно», «Приватный режим» и т.д. Плюсы такой «менюшки» очевидны. Поюзав эту фичу с недельку, я к ней чертовски привык, и теперь во всех своих будущих проектах буду обязательно делать поддержку JL. Перед тем, как писать код, проговорим теоретические нюансы. Чтобы встроить в свое приложение поддержку списков перехода, нам необходимо создать экземпляр объекта JumpListManager. Нюанс в этой, казалось бы, простой операции всего один - инициализировать объект нужно в момент создания кнопки приложения на SuperBar. Как это сделать? Достаточно всего лишь переопределить метод WndProc. В нашем случае метод должен обрабатывать сообщение TaskbarButtonCreatedMessage. При его возникновении от нас требуется воспользоваться методом CreateJumpListManager класса WindowsFormExtensions. Создав свой JumpListManager, можно начинать пить шампанское. По сути, первая часть работы выполнена. Далее следует «оформить» подписку на событие UserRemovedItems и приступать к созданию самих ссылок. Я тебе уже говорил, что ссылки могут быть нескольких типов - недавние документы, просто ссылки на программы и т.д. В своем примере я создаю так называемые «задачи» (делаю ссылку на программу «калькулятор»). За добавление очередной такой задачи отвечает метод AddUserTask объекта типа JumpListManager. В качестве одного единственного параметра методу требуется передать новый объект типа ShellLink с заполненными полями:
На этом рассмотрение процесса создания задач в списке переходов можно считать оконченным. Переписывай содержимое второй врезки в свой проект и запускай приложение для теста. Обрати внимание, если ты создашь для своей программы иконку на таскбаре, JL появляется всегда, независимо от того, запущено ли твое приложение или нет. Вполне возможно, что рано или поздно тебе захочется в JL создать список недавно открытых в твоей программе файлов. Принцип остается тот же, за исключением используемого метода - вместо AddUserTask нужно будет использовать AddToRecent. Создание задачи для JumpList
Оверлейные иконкиMicrosoft в последней версии своей ОС пытается все делать так, чтобы пользователю жилось уютно и комфортно. Взять хотя бы еще одну фишку SuperBar - OverlayIcons (оверлейные иконки). Пользователю эта функция предоставляет возможность узнать о состоянии приложения. Уверен, что к выходу семерки в свет производители программ-мессенджеров возьмут эту функцию на заметку, так как с ее помощью можно красиво отображать текущий статус (отошел, занят) прямо на панели задач. Чтобы лучше понять, о чем я говорю, не поленись и запусти стандартный MSN Messanger. Попробуй подключиться к серверу и выстави какой-нибудь статус. Как проделаешь это нехитрое действие - глянь на панель задач. Прямо на иконке мессенджера увидишь иконку, соответствующую текущему статусу. Благодаря классам, реализованным в библиотеке .NET Interop Sample Library, встроить в свое приложение поддержку оверлейных иконок становится совсем нетрудно, и скоро ты в этом убедишься. Итак, разберем весь процесс по шагам. Нам необходимо: 1. Подготовить иконки. Можешь создать для этого отдельный файл ресурсов или просто воспользоваться компонентом ImageList. 2. Воспользоваться методом SetTaskbarOverlayIcon. В качестве параметров он принимает:
3. Лицезреть готовый результат. На основании вышесказанного создаем новый проект. Кидаем на форму компонент Button и определяем для кнопки обработчик события Clicked. В его тело пишем: Так, создавать иконки мы научились. Рассмотрим обратный процесс - удаление созданной иконки. Бросай на форму еще одну кнопку и в обработчике ее нажатия пиши:
На этом все. Можешь запускать приложение и потестить его. Перед тем, как приступить к описанию следующей функции TaskBar, хочу подкинуть тебе одну идейку по практическому использованию оверлейных иконок. Если немножко включить соображалку, то реально написать несколько строчек тухлого кода и описать метод для динамического создания иконок. Что это дает? А возможность создавать красивые иконки с цифрами (или буквами)! Например, ты кодишь приложение, которое работает с сетью и принимает/отправляет файлы. Как можно сделать отображение процента выполнения загрузки в то время, когда главное окно свернуто? Да, ты можешь сделать, как я говорил в самом начале статьи (сделать ProgressBar), но куда прикольней (и симпатичней) решить эту задачу с помощью динамического генерирования иконок. Говоря проще, на каждый процент ты должен создавать иконку, в которой в качестве изображения будет присутствовать нужная цифра. Код в рамках статьи я приводить не буду; если сам не справишься (что вряд ли), то загляни в исходники моего проекта на нашем DVD. ThumbButtonsНаведи курсор грызуна на запущенный (и свернутый) проигрыватель Windows Media Player и ты увидишь маленькое окошко с кнопками, позволяющими управлять состоянием проигрывания мультимидийного контента. У Media Plaeyr в этом окне доступны три кнопки - Play, Next, Previous. В своем приложении ты можешь не придерживаться таких ограничений и создать до семи кнопок. Больше создать, увы, не получится; это ограничение наложено самой Windows. Ну, нельзя, так нельзя! Не будем расстраиваться по пустякам, а лучше попробуем создать приложение, демонстрирующее эту возможность. Как и следует ожидать, главным нашим помощником будет уже полюбившаяся библиотека. Создавай новый проект и вновь подключай к нему vistabridge и Windows 7 DesktopIntegration. Для этого примера нам не потребуются никакие элементы управления, поэтому смело переходи в редактор кода и потихонечку начинай перебивать содержимое врезки с говорящим названием. Создание ThumbButton
Все кнопки такого вида (ThumbButtons) создаются при помощи объекта-контейнера - ThumbButtonManager и объекта ThumbButton. Именно поэтому в самом начале третьего листинга я описываю два приватных поля - myThumbButton и myThumbButtonManager. Дальше от нас требуется переопределить метод WndProc (вспомни, мы уже проделывали такой трюк) и сделать в нем проверку на сравнение очередного сообщения с Windows7Taskbar.TaskbarButtonCreatedMessage. Если результат - истина, то нужно выполнить проверку на «созданность» экземпляра объекта ThumbButtonManager. Далее действуем в зависимости от ситуации. В случае уже проведенной инициализации переменной myThumbButtonManager - пропускаем вызов метода CreateThumbButtonManager() и переходим сразу к созданию кнопки. Каждая новая кнопка создается вызовом метода CreateThumbButton() объекта типа ThumbButtonManager. Для успешной отработки методу требуется передать три параметра:
Толку от безжизненной кнопки немного, а раз так, неплохо было бы забиндить обработчик события Clicked. Для этого описываем делегат. В своем примере я просто вызываю метод Show класса MessageBox. Говоря другими словами, при каждом нажатии на кнопку у меня будет появляться окно с текстом «Test button». После описания действия кнопки ее необходимо добавить в наш ThumbButtonManager. Эта процедура выполняется посредством вызова метода AddThumbButtons. Из параметров ему нужно передать объект типа ThumbButton. Можно считать, что пример полностью готов. Все, что остается: намекнуть ThumbButtonManager, что обрабатывать сообщения теперь – его прямая обязанность. Именно это я и делаю, вызвав метод DispatchMessage. На этом торжественном моменте третий листинг подошел к концу, и настало время переходить к разбору полетов. Попробуй запустить созданное приложение и подвести к его иконке курсор мыши. Если ты не допустил ошибок, то увидишь примерно такую же картинку. ShutdownОбычно принято ругать Microsoft за кривизну продуктов и ухахатываться над допущенными «детскими» ошибками. Но я хотел бы, наоборот, похвалить за то, что еще до выхода финального релиза Windows 7 у нас с тобой есть возможность поюзать все новые фишки системы и реализовать их поддержку в своих программах. Библиотека, которую мы с тобой сегодня использовали - лишнее тому подтверждение. Кроме того, имеется еще и SDK, который содержит кучу примеров и информации – фактически все, что только может потребоваться Windows-разработчику. Это реально круто, и я надеюсь, что в будущем компания будет придерживаться такого пути. Тебе, приятель, я хочу пожелать удачи в программировании. Ни в коем случае не теряй времени и не отставай от прогресса. Уже сейчас начинай готовить версию своих мега-проектов для Windows 7. Тем более, для этого есть все необходимое. Если с чем-то не разберешься, то пиши мне. С удовольствием постараюсь помочь. Полезные ресурсы
А как же Delphi?Вполне возможно, что ты - родом из банды бывших дельфийцев, вынужденных в силу понятных причин перейти на Visual Studio от корпорации зла. Но что, если у тебя есть проекты, требующие поддержки новой ОС и ее новых функций? Если твой ответ «да», то значит, эта врезка для тебя. Daniel Wischnewski создал пакет компонент под названием «Windows 7 Controls for Delphi». С помощью компонент, входящих в этот набор, ты с легкостью сможешь встроить в свое приложение поддержку следующих функций:
Неплохо? А если учесть, что все это хозяйство бесплатно – и безглючно работает на Delphi 7-2009, то просто замечательно! DVDСорцы, компоненты и прочие ништяки ты сможешь найти на нашем диске. |