研究を尽くした後、私はそれを見つけました。事はあなたが電話するとき
SetWindowTheme(this.Handle, "", "");
カスタムListView
クラス内では、視覚的なスタイルがコントロールの外観に影響を与えるのを防ぎますが、の子ウィンドウであるヘッダーコントロール(ウィンドウ)には影響を与えListView
ません。したがって、関数を呼び出すときは、ListViewのハンドルではなく、ヘッダーウィンドウのハンドルを指定する必要があります。ListView
SysHeader32
ListView
SetWindowTheme
[DllImportAttribute("uxtheme.dll")]
private static extern int SetWindowTheme(IntPtr hWnd, string appname, string idlist);
[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);
// Callback method to be used when enumerating windows:
private static bool EnumWindow(IntPtr handle, IntPtr pointer)
{
GCHandle gch = GCHandle.FromIntPtr(pointer);
List<IntPtr> list = gch.Target as List<IntPtr>;
if (list == null)
throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>");
list.Add(handle);
return true;
}
// delegate for the EnumChildWindows method:
private delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);
// get first child:
private static void DisableVisualStylesForFirstChild(IntPtr parent)
{
List<IntPtr> children = new List<IntPtr>();
GCHandle listHandle = GCHandle.Alloc(children);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
if (children.Count > 0)
SetWindowTheme(children[0], "", "");
}
finally
{
if (listHandle.IsAllocated)
listHandle.Free();
}
}
protected override void OnHandleCreated(EventArgs e)
{
DisableVisualStylesForFirstChild(this.Handle);
base.OnHandleCreated(e);
}