Блог Александра Божко
Архивы
Рубрики

ThumbBarAddButtons

Пост шпаргалка. Если вы обладатель Delphi XE6 или Delphi XE7, вам не нужно делать каких-то хитрых телодвижений, для того, создания кнопок на панели, соответствующей приложению в TaskBar‘е. Вы можете воспользоваться компонентом TTaskBar и, таким образом, решить все проблемы. Но, что делать, пользователям Delphi предыдущих версий (попутно напомню,  что при покупке последней версии Delphi вы получаете ключи ко всем предыдущим версиям, начиная с Delphi 7)?

У Боба Сворта есть довольно подробный солюшн, но я нашел в нем некоторые неточности. Ниже приведу свою, немного модифицированную версию данного решения.

Создание TaskbarList‘а ничем особо не отличается. Этот код будет работать и в Windows 7 и в Windows 8:

 

  procedure CreateTaskBarList();
  begin
      TaskbarList := CreateComObject(CLSID_TaskbarList) as ITaskbarList;
      TaskbarList.HrInit;
      Supports(TaskbarList, IID_ITaskbarList2, TaskbarList2);
      Supports(TaskbarList, IID_ITaskbarList3, TaskbarList3);
      Supports(TaskbarList, IID_ITaskbarList4, TaskbarList4);

    if not Application.MainFormOnTaskBar then
      FormHandle := Application.Handle
    else FormHandle := Application.MainForm.Handle;

      TaskbarList3.ThumbBarSetImageList(FormHandle, FMain.ImageList2.Handle);
  end;

Естественно, предварительно нужно проверить версию Windows (она должна быть не ниже 7). Я делаю это так же как и Dr. Bob:

  NeedCreateTBwButtons:= ((Win32MajorVersion=6) and (Win32MinorVersion>0)) or (Win32MajorVersion>6);

В надежде на то, что в последующих версиях Windows этот функционал никуда не денется. Ниже приведены значения переменных для существующих версий системы.

Win32MajorVersion Win32MinorVersion
6
  • Windows 8 (version 6.2)
  • Windows 7 (version 6.1)
  • Windows Vista (version 6.0)
5
  • Windows XP (version 5.1)
  • Windows 2000 (version 5.0)

А вот с кнопками на панели все не так просто. То, что показано в исходном примере работать будет. Но только для случая с одной кнопкой. Если внимательно почитать документацию, то в качестве параметра для метода ThumbBarAddButtons передается ссылка на массив THUMBBUTTON, а не на отдельную кнопку. Максимальное количество элементов в массиве – 7. Массив должен быть статическим.

Я описал его так:

ThbButtons: array [0..3] of TThumbButton;

Соответственно, кнопки я создаю следующим образом:

    ThbButtons[0].iId := 42;
    ThbButtons[0].iBitmap := 0;
    ThbButtons[0].dwMask := THB_FLAGS or THB_BITMAP or THB_TOOLTIP;
    ThbButtons[0].dwFlags :=  THBF_ENABLED;

    StrCopy(ThbButtons[0].szTip, PChar('Start Timer'));

    ThbButtons[1].iId := 43;
    ThbButtons[1].iBitmap := 1;

    ThbButtons[1].dwMask := THB_FLAGS or THB_BITMAP or THB_TOOLTIP;
    ThbButtons[1].dwFlags :=  THBF_ENABLED;

    StrCopy(ThbButtons[1].szTip, PChar('Pause Timer'));

    ThbButtons[2].iId := 44;
    ThbButtons[2].iBitmap := 2;

    ThbButtons[2].dwMask := THB_FLAGS or THB_BITMAP or THB_TOOLTIP;
    ThbButtons[2].dwFlags :=  THBF_ENABLED ;

    StrCopy(ThbButtons[2].szTip, PChar('Stop Timer'));

    ThbButtons[3].iId := 45;
    ThbButtons[3].iBitmap := 3;

    ThbButtons[3].dwMask := THB_FLAGS or THB_BITMAP or THB_TOOLTIP;
    ThbButtons[3].dwFlags :=  THBF_ENABLED;

    StrCopy(ThbButtons[3].szTip, PChar('Cancel'));

    TaskbarList3.ThumbBarAddButtons(FormHandle, 4, @ThbButtons);

Значения флагов, что называется “dwFlags”, не буду здесь их перечислять, для этого есть документация.

Как вы, наверное, уже догадались, здесь я реализовал кнопки  таймера. Обработчик события нажатия кнопок можно реализовать так. как и в базовом примере (отловить сообщение WM_COMMAND). В демонстрационном примере он у меня сработал, а вот в реальном приложении, – почему-то нет. Вероятно, где-то что-то перекрывается. Я не слишком огорчился сему факту, и использовал событие OnMessage компонента ApplicationEvents.

Получилось примерно так: Читать далее

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика