实现Form位置记录与设置

实现Form位置记录与设置

  随着软件发展越来越成熟,“用户体验”这个词的份量也越来越重。就现在同类型的软件而言,本质上的东西基本差不到哪去,差就差在如何表现。耳熟能详的“3G”,“4G”体验等等很多例子。软件产品的用户体验内容很多,根据不同的用户情况还不一样。比如说咱们的火车售票系统,用户体验咋样,我就不多说了,大家心里都有数。我只想说人家日本的自动售票机1分钟之内就能搞定,中间没有什么读取身份证失败等等消息。人家能做到的水平我想国内也一定可以做得到,至于为啥做成这样,表示无语。进入正题,平时生活中经常可以看到有些人会把看电影窗口放到屏幕一个角,聊天窗口放一个角。这样既可以看电影又可以聊天,充分利用屏幕资源。那能不能省去这个每次打开调整窗口位置和大小的操作呢?答案是肯定的。特别是在触屏软件中,记录位置尤为重要,因为触屏软件调节位置和大小还是比较麻烦。如何解决?本文就winform程序说说如何实现位置记录与还原

  实现原理

  1:程序打开时使用用户上回关闭程序时的位置和大小信息进行设置,还原上回的位置和大小。

  2:关闭程序时,将程序的位置和大小做记录。

  具体实现

  主要用到了两个事件OnLoadOnClosing,位置存储可以选择数据库或者Xml等,这里就用xml了。最好是写在基类里面。

  在Form的OnClosing事件中将位置信息写入xml:

OnClosing
        protected override void OnClosing(CancelEventArgs e)
        {
            //Form位置・Size・滚动条位置保存
            try
            {
                Form form = this;//this.ParentForm;

                if (form != null)
                {
                    if (form.WindowState == FormWindowState.Normal)    //Normal
                    {
                        ScreenInfo s_info = new ScreenInfo();
                        s_info.Location = form.Location;
                        s_info.Size = form.Size;
                        s_info.AutoScrollPosition = form.AutoScrollPosition;
                        FormScreen.Screen.SetPreservation(this.GetType().ToString(), s_info);
                    }
                }
            }
            catch (Exception ex)
            {
#if DEBUG
                MessageBox.Show("[DEBUG]画面位置情報保存失敗 " + ex.Message + "(" + this.GetType().ToString() + ")");
#endif
            }

            base.OnClosing(e);

        }

   在Form的OnLoad事件中读取Xml的位置信息:

OnLoad
        protected override void OnLoad(EventArgs e)
        {
            try
            {
                //不可见
                this.Visible = false;

                base.OnLoad(e);

                //解像度
                //int m_width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
                //int m_height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;

                //初期設定
                Form form = this;//this.ParentForm;
                form.AutoScroll = true;
                form.FormBorderStyle = FormBorderStyle.Sizable;
                form.StartPosition = FormStartPosition.Manual;

                ScreenInfo s_info = FormScreen.Screen.GetPreservation(this.GetType().ToString());

                if (s_info != null
                    && s_info.Size.Height > 0
                    && s_info.Size.Width > 0)
                {
                    //Form前回位置・Size设置
                    form.Location = s_info.Location;
                    form.Size = s_info.Size;
                    form.WindowState = FormWindowState.Normal;
                    form.AutoScrollPosition = s_info.AutoScrollPosition;
                    scrolPointDefault = new Point(s_info.AutoScrollPosition.X, s_info.AutoScrollPosition.Y);
                    form.VisibleChanged += new EventHandler(FormBase_VisibleChanged);
                }
                else
                {
                    //初期値設定
                    //form.Location = new Point(0, 0);
                    //form.Size = new Size(m_width, m_height);
                    //form.WindowState = FormWindowState.Maximized;
                }


                //最前面
                this.BringToFront();
            }
            catch (Exception ex)
            {
#if DEBUG
                MessageBox.Show("[DEBUG]画面位置情報保存失敗 " + ex.Message + "(" + this.GetType().ToString() + ")");
#endif
            }
            finally
            {
                this.Visible = true;
            }
        }

  注意点

  1:操作位置信息的FormScreen.Screen这个类最好用Static构造函数,不然容易出问题。

   2:位置信息可以考虑一次性读取出来放内存做处理。

 

  附上具体实现及测试代码(已将位置处理单独分出一个工程),点击这里下载

 

每天成就一小步,积累下来就是一大步。 转发本文请注明出处,谢谢您的阅读与分享!
原文地址:https://www.cnblogs.com/lixiaobin/p/FormScreen.html