private Image GetIcon(bool nodeIsExpanded)
{
if (openedImage == null)
InitImage();
return nodeIsExpanded ? openedImage : closedImage;
}
In the InitImage I'm setting the size in this case triangle :
private void InitImage()
{
openedImage = new Bitmap(16, 16);
closedImage = new Bitmap(16, 16);
using (Brush b = new SolidBrush(ArrowColor))
{
using (Graphics g = Graphics.FromImage(openedImage))
g.FillPolygon(b, new[] { new Point(0, 0), new Point(15, 0), new Point(8, 15), });
using (Graphics g = Graphics.FromImage(closedImage))
g.FillPolygon(b, new[] { new Point(0, 0), new Point(15, 8), new Point(0, 15), });
}
}
I want to keep the triangle shape but changing it size smaller or bigger much easier. So I thought to make the method something like :
private void InitImage(int size)
Something much easier to change only the size.
This is where and how I'm using it inside a TreeView nodes :
protected override void OnDrawNode(DrawTreeNodeEventArgs e)
{
Color backColor = (GetTopNodeIndex(e.Node) & 1) == 0 ? BackColor : AlternateBackColor;
using (Brush b = new SolidBrush(backColor))
{
e.Graphics.FillRectangle(b, new Rectangle(0, e.Bounds.Top, ClientSize.Width, e.Bounds.Height));
}
if ((e.State & TreeNodeStates.Selected) != 0)
{
e.Graphics.FillRectangle(Brushes.Green, e.Bounds);
}
// icon
if (e.Node.Nodes.Count > 0)
{
Image icon = GetIcon(e.Node.IsExpanded);
e.Graphics.DrawImage(icon, e.Bounds.Left - icon.Width - 3, e.Bounds.Top);
}
// text (due to OwnerDrawText mode, indenting of e.Bounds will be correct)
TextRenderer.DrawText(e.Graphics, e.Node.Text, Font, e.Bounds, ForeColor);
// indicate selection (if not by backColor):
if ((e.State & TreeNodeStates.Selected) != 0)
ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds);
}
Try this:
private void InitImage(int size)
{
openedImage = new Bitmap(size, size);
closedImage = new Bitmap(size, size);
using (Brush b = new SolidBrush(ArrowColor))
{
using (Graphics g = Graphics.FromImage(openedImage))
g.FillPolygon(b, new[] { new Point(0, 0), new Point(size - 1, 0), new Point(size / 2, size - 1), });
using (Graphics g = Graphics.FromImage(closedImage))
g.FillPolygon(b, new[] { new Point(0, 0), new Point(size - 1, size / 2), new Point(0, size - 1), });
}
}