2014-12-15 6 views
6

Avere una difficoltà a comprendere un TreeView OwnerDraw, ecco la storia completa:Perseguitata da C# OwnerDraw TreeView

A VS2013 WinForms app (in esecuzione su Windows 8.1 con TrueType abilitato se quello che conta ...) con una vista ad albero con : DrawMode = OwnerDrawText;

In caricamento form, alcuni nodi vengono aggiunti alla vista ad albero:

private void Form1_Load(object sender, EventArgs e) 
    { 
     // add some nodes 
     for (int i = 0; i < 20; i++) 
     { 
      TreeNode treeNode = treeView1.Nodes.Add(new String('i', 60)); 
      treeNode.Tag = i; 
     } 
    } 

Avanti, sto disegnando ogni altro nodo me stesso per mostrare il problema:

private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) 
    { 
     // use ownerdraw every other item 
     if ((int)(e.Node.Tag) % 2 == 0) 
     { 
      Font font = e.Node.NodeFont; 
      if (font == null) font = e.Node.TreeView.Font; 
      e.Graphics.DrawString(e.Node.Text, font, Brushes.Red, e.Bounds.X, e.Bounds.Y); 
     } 
     else 
     { 
      e.DrawDefault = true; 
     } 
    } 

Guardando i risultati, avviso in che modo i nodi di oggetti disegnati dal proprietario (rosso) hanno una spaziatura tra caratteri diversa da quando la vista ad albero disegna i propri nodi. E dopo un po ', la spaziatura cambia improvvisamente. Sto usando il font sbagliato qui? Mi manca qualcosa di ovvio?

Grazie per il vostro tempo.

+1

Vale la pena notare che non possiamo * vedere i risultati. Potresti voler fornire uno screenshot. Altrimenti, bella prima domanda! – BradleyDotNET

+0

Wooops, la mia domanda originale aveva l'immagine, ma come non ho mai aiutato qualcun altro qui (lo so: * vergogna * * arrossire * mi migliorerò) Non mi è stato permesso di caricare una foto con la domanda. Vado e provo a ripararlo presto. – user4363553

+0

Se pubblichi un link, un utente con un alto profilo ti aiuterà spesso. – BradleyDotNET

risposta

8

Utilizzare TextRenderer.DrawText anziché Graphics.DrawString per risolvere questo problema. Ian Boyd ha pubblicato uno wonderful answer sulla differenza tra i due e il motivo per cui il testo può apparire off quando si esegue il disegno personalizzato.

Ho contemplato di citare una parte della sua risposta qui, ma in realtà se si esegue il disegno personalizzato è necessario leggere tutta la risposta perché ogni porzione di esso è significativa quando si tratta di disegnare del testo, specialmente quando si disegna solo una parte del testo su un controllo invece di fare tutto da solo.

+0

Sì, questo funziona! Modifica della stringa di disegno su: TextRenderer.DrawText (e.Graphics, e.Node.Text, font, e.Bounds, Color.Red); Mostra tutto come dovrebbe. Volevo UP la tua risposta come risposta, ma mi sembra mancano i punti di credibilità per farlo. Comunque: grazie mille per avermi aiutato, questo mi ha infastidito per troppo tempo! – user4363553