.NET ListView и Windows 7

Возможно, я пропускаю что-то, но... Управление ListView в Windows 7 отображает выделение вокруг выбранных пунктов, которое похоже на 3D синий полупрозрачный прямоугольник (я не говорю о прямоугольнике выбора, но прямоугольнике вокруг фактических выбранных пунктов). Это даже показывает более легкий прямоугольник при парении над объектами.

Однако, когда я использую ListView в WinForms (даже когда с двойной буферизацией), выбранные пункты просто имеют простой синий фон (и никакой фон при наведении курсора), который выглядит намного менее профессиональным, чем, скажем, список в Проводнике.

Кто-либо знает, какую секретную API-функцию я должен назвать, чтобы заставить ListView.NET посмотреть в соответствии с остальной частью ОС?

Например, вот одно из моих приложений, записанных в C++, с помощью стандартного управления ListView в Windows 7: (заметьте выделение и прямоугольник при наведении курсора),

alt text

И вот переписывание того приложения в C# с WinForms: (заметьте сырое выделение и никакое парение),

alt text

5
задан Community 8 February 2017 в 14:18
поделиться

1 ответ

Хорошо, я полностью понял это, и это может помочь другим, кого беспокоит эта проблема.

Я начал с того, что заметил, что элемент управления ListView в C ++ Builder выглядит «правильным» в Windows 7, поэтому я просмотрел исходный код VCL, чтобы увидеть, какие чудеса они делают, чтобы ListView выглядел как элемент управления списком в проводнике Windows. Я наткнулся на одну строку кода, которая выглядела многообещающей:

SetWindowTheme(Handle, 'explorer', nil);

Из документации SDK эта функция «заставляет окно использовать другой набор визуальных стилей информации, чем обычно использует его класс».

Итак, я попытался вызвать это функция в моем элементе управления WinForms ListView:

[DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
public static extern int SetWindowTheme(IntPtr hWnd, String pszSubAppName, String pszSubIdList);


SetWindowTheme(myListView.Handle, "explorer", null);

... и, клянусь богом, это сработало! ListView наконец-то выглядит так, как будто он принадлежит остальной части ОС! Спасибо, Borland Inprise Embarcadero! Вы действительно в чем-то хороши!

12
ответ дан 18 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: