2009-12-20 3 views
5

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

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

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

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

alt text

А вот переписывают что применение в C# с WinForms: (обратите внимание на сырую изюминку и не парить)

alt text

ответ

12

ОК, я полностью понял это, и это может помочь другим, которые обеспокоены этим вопросом.

Я начал с того, что заметил, что элемент управления 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! Вы действительно хороши для чего-то!

0

редактировать: теперь он работает для меня тоже, точная подпись:

<DllImport("uxtheme.dll", 
    BestFitMapping:=False, 
    CharSet:=CharSet.Unicode, 
    EntryPoint:="#136", 
    CallingConvention:=CallingConvention.Winapi)> 
    Private Shared Function SetWindowsTheme(ByVal handle As IntPtr, ByVal app As String, ByVal id As String) As Integer 
     ' Leave function empty - DLLImport attribute forwards calls to the right function 
    End Function 


Public Shared Sub MakeControlLookBeautiful(ByVal c As Windows.Forms.Control) 
    SetWindowsTheme(c.Handle, "explorer", Nothing) 
End Sub 

:)

1
Imports System.Runtime.InteropServices 

Public Class Form1 
    <DllImport("uxtheme", CharSet:=CharSet.Unicode)> _ 
    Public Shared Function SetWindowTheme(ByVal hWnd As IntPtr, ByVal textSubAppName As String, ByVal textSubIdList As String) As Integer 
    End Function 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     SetWindowTheme(lst.Handle, "explorer", Nothing) 
    End Sub 
End Class 

Приведенный выше код будет работать как чавканье ...

Смежные вопросы