Winforms .NET ListView和Windows 7

Winforms .NET ListView和Windows 7,winforms,listview,windows-7,Winforms,Listview,Windows 7,也许我错过了什么,但是。。。 Windows7中的ListView控件在选定项周围显示一个高亮显示,看起来像一个3D蓝色半透明矩形(我不是说选择矩形,而是实际选定项周围的矩形)。当鼠标悬停在项目上时,它甚至会显示一个较亮的矩形 但是,当我在WinForms中使用ListView(即使是双缓冲)时,所选项目只有一个纯蓝色背景(没有悬停背景),这看起来比资源管理器中的列表要不专业得多 有人知道我应该调用什么秘密API函数来使.NET ListView看起来与操作系统的其他部分一致吗 例如,这里是我在

也许我错过了什么,但是。。。 Windows7中的ListView控件在选定项周围显示一个高亮显示,看起来像一个3D蓝色半透明矩形(我不是说选择矩形,而是实际选定项周围的矩形)。当鼠标悬停在项目上时,它甚至会显示一个较亮的矩形

但是,当我在WinForms中使用ListView(即使是双缓冲)时,所选项目只有一个纯蓝色背景(没有悬停背景),这看起来比资源管理器中的列表要不专业得多

有人知道我应该调用什么秘密API函数来使.NET ListView看起来与操作系统的其他部分一致吗

例如,这里是我在C++中使用的一个应用程序,使用标准的ListVIEW控件在Windows 7中:(注意高亮和悬停矩形)< /P>

下面是用WinForms在C#中对该应用程序的重写:(注意粗略的突出显示和无悬停)


好的,我完全明白了,这可能会帮助其他被这个问题困扰的人

我首先注意到C++Builder中的ListView控件在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最终看起来像是属于操作系统的其他部分!谢谢你,伯兰·卡德罗!你真是太棒了

编辑:现在它对我也起作用了,确切的签名是:

 <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

私有共享函数SetWindowsTheme(ByVal句柄作为IntPtr,ByVal应用程序作为字符串,ByVal id作为字符串)作为整数
'将函数留空-DLLImport属性将调用转发到正确的函数
端函数
公共共享子MakeControlLookBeautiful(ByVal c作为Windows.Forms.Control)
SetWindowsTheme(c.Handle,“资源管理器”,无)
端接头
:)

导入System.Runtime.InteropServices
公开课表格1
_
公共共享函数SetWindowTheme(ByVal hWnd作为IntPtr,ByVal textSubAppName作为String,ByVal textSubIdList作为String)作为整数
端函数
私有子表单1_Load(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理MyBase.Load
SetWindowTheme(lst.Handle,“资源管理器”,无内容)
端接头
末级
上面的代码将像一个冠军一样工作

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