.NET ListView и Windows 7 - PullRequest
       21

.NET ListView и Windows 7

5 голосов
/ 20 декабря 2009

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

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

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

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

alt text

А вот и переписать это приложение на C # с WinForms: (обратите внимание на грубую подсветку и отсутствие наведения)

alt text

Ответы [ 3 ]

12 голосов
/ 21 декабря 2009

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

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

1 голос
/ 04 декабря 2010
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

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

0 голосов
/ 27 июля 2010

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

 <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

:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...