65.9K
CodeProject is changing. Read more.
Home

Extension methods for finding centers of a rectangle

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4 votes)

Jun 13, 2012

CPOL
viewsIcon

17661

downloadIcon

101

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.