Программируем Windows 7: Taskbar. Часть 2 — ThumbButtons

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



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

    Несомненно, такая функциональность может быть полезна не только для Media Player, но и для наших приложений. Давайте посмотрим как можно реализовать это в нашем приложении.

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

    Создание наших кнопок должно происходить в момент обработки события 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 кнопок.



    Удачи вам в разработке ваших приложений для Windows 7!

    Демонстрационное приложение:
    ThumbButtons.zip
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 47

      +6
      Вот уж точно, «куда ни ткни — везде нажимается» :)
      А вообще, прикольно — главное применять с умом.
        +1
        С умом все нужно делать!
        Taskbar в Win7 просто супер, даже не знаю что можно придумать еще )
          +1
          можно, раньше и об такой не думали :)
            +4
            Согласен на все 100%, надеюсь аналог появится и в Linux. Завидую белой завистью ;)
            • НЛО прилетело и опубликовало эту надпись здесь
                +6
                Я наверное не буду оригинален, если заявлю, что все панели в linux — унылое говно. У меня есть претензии ко всем стандартным, вроде панелей в gnome или KDE. И мегапретензии к поделиям типа cairo dock и прочей наколеночной ерунде.

                А панелька в win7 действительно удобна.
                  –2
                  Просто если разобраться будет отличная понелька!
                  Я лично в убунте делал, очень нравилось
                    0
                    Делали что?
                  • НЛО прилетело и опубликовало эту надпись здесь
                      +1
                      А вы её пробовали? Я тащусь от возможности не просто _смотреть_ на всплывающее превью разных окон фаерфокса, а закрывать их прям оттуда. И возможности совершать действия вроде как в этом примере описанные меня доставляет.

                      Жутко удобно.
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          Вы молодец. Но у меня терпения не хватит, если все приложения запускать на отдельных рабочих столах.

                          И опять-же, проблема всплывающих окон в браузере. В Win7 она теперь решается чертовски элегантно. Навел мышу на кнопку браузера, двумя щелчками закрыл лишние окна. Мне очень нравится.
                            –1
                            А что мешает настроить в ФФ боковую панель(автоматически скрываемую), чтобы закрыть вкладку 1 кликом?
                              0
                              Какую вкладку? Речь идет о надоедливой рекламе, которая открывает новые окна.
                            +1
                            а зачем?
                            раньше это было оправдано, когда место в панели задач не хватало.
                            сейчас, с новой панелью задач, это отпадает само собой мне кажется.
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                Вам совсем о другом говорят. Прелесть рабочих столов я не опровергаю. Но и чрезвычайное удобство новой панели в win7 вам не получится опровергнуть.
                                • НЛО прилетело и опубликовало эту надпись здесь
                            0
                            а еще в превьюхах нормально крутится видео которое идет в самом окне, впервые я такое на маке увидел в лаунчере
                              0
                              Ну, в Убунту я это видел ещё года два назад. Не показатель.
                        0
                        ...«никто не станет патчить имеющуюся базу софта»

                        это и тормозит развитие — ибо замкнутый круг получается
                        • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          хоть я и убунтовец, но фичи таскбара в семерке нравятся. был бы рад появлению оных в гноме\кедах.
                          • НЛО прилетело и опубликовало эту надпись здесь
                          –4
                          Надеюсь такой шлак не появится.
                            +1
                            Такой 100% аналог уже есть в Linux, только настраивать его очень тяжело, приходится использовать и Conpiz эффекты.
                        –3
                        спасибо, очень познавательно
                        • НЛО прилетело и опубликовало эту надпись здесь
                            +5
                            спасибо, неплохо. есть свои проблемы, вы о них знаете;)
                            +1
                            Блин, ты тоже заметил
                              0
                              типа «чиооорд, скоро это будет в квипе, срочно пишем в миранду»? ;D
                                +7
                                Ну примерно в обратном порядке )
                            +2
                            наверное стоит завести блог «Программируем под Windows7» :) с удовольствием присоединюсь
                              0
                              Хорошая идея.
                              +7
                              плагин под foobar2000 для аналогичного функционала: wintense.com/plugins/foo_w7shell

                              очень хорошая вещь эти ThumbButtons =)
                                +1
                                Хоткеи удобней.
                                Кстати, вот всем Вин 7 нравится, но как бы отключить Win+Arrow Key, у меня на эти хоткеи в фубаре назначены пре-след трек и ругулировка громкости, а тут 7 управляет окнами :(
                                +1
                                :)
                                  +1
                                  А такой плагин для WinAmp не встречал никто?
                                +1
                                охота все это попробовать скорее самому :) такс, сдам сессию, буду ставить вин7 :)
                                  +1
                                  Исправьте, плиз, «чтобы обработчик нажалработать» (начал).
                                    0
                                    спасибо, исправил
                                    0
                                    про shell extensions под windows7 не хотите написать? мне очень интересно
                                      0
                                      чуть позже

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое