En el código que has demostrado, que están manejando el dibujo mismo para todos los nodos cuyo tipo es 5 ó 6. Para el resto de los tipos, usted es simplemente permitiendo que el sistema dibujar los nodos de la manera predeterminada. Es por eso que todos tienen las líneas como se esperaba, pero las que usted es dueña del dibujo no: ¡olvidó dibujar en las líneas! Cuando dices e.DrawDefault = false;
, se supone que realmente lo dices en serio. Ninguno de los dibujos regulares está hecho, incluidas las líneas estándar.
Tendrá que dibujar en esas líneas usted mismo, o averiguar cómo hacerlo sin el dibujo del propietario en absoluto.
Desde el código que tiene ahora, parece que intenta simular el estilo de dibujo nativo del sistema tanto como sea posible en su código de dibujo del propietario, por lo que no está claro para mí qué es exactamente lo que logra mediante el dibujo del propietario en primer lugar. Si solo intenta evitar que las casillas de verificación aparezcan para los nodos de tipo 5 y 6 (que, como las líneas, simplemente no se dibujan porque no los está dibujando), hay una forma más sencilla de hacerlo sin involucrar al propietario. dibujo.
Entonces, usted pregunta, ¿cuál es la forma más sencilla de ocultar las casillas de verificación de los nodos individuales? Bueno, resulta que el control TreeView
en realidad es compatible con esto, pero esa funcionalidad no está expuesta en .NET Framework. Necesitas P/Invocar y llamar a la API de Windows para obtenerlo. Agregue el código siguiente a su clase de formulario (asegúrese de que ha añadido una declaración using
para 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);
}
todas las cosas desordenado en la parte superior son sus declaraciones P/Invoke. Necesita un puñado de constantes, el TVITEM
structure que describe los atributos de un elemento treeview y el SendMessage
function. En la parte inferior está la función que realmente llamará para hacer la escritura (HideCheckBox
). Simplemente pase el control TreeView
y el elemento TreeNode
particular desde el que desea eliminar la marca de verificación.
para que pueda quitar las marcas de verificación de cada uno de los nodos secundarios para conseguir algo que se parece a esto:
posible duplicado de [Busco a un buen recurso en treeviews ownerdrawn ] (http://stackoverflow.com/questions/4179522/i-am-looking-for-a-good-resource-on-ownerdrawn-treeviews) –
Estoy de acuerdo con Hans; el sorteo del propietario generalmente es prohibitivamente difícil. Si insistes, encontré una muestra más completa de una vista de árbol dibujada por el propietario como respuesta a [esta pregunta] (http://stackoverflow.com/questions/1003459/c-treeview-owner-drawing-with-ownerdrawtext- and-the-weird-black-highlighting-wh/1004087), completo con las líneas de nodo. –