понедельник, 14 декабря 2009 г.

Qt & Windows 7 Taskbar

Всё мы знаем или по крайней мере наслышаны о нововведениях в пользовательском интерфейсе Windows 7. А конкретно о новом task bar. Ну а если ещё нет, то поиск Вам поможет :) Семёрку смотрел ещё, когда она была бетой, и она мне сразу понравилась.

В последнее время я занимаюсь разработкой программ с использованием библиотеки Qt, в частности и под Windows платформу. Естественно мне захотелось использовать новые возможности Windows 7, а именно возможность отображения прогресса прямо в task bar'е. Библиотека Qt не содержит средств для этого, а поиск готовых решений не дал результатов (может плохо искал? :)).Поэтому я решил сделать это сам.


Многие новые возможности task bar'а доступны через интерфейс ITaskbarList3 (ITaskBarList4). Данный интерфейс можно использовать после того, как окном будет получено пользовательское сообщение "TaskbarButtonCreated", которое означает, что на панели задач была размещена кнопка для данного окна. Всё это дело я решил оформить в виде класса, который можно было бы легко подключать и использовать в готовых приложениях. Единственной проблемой стал отлов сообщения "TaskbarButtonCreated". Сначала я хотел использовать eventFilter и installEventFilter, но как оказалось eventFilter обрабатывает только сообщения определённые в QEvent. Другим вариантом было использование метода QCoreApplication::setEventFilter, но здесь не всё гладко. А вдруг наше приложение тоже использует setEventFilter для установки своего обработчика? Тогда надо проследить последовательность установки-восстановления обработчиков, чтобы избежать возникновения ошибок. И наконец я пришёл к варианту создания невидимого окна и использования метода winEvent для получения сообщения. В итоге получился класс QTaskbarList3 оформленный в виде singleton.

В качестве примера написал небольшую программку, которая создаёт дочерние окна с progress bar и возможностью его управления (QtWin7_src.zip, QtWin7_exe.zip).

Комментариев нет:

Отправить комментарий