5,667,575 members and growing! (15,382 online)
Email Password   helpLost your password?
Languages » C# » Windows Forms     Intermediate

Form and Control Position and Size Utility

By McGiv

Allows easy saving and loading of form and control's position and size.
C#, Windows, .NET 1.0, .NETVisual Studio, VS.NET2002, Dev

Posted: 4 Apr 2003
Updated: 4 Apr 2003
Views: 42,998
Bookmarked: 20 times
Announcements
Loading...



Search    
Advanced Search
Sitemap
9 votes for this Article.
Popularity: 2.80 Rating: 2.94 out of 5
4 votes, 44.4%
1
1 vote, 11.1%
2
0 votes, 0.0%
3
2 votes, 22.2%
4
2 votes, 22.2%
5

Sample Image - positiondemo.png

Introduction

I find it really annoying having to constantly reposition and size certain windows the way I like them in some of the application I use regularly. This code allows easy saving and loading of forms and controls positioning and size, making your WinForm application more user friendly.

Using the code

To load the data, place code after InitializeComponent() in the Form's constructor.

public Form1(){

    InitializeComponent();

    // load positioning and size

    McGiv.Win32.Forms.Positioning.Load(this, 
              RegistryHive.CurrentUser, "regSubKey");
            
    // any other controls ie

    // McGiv.Win32.Forms.Positioning.Load(this.ControlName, 

    //                RegistryHive.CurrentUser, "regSubKey");


}

To save the data, place code in OnClosing method of the Form.

protected override void OnClosing( System.ComponentModel.CancelEventArgs e){

    // save position and size

    McGiv.Win32.Forms.Positioning.Save(this, 
                  RegistryHive.CurrentUser, "regSubKey");
    
    // any other controls ie

    //McGiv.Win32.Forms.Positioning.Save(this.ControlName, 

    //                   RegistryHive.CurrentUser, "regSubKey");


}

The whole code listing:

using System;
using Microsoft.Win32;
using System.Windows.Forms; 
                             

namespace McGiv.Win32.Forms {


    /// <summary>

    /// Allows the easy loading and saving of control position and size.

    /// Also saves and loads the window position of forms.

    /// </summary>

    internal class Positioning {
   
        /// <summary>

        /// Saves the position and size of the given control.

        /// If control is a Form object it saves its window position.

        /// Best placed in the OnClosing method of the (parent) Form.

        /// </summary>

        /// <param name="control">The control to be saved</param>

        /// <param name="topLevel">Registry top level key.</param>

        /// <param name="subKey">The sub key that 

        ///              the data is saved to.</param>

        public static void Save(Control control, 
                   RegistryHive topLevel, string subKey){
            // todo validate subKey

            if( control == null )
            {
                throw new ArgumentException("The control cannot be null");
            }

            // open key

            Microsoft.Win32.RegistryKey key =  Open(topLevel, subKey);

            // form state

            Form form = control as Form;
            if( form != null ){
                key.SetValue(form.Name + "_windowState", (int)form.WindowState);

                // if window is not in normal mode set to normal before saving

                if( form.WindowState != FormWindowState.Normal ){
                    // save normal windo size

                    form.WindowState = FormWindowState.Normal;
                }
            }

            // save screen res

            key.SetValue(control.Name + "_screenHeight", 
                          Screen.PrimaryScreen.Bounds.Height); 
            key.SetValue(control.Name + "_screenWidth", 
                           Screen.PrimaryScreen.Bounds.Width);

            // control position/size

            key.SetValue(control.Name + "_top", control.Top);
            key.SetValue(control.Name + "_left", control.Left);
            key.SetValue(control.Name + "_width", control.Width);
            key.SetValue(control.Name + "_height", control.Height);

            // close key after use

            key.Close();
        }

        /// <summary>

        /// Loads the position and size of a control.

        /// If control is a form also loads the window position.

        /// Best placed in the Form's constructor.

        /// </summary>

        /// <param name="control">The control to be loaded.</param>

        /// <param name="topLevel">Registry top level key.</param>

