TreeView Node Bounds & OwnerDrawText
Код:
private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
if ((e.State & TreeNodeStates.Selected) != 0)
{
Color backColor = e.Node.BackColor == Color.Empty ? treeView.BackColor : e.Node.BackColor;
Color foreColor = e.Node.ForeColor == Color.Empty ? treeView.ForeColor : e.Node.ForeColor;
e.Graphics.FillRectangle( new SolidBrush( backColor ), e.Node.Bounds);
Font nodeFont = e.Node.NodeFont;
if (nodeFont == null) nodeFont = ((TreeView)sender).Font;
nodeFont = new Font( nodeFont, FontStyle.Underline);
e.Graphics.DrawString(e.Node.Text, nodeFont, new SolidBrush(foreColor), e.Node.Bounds);
}
else
{
e.DrawDefault = true;
}
}
{
if ((e.State & TreeNodeStates.Selected) != 0)
{
Color backColor = e.Node.BackColor == Color.Empty ? treeView.BackColor : e.Node.BackColor;
Color foreColor = e.Node.ForeColor == Color.Empty ? treeView.ForeColor : e.Node.ForeColor;
e.Graphics.FillRectangle( new SolidBrush( backColor ), e.Node.Bounds);
Font nodeFont = e.Node.NodeFont;
if (nodeFont == null) nodeFont = ((TreeView)sender).Font;
nodeFont = new Font( nodeFont, FontStyle.Underline);
e.Graphics.DrawString(e.Node.Text, nodeFont, new SolidBrush(foreColor), e.Node.Bounds);
}
else
{
e.DrawDefault = true;
}
}
В данном случае просто для выделенного элемента устанавливаю подчеркивание. А проблема кроется в том, что, толи e.Node.Bounds не соответствует истине, толи прорисовка текста выполняется иначе. Что приводит к потере последнего символа текста узла при его выделении. Если последний параметр в DrawString() немного увеличить, т.е. сделать Rectangle.Inflate(e.Node.Bounds, 3, 0), то текст помещается, но начинает сдвигаться влево.
Делал ли кто-то нечто подобное, чтобы достичь адекватной прорисовки узла?