Nel codice che avete mostrato, si gestisce il te stesso disegno per tutti i nodi il cui tipo è o 5 o 6. Per il resto dei tipi, si sta semplicemente permettendo al sistema disegnare i nodi nel modo predefinito. Ecco perché hanno tutte le linee come previsto, ma quelle che stai disegnando dal proprietario non lo fanno: ti sei dimenticato di tracciare le linee! Vedete, quando si dice e.DrawDefault = false;
si presume che lo si intenda davvero. Nessuno dei disegni regolari è finito, comprese le linee standard.
O dovrete disegnare in quelle linee da soli, o capire come cavarsela senza il disegno del proprietario.
Dal codice che hai ora, sembra che tu stia cercando di simulare il più possibile lo stile di disegno nativo del sistema nel tuo codice di disegno proprietario, quindi non mi è chiaro che cosa realizzi esattamente dal disegno del proprietario innanzitutto. Se stai solo cercando di non mostrare le caselle di controllo per i nodi di tipo 5 e 6 (che, come le linee, semplicemente non vengono disegnate perché non le stai disegnando!), C'è un modo più semplice per farlo senza coinvolgere il proprietario disegno.
Quindi, chiedi, qual è il modo più semplice per nascondere le caselle di controllo per i singoli nodi? Bene, si scopre che il controllo TreeView
in realtà supporta questo, ma quella funzionalità non è esposta in .NET Framework. È necessario P/Invoke e chiamare l'API di Windows per ottenere a esso. Aggiungere il seguente codice alla classe form (assicurati di aver aggiunto una dichiarazione using
per 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);
}
tutte le cose disordinato in alto sono i vostri P/Invoke dichiarazioni. Sono necessarie una manciata di costanti, lo TVITEM
structure che descrive gli attributi di un elemento di visualizzazione struttura e lo SendMessage
function. In basso c'è la funzione che chiamerai per fare l'atto (HideCheckBox
). È sufficiente passare il controllo TreeView
e il particolare elemento TreeNode
da cui si desidera rimuovere il segno di spunta.
modo da poter rimuovere i segni di spunta da ciascuno dei nodi figlio per ottenere qualcosa che assomiglia a questo:

possibile duplicato del [Sto cercando una buona risorsa su treeviews ownerdrawn ] (http://stackoverflow.com/questions/4179522/i-am-looking-for-a-good-resource-on-ownerdrawn-treeviews) –
Sono d'accordo con Hans; il tiraggio del proprietario è generalmente proibitivo. Se insisti, ho trovato un esempio più completo di una vista ad albero disegnata dal proprietario data come risposta a [questa domanda] (http://stackoverflow.com/questions/1003459/c-treeview-owner-drawing-with-ownerdrawtext- e-the-weird-black-highlighting-wh/1004087), completo con le linee del nodo. –