Проблема с TreeView. DrawNode - OwnerDrawText

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

В настоящее время я устанавливал TreeView, чтобы быть OwnderDrawText и иметь TreeView. Функция DrawNode просто рисует текст как так:

private void TreeViewDrawNode(object sender, DrawTreeNodeEventArgs e)
{
    if (!e.Node.IsVisible)
    {
        return;
    }

    bool bLoaded = false;

    if (e.Bounds.Location.X >= 0 && e.Bounds.Location.Y >= 0)
    {
       if(e.Node.Tag != null)
       {
           //...
           // code determining whether data has been loaded is done here
           // setting bLoaded true or false
           //...
       }
       else
       {
           e.DrawDefault = true;
           return;
       }

       Font useFont = null;
       Brush useBrush = null;

       if (bLoaded)
       {
           useFont = e.Node.TreeView.Font;
           useBrush = SystemBrushes.WindowText;
        }
        else
        {
            useFont = m_grayItallicFont;
            useBrush = SystemBrushes.GrayText;
        }
        e.Graphics.DrawString(e.Node.Text, useFont, useBrush, e.Bounds.Location);
    }
}

Я полагал, что это будет достаточно, однако, это вызывало некоторые проблемы;

  1. То, когда узел выбран, сфокусировалось или нет, он не окутывает весь текст, пример (я надеюсь, что imgur в порядке).
  2. Когда узел фокусируется, точечная схема не показывает также. Если Вы сравниваете его с этим примером. Узлы с "журналом" в тексте используют e. DefaultDraw = верный

Я пытался следовать примеру, данному в этом вопросе. Это выглядело примерно так:

private void TreeViewDrawNode(object sender, DrawTreeNodeEventArgs e)
 {
  if (!e.Node.IsVisible)
  {
   return;
  }

  bool bLoaded = false;

  if (e.Bounds.Location.X >= 0 && e.Bounds.Location.Y >= 0)
  {
     if(e.Node.Tag != null)
     {
      //...
      // code determining whether data has been loaded is done here
      // setting bLoaded true or false
      //...
     }
     else
     {
      e.DrawDefault = true;
      return;
     }

   //Select the font and brush depending on whether the property has been loaded
   Font useFont = null;
   Brush useBrush = null;

   if (bLoaded)
   {
    useFont = e.Node.TreeView.Font;
    useBrush = SystemBrushes.WindowText;
   }
   else
   {
    //member variable defined elsewhere
    useFont = m_grayItallicFont;
    useBrush = SystemBrushes.GrayText;
   }

   //Begin drawing of the text

   //Get the rectangle that will be used to draw
   Rectangle itemRect = e.Bounds;
   //Move the rectangle over by 1 so it isn't on top of the check box
   itemRect.X += 1;

   //Figure out the text position
   Point textStartPos = new Point(itemRect.Left, itemRect.Top);
   Point textPos = new Point(textStartPos.X, textStartPos.Y);

   //generate the text rectangle
   Rectangle textRect = new Rectangle(textPos.X, textPos.Y, itemRect.Right - textPos.X, itemRect.Bottom - textPos.Y);

   int textHeight = (int)e.Graphics.MeasureString(e.Node.Text, useFont).Height;
   int textWidth = (int)e.Graphics.MeasureString(e.Node.Text, useFont).Width;

   textRect.Height = textHeight;

   //Draw the highlighted box
   if ((e.State & TreeNodeStates.Selected) != 0)
   {
    //e.Graphics.FillRectangle(SystemBrushes.Highlight, textRect);
    //use pink to see the difference
    e.Graphics.FillRectangle(Brushes.Pink, textRect);
   }
   //widen the rectangle by 3 pixels, otherwise all of the text     won't fit
   textRect.Width = textWidth + 3;

   //actually draw the text
   e.Graphics.DrawString(e.Node.Text, useFont, useBrush, e.Bounds.Location);

   //Draw the box around the focused node
   if ((e.State & TreeNodeStates.Focused) != 0)
   {
    textRect.Width = textWidth;
    Pen focusPen = new Pen(Color.Black);
    focusPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
    e.Graphics.DrawRectangle(focusPen, textRect);
   }
  }
 }

Однако результаты были этим. (Отметьте, используемый розовый для дифференциации цветов). Как Вы видите, выделенный фон не расширяется полностью туда, где сфокусированная пунктирная линия в. И существует также другое поле, которое оттянуто также.

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

В конце концов, это, делает у любого есть любые предложения о том, как сделать это правильно, потому что там получен, чтобы быть более простым путем.

Заранее спасибо.

9
задан Community 23 May 2017 в 12:25
поделиться