2014-12-15 2 views
6

С трудом понимая в OwnerDraw TreeView, вот полная история:Преследуемый C# OwnerDraw TreeView

A VS2013 WinForms приложение (работает на Windows, 8.1 с TrueType включена, если это имеет значение ...) с TreeView с : DrawMode = OwnerDrawText;

В виде нагрузки, некоторые узлы добавляются к TreeView:

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; 
     } 
    } 

Далее, я рисую каждый другой узел сам, чтобы показать проблему:

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; 
     } 
    } 

Глядя на результаты, уведомления как у владельца (красных) узлов элементов есть межсимвольный интервал, который отличается от того, когда древовидная структура рисует свои собственные узлы. И через некоторое время интервал внезапно изменится. Я использую здесь неправильный шрифт? Мне что-то не хватает?

Спасибо за ваше время.

+1

Стоит отметить, что мы * не можем видеть результаты. Вы можете предоставить скриншот. В противном случае, хороший первый вопрос! – BradleyDotNET

+0

Wooops, мой исходный вопрос имел фотографию, но поскольку я никогда не помогал кому-то другому (я знаю: * стыд * * румянец * я буду лучше себя) Мне не разрешалось загружать картинку с вопросом. Я иду и попытаюсь исправить это в ближайшее время. – user4363553

+0

Если вы разместите ссылку, пользователь более высокого уровня часто поможет вам. – BradleyDotNET

ответ

8

Использование TextRenderer.DrawText вместо Graphics.DrawString должно исправить это. Ian Boyd опубликовал wonderful answer о различии между двумя и почему текст может выглядеть при выполнении пользовательского чертежа.

Я созерцал цитату из части его ответа здесь, но на самом деле, если вы делаете собственный рисунок, вы действительно должны прочитать весь ответ, потому что каждая его часть значительна, когда дело доходит до рисования текста - особенно при рисовании только части текста на контроле, а не на все чертежи.

+0

Да, это работает! Изменение строки строки Draw на: TextRenderer.DrawText (e.Graphics, e.Node.Text, font, e.Bounds, Color.Red); Показывает все, что должно быть. Я хотел ответить на ваш ответ как ответ, но, похоже, мне не хватает авторитетных точек для этого. В любом случае: большое спасибо за то, что помогли мне, это слишком долго меня било! – user4363553