Как можно получить изображение, которое использует Windows 7, чтобы нарисовать родительские узлы в древовидном элементе управления? - PullRequest
14 голосов
/ 07 мая 2011

Я работаю в пользовательском элементе управления, который смешивает два элемента управления окна (просмотр списка и просмотр дерева). В какой-то момент мне нужно нарисовать изображение, которое использует windows 7 (с включенными темами) для идентификации родительских узлов, я использую функцию DrawThemeBackground с частью TVP_GLYPH и GLPS_CLOSED состояние (я попытался со всеми частями и состояниями, связанными с классом TREEVIEW без удачи), но в результате изображение всегда будет старым (+) или (-).

Это изображение показывает проблему

enter image description here

Я хочу нарисовать изображение Arrow (внутри черного круга) вместо знака (+) (внутри оранжевого круга).

Это пример кода, который я использую для рисования изображения.

uses
  UxTheme;

procedure TForm40.Button1Click(Sender: TObject);
var
  iPartId : integer;
  iStateId: integer;
  hTheme  : THandle;
begin
  hTheme  := OpenThemeData(Handle, VSCLASS_TREEVIEW);

  iPartId := TVP_GLYPH;
  iStateId:= GLPS_CLOSED;          
  //iPartId := TVP_TREEITEM;
  //iStateId:= TREIS_NORMAL;
  if hTheme <> 0 then
    try

      //if (IsThemeBackgroundPartiallyTransparent(hTheme, iPartId, iStateId)) then
      //    DrawThemeParentBackground(Handle, PaintBox1.Canvas.Handle, nil);

      DrawThemeBackground(hTheme, PaintBox1.Canvas.Handle, iPartId, iStateId, Rect(0, 0, 31, 31), nil);
    finally
      CloseThemeData(hTheme);
    end;
end;

Я проверяю несколько инструментов, таких как приложение от Andreas Rejbrand и , это тоже , но я не могу найти нужное изображение.

Мой вопрос: как мне получить изображение arrow ?

UPDATE

Благодаря ответу на вопрос Стигма я нашел дополнительные ресурсы для значений частей и состояний класса Explorer::Treeview.

Ответы [ 2 ]

10 голосов
/ 07 мая 2011

Прежде всего, в случае обычного ListView или TreeView, можно просто вызвать SetWindowTheme на его дескрипторе, чтобы применить правильный вид стилей.Пример со страницы MSDN выглядит следующим образом:

SetWindowTheme(hwndList, L"Explorer", NULL);

Поскольку мы говорим о пользовательском элементе управления, я не уверен, что это применимо здесь.Но поскольку SetWindowTheme приводит к отправке сообщения WM_THEMECHANGED в соответствующее окно, это означает, что вам просто нужно будет использовать правильный вызов OpenThemeData для конкретного субtheme.

Я думаю, что комментарий Люка правильный.Вам, вероятно, просто нужно передать 'Explorer :: Treeview', а не простой стиль.Итак, за исключением того, что годы не касались Delphi / Pascal:

hTheme  := OpenThemeData(Handle, 'Explorer::Treeview');
2 голосов
/ 07 мая 2011

Вы должны установить SetWindowTheme(Handle, 'explorer', nil); перед рисованием, чтобы OpenThemeData использовал новую тему в стиле проводника.Конечно, дескриптор окна должен быть одинаковым для обеих функций.

...