        /// <param name="subKey">The sub key where the data is saved.</param>

        public static void Load(Control control, 
                    RegistryHive topLevel, string subKey){

            // todo validate subKey


            if( control == null ){
                throw new ArgumentException("The control cannot be null");
            }

            // open key

            Microsoft.Win32.RegistryKey key = Open(topLevel, subKey);

            // check that screen res is the same

            // if not or can't be found revert to origional.

            try{
                if(Screen.PrimaryScreen.Bounds.Height != 
                   (int)key.GetValue(control.Name + "_screenHeight") || 
                   Screen.PrimaryScreen.Bounds.Width != 
                   (int)key.GetValue(control.Name + "_screenWidth") ){

                    return;
                }
            }
            catch(NullReferenceException){return;}

            control.SuspendLayout();

            // form state

            Form form = control as Form;
            if( form != null ){
                try{
                    form.WindowState = 
                      (FormWindowState)key.GetValue(form.Name + 
                      "_windowState");
                    form.StartPosition = FormStartPosition.Manual;
                }
                catch(NullReferenceException){}
            }

            // control position/size

            try{
                control.Top = (int)key.GetValue(control.Name + "_top");
            }
            catch(NullReferenceException){}
            try{
                control.Left = (int)key.GetValue(control.Name + "_left");
            }
            catch(NullReferenceException){}
            try{
                control.Width = (int)key.GetValue(control.Name + "_width");
            }
            catch(NullReferenceException){}
            try{
                control.Height = (int)key.GetValue(control.Name + "_height");
            }
            catch(NullReferenceException){}

            control.ResumeLayout();

            // close key after use

            key.Close();

        }

        /// <summary>

        /// Opens a Registry key with write access.

        /// If the key dosn't exist it creates one.

        /// </summary>

        /// <param name="topLevel">Registry top level key.</param>

        /// <param name="subKey">Subkey to be opened.</param>

        /// <returns>Writable registry key</returns>

        private static Microsoft.Win32.RegistryKey 
                Open(RegistryHive topLevel, string subKey){

            switch( topLevel){

                case RegistryHive.ClassesRoot:{

                    return Registry.CurrentUser.CreateSubKey(subKey);
                }
                case RegistryHive.CurrentConfig:{

                    return Registry.CurrentConfig.CreateSubKey(subKey);
                }
                case RegistryHive.CurrentUser:{

                    return Registry.CurrentUser.CreateSubKey(subKey);
                }
                case RegistryHive.DynData:{

                    return Registry.DynData.CreateSubKey(subKey);
                }
                case RegistryHive.LocalMachine:{

                    return Registry.LocalMachine.CreateSubKey(subKey);
                }
                case RegistryHive.PerformanceData:{

                    return Registry.PerformanceData.CreateSubKey(subKey);
                }
                case RegistryHive.Users:{

                    return Registry.Users.CreateSubKey(subKey);
                }
                default:{

                    return null;
                }

            }
        }

    }
}

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

About the Author

McGiv


I'm a 3rd year student at Uni studing Computing. I've been coding in VB for about 6 years, Java for about 3 and C# for about 2 years.
Occupation: Web Developer
Location: United Kingdom United Kingdom

Other popular C# articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 6 of 6 (Total in Forum: 6) (Refresh)FirstPrevNext
GeneralCool codememberCarl Mercier12:26 7 Apr '03  
Generalhow about correct dave of form position?memberAlex Kucherenko6:47 7 Apr '03  
GeneralUpdated CodememberMcGiv7:17 7 Apr '03  
GeneralFormatting Messed UpmemberBarryJ20:04 5 Apr '03  
GeneralRe: Formatting Messed UpmemberMcGiv0:32 6 Apr '03  
GeneralRe: Formatting Messed UpmemberBarryJ8:10 6 Apr '03  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 4 Apr 2003
Editor: Smitha Vijayan
Copyright 2003 by McGiv
Everything else Copyright © CodeProject, 1999-2008
Web10 | Advertise on the Code Project