Click here to Skip to main content
Click here to Skip to main content

Extension methods for finding centers of a rectangle

By , 13 Jun 2012
 

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, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

OriginalGriff
CEO
Wales Wales
Member
Born at an early age, he grew older. At the same time, his hair grew longer, and was tied up behind his head.
Has problems spelling the word "the".
Invented the portable cat-flap.
Currently, has not died yet. Or has he?

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 5memberjohannesnestler13 Jun '12 - 4:00 
GeneralRe: My vote of 5mvpOriginalGriff13 Jun '12 - 4:46 
GeneralRe: My vote of 5memberjohannesnestler13 Jun '12 - 7:58 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130523.1 | Last Updated 13 Jun 2012
Article Copyright 2012 by OriginalGriff
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid