-
Unknown_user (26.03.12 15:51) [0]DrawThemeBackground в Windows 7 непонятно по каким причинам не рисует фон выделенного элемента. Использую TVirtualTreeView. Вот код.Theme := OpenThemeData(Handle, 'TREEVIEW');
DrawThemeBackground(Theme, Canvas.Handle, TVP_TREEITEM, TREIS_SELECTED, InnerRect, nil);
Происходит это не сразу, а после добавления/удаления узлов в дерево. Похоже, что триггером является дерево с одним узлом.
http://www.geosystema.net/samples/DrawThemeBackgroundBug.png
На картинке справа дерево в котором DrawThemeBackground отрабатывает как положено. В дереве слева рисуется лишь рамка. -
p © (26.03.12 16:15) [1]SetWindowTheme(Handle, 'explorer', nil);
Theme := OpenThemeData(Handle, 'TREEVIEW');
DrawThemeBackground(Theme, Canvas.Handle, TVP_TREEITEM, TREIS_SELECTED, InnerRect, nil); -
>p
Спасибо. Очень помогли. Оказалось, виноват TVirtualTreeView. Вот код, содержащий баг
procedure TCustomVirtualTreeOptions.SetPaintOptions
(const Value: TVTPaintOptions);
...
if FPaintOptions <> Value then
begin
ToBeSet := Value - FPaintOptions;
ToBeCleared := FPaintOptions - Value;
FPaintOptions := Value;
with FOwner do
if HandleAllocated then
begin
{$IFDEF ThemeSupport}
if (tsUseThemes in FStates) or (toThemeAware in ToBeSet <-- вместо этого надо использовать Value) then
if (toUseExplorerTheme in ToBeSet <-- вместо этого надо использовать Value) and IsWinVistaOrAbove then
SetWindowTheme(Handle, 'explorer', nil)
else
SetWindowTheme(Handle, '', nil);
{$ENDIF ThemeSupport}
Я изменял PaintOptions дерева. Когда в списке оказывался один узел я убирал toShowTreeLines. Это вызывало срабатываниеSetWindowTheme(Handle, '', nil);
так как в переменной ToBeSet не было toUseExplorerTheme и toThemeAware.
Кто использует TVirtualTreeView возьмите на заметку. -
KilkennyCat © (27.03.12 07:45) [3]опубликуй здесь http://code.google.com/p/virtual-treeview/. правда, они тормозят с исправлениями, но другие прочтут.