2009-12-20 16 views
5

Może brakuje mi czegoś, ale ... Kontrolka ListView w Windows 7 wyświetla wyróżnienie wokół wybranych elementów, które wygląda jak trójwymiarowy niebieski półprzezroczysty prostokąt (nie mówię o selekcji prostokąt, ale prostokąt wokół aktualnie wybranych elementów). Pokazuje nawet jaśniejszy prostokąt, gdy unosi się nad przedmiotami..NET ListView i Windows 7

Jednak, gdy używam ListView w WinForm (nawet gdy jest to bufor podwójnie buforowany), wybrane elementy mają po prostu gładkie niebieskie tło (i bez tła najechania), które wygląda o wiele mniej profesjonalnie niż, powiedzmy, lista w Eksploratorze.

Czy ktoś wie, jakie tajne funkcje API powinienem wywołać, aby lista .NET ListView wyglądała zgodnie z resztą systemu operacyjnego?

Na przykład, tutaj jest jednym z moich aplikacje napisane w języku C++, przy użyciu standardowej kontroli ListView w Windows 7: (zauważ, podświetlenie i unoszą prostokąt)

alt text

I tu jest przepisanie że aplikacji w C# z WinForms: (zauważ surowy podświetlenie i nie najechania kursorem)

alt text

Odpowiedz

12

OK, ja całkowicie zorientowaliśmy się, a to może pomóc innym, którzy są jedno na ten problem.

Zacząłem od zauważenia, że ​​kontrolka ListView w C++ Builder wygląda "poprawnie" w Windows 7, więc sprawdziłem w kodzie źródłowym VCL, aby zobaczyć, jaki rodzaj magii robią, aby wygląd ListView podobnie jak kontrola listy w Eksploratorze Windows. Natknąłem się na jednej linii kodu, który wyglądał obiecująco:

SetWindowTheme(Handle, 'explorer', nil); 

z dokumentacji SDK, to funkcja „powoduje okna do używania innego zestawu informacji o stylu wizualnego niż jego klasa normalnie używa”.

Tak, próbowałem wywoływanie tej funkcji na moim WinForms kontroli ListView:

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


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

... i, na Boga, to działa! ListView w końcu wygląda tak, jak należy do reszty systemu operacyjnego! Dzięki, Borland Inprise Embarcadero! Naprawdę jesteś dobry na coś!

0

edit: teraz pracuje dla mnie zbyt dokładna podpis jest:

<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 

Powyższy kod będzie działać jak mistrz ...