2009-12-20 28 views
5

Có lẽ tôi đang thiếu thứ gì đó, nhưng ... Điều khiển ListView trong Windows 7 hiển thị điểm nổi bật quanh các mục được chọn giống như hình chữ nhật mờ màu xanh 3D (Tôi không nói về lựa chọn hình chữ nhật, nhưng hình chữ nhật xung quanh các mục đã chọn thực tế). Nó thậm chí còn hiển thị hình chữ nhật nhẹ hơn khi di chuột qua các mục. Tuy nhiên, khi tôi sử dụng ListView trong WinForms (ngay cả khi được đệm đôi), các mục đã chọn chỉ có nền màu xanh đơn giản (và không có nền di chuột) trông kém chuyên nghiệp hơn nhiều so với danh sách trong Explorer. Quay lại đầu trang.NET ListView và Windows 7

Có ai biết chức năng API bí mật nào tôi nên gọi để làm cho .NET ListView trông phù hợp với phần còn lại của hệ điều hành không?

Ví dụ, đây là một trong những ứng dụng của tôi viết bằng C++, sử dụng một điều khiển ListView tiêu chuẩn trong Windows 7: (chú ý nổi bật và di chuột hình chữ nhật)

alt text

Và đây là một viết lại điều đó ứng dụng trong C# với WinForms: (chú ý nổi bật thô và không di chuột)

alt text

Trả lời

12

OK, tôi hoàn toàn figured it out, và điều này có thể giúp những người khác đang làm phiền bởi những vấn đề này.

Tôi bắt đầu bằng cách nhận thấy rằng điều khiển ListView trong C++ Builder trông "chính xác" trong Windows 7, vì vậy tôi đã tìm mã nguồn cho VCL để xem loại ma thuật mà họ đang làm để làm cho giao diện của ListView như điều khiển danh sách trong Windows Explorer. Tôi vấp vào một dòng mã trông đầy hứa hẹn:

SetWindowTheme(Handle, 'explorer', nil); 

Từ tài liệu SDK, chức năng này "Nguyên nhân một cửa sổ để sử dụng một tập thông tin khác nhau phong cách trực quan hơn so với các lớp học thường sử dụng."

Vì vậy, tôi đã cố gắng gọi chức năng này trên điều khiển ListView WinForms tôi:

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


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

... và, bởi thần, nó làm việc! ListView cuối cùng trông giống như nó thuộc về phần còn lại của hệ điều hành! Cảm ơn, Borland Inprise Embarcadero! Bạn thực sự là tốt cho một cái gì đó!

0

chỉnh sửa: bây giờ nó đang làm việc cho tôi quá, chữ ký chính xác là:

<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 

Đoạn mã trên sẽ làm việc như một nhà vô địch ...