Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Extension methods for finding centers of a rectangle

0.00/5 (No votes)
13 Jun 2012 1  
It's very easy to work out the center of a rectangle, but it's messy as inline code. Hence these simple extension methods to provide the five centers.

Introduction

I wanted to add a thin, grey line down the middle of a splitter control split handle (the bar down the middle that separates the two panels and lets the user change the ratio displayed). So, I needed the center of the Splitter rectangle:

private void splitContainer_Paint(object sender, PaintEventArgs e)
    {
    SplitContainer sc = sender as SplitContainer;
    if (sc != null)
        {
        Graphics g = e.Graphics;
        if (sc.Orientation == Orientation.Vertical)
            {
            g.DrawLine(Pens.LightGray,
                       (sc.SplitterRectangle.Left + sc.SplitterRectangle.Right) / 2,
                       sc.SplitterRectangle.Top,
                       (sc.SplitterRectangle.Left + sc.SplitterRectangle.Right) / 2,
                       sc.SplitterRectangle.Bottom);
            }
        else
            {
            g.DrawLine(Pens.LightGray,
                       sc.SplitterRectangle.Left,
                       (sc.SplitterRectangle.Top + sc.SplitterRectangle.Bottom) / 2,
                       sc.SplitterRectangle.Right,
                       (sc.SplitterRectangle.Top + sc.SplitterRectangle.Bottom) / 2);
            }
        }
    }
But that is messy, and difficult to read.

Background 

A much more readable version would be:

private void splitContainer_Paint(object sender, PaintEventArgs e)
    {
    SplitContainer sc = sender as SplitContainer;
    if (sc != null)
        {
        Graphics g = e.Graphics;
        if (sc.Orientation == Orientation.Vertical)
            {
            g.DrawLine(Pens.LightGray, sc.SplitterRectangle.CenterTop(), sc.SplitterRectangle.CenterBottom());
            }
        else
            {
            g.DrawLine(Pens.LightGray, sc.SplitterRectangle.CenterLeft(), sc.SplitterRectangle.CenterRight());
            }
        }
    }
All I had to do was add some static methods to my StaticMethods utility controls class:
using System.Drawing;

namespace UtilityControls
    {
    /// <summary>
    /// Contains simple, tested static methods for generic use.
    /// </summary>
    public static class StaticMethods
        {
        /// <summary>
        /// Returns the center point of the rectangle
        /// </summary>
        /// <param name="r"></param>
        /// <returns>Center point of the rectangle</returns>
        public static Point Center(this Rectangle r)
            {
            return new Point((r.Left + r.Right) / 2, (r.Top + r.Bottom) / 2);
            }
        /// <summary>
        /// Returns the center right point of the rectangle
        /// i.e. the right hand edge, centered vertically.
        /// </summary>
        /// <param name="r"></param>
        /// <returns>Center right point of the rectangle</returns>
        public static Point CenterRight(this Rectangle r)
            {
            return new Point(r.Right, (r.Top + r.Bottom) / 2);
            }
        /// <summary>
        /// Returns the center left point of the rectangle
        /// i.e. the left hand edge, centered vertically.
        /// </summary>
        /// <param name="r"></param>
        /// <returns>Center left point of the rectangle</returns>
        public static Point CenterLeft(this Rectangle r)
            {
            return new Point(r.Left, (r.Top + r.Bottom) / 2);
            }
        /// <summary>
        /// Returns the center bottom point of the rectangle
        /// i.e. the bottom edge, centered horizontally.
        /// </summary>
        /// <param name="r"></param>
        /// <returns>Center bottom point of the rectangle</returns>
        public static Point CenterBottom(this Rectangle r)
            {
            return new Point((r.Left + r.Right) / 2, r.Bottom);
            }
        /// <summary>
        /// Returns the center top point of the rectangle
        /// i.e. the topedge, centered horizontally.
        /// </summary>
        /// <param name="r"></param>
        /// <returns>Center top point of the rectangle</returns>
        public static Point CenterTop(this Rectangle r)
            {
            return new Point((r.Left + r.Right) / 2, r.Top);
            }
        }
    }

Using the code

Just add the file and use the new Rectangle.Center, Rectangle.CenterLeft and so forth methods. 

History

Keep a running update of any changes or improvements you've
made here.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here