В показанном вами коде вы сами обрабатываете рисование для всех узлов, тип которых 5 или 6. Для остальных типов вы просто позволяете системе рисовать узлы впуть по умолчанию.Вот почему все они имеют линии, как и ожидалось, а те, которые вы рисуете у владельца, нет: вы забыли нарисовать линии!Видите ли, когда вы говорите e.DrawDefault = false;
, предполагается, что вы действительно это имеете в виду.Ничего из обычного рисования не выполняется, включая стандартные линии.
Вам нужно будет либо сами нарисовать эти линии, либо придумать, как вообще обойтись без рисования владельцем.
Из кода, который у вас есть сейчас, похоже, что вы пытаетесь максимально симулировать собственный стиль рисования системы в своем коде рисования владельцем, поэтому мне неясно, что именно вы выполняете с помощью рисования владельцем в первомместо.Если вы просто пытаетесь не показывать флажки для узлов типа 5 и 6 (которые, как и линии, просто не прорисовываются, потому что вы их не рисуете!), Есть более простой способ сделать это без привлечения владельца.рисование.
Итак, вы спрашиваете, как проще прятать флажки для отдельных узлов?Что ж, получается, что сам элемент управления TreeView
фактически поддерживает это, но эта функциональность не предоставляется в .NET Framework.Вам нужно P / Invoke и вызвать Windows API, чтобы получить это.Добавьте следующий код в свой класс формы (убедитесь, что вы добавили объявление using
для System.Runtime.InteropServices
):
private const int TVIF_STATE = 0x8;
private const int TVIS_STATEIMAGEMASK = 0xF000;
private const int TV_FIRST = 0x1100;
private const int TVM_SETITEM = TV_FIRST + 63;
[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)]
private struct TVITEM
{
public int mask;
public IntPtr hItem;
public int state;
public int stateMask;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpszText;
public int cchTextMax;
public int iImage;
public int iSelectedImage;
public int cChildren;
public IntPtr lParam;
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam,
ref TVITEM lParam);
/// <summary>
/// Hides the checkbox for the specified node on a TreeView control.
/// </summary>
private void HideCheckBox(TreeView tvw, TreeNode node)
{
TVITEM tvi = new TVITEM();
tvi.hItem = node.Handle;
tvi.mask = TVIF_STATE;
tvi.stateMask = TVIS_STATEIMAGEMASK;
tvi.state = 0;
SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
}
Все беспорядочные элементы в верхней части - это ваши объявления P / Invoke.Вам понадобится несколько констант, структура TVITEM
, которая описывает атрибуты элемента дерева, и функция SendMessage
.Внизу находится функция, которую вы на самом деле будете вызывать для совершения дела (HideCheckBox
).Вы просто передаете элемент управления TreeView
и конкретный элемент TreeNode
, из которого вы хотите удалить флажок.
Таким образом, вы можете удалить флажки с каждого из дочерних узлов, чтобы получить нечто похожее на это: