Search code examples
c#winformsbitmapcustom-painting

How can I change the image size with giving one single int value instead changing all the time all the values?


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

Solution

  • 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), });
        }
    }