zoukankan      html  css  js  c++  java
  • 实现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:位置信息可以考虑一次性读取出来放内存做处理。

     

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

     

    每天成就一小步,积累下来就是一大步。 转发本文请注明出处,谢谢您的阅读与分享!
  • 相关阅读:
    正则表达式知识
    网页边上的弹窗
    表格的搜索
    表格的删除与添加
    添加标签和删除标签
    延迟提示框
    js知识
    反射的应用
    java反射知识
    事务的特性和隔离级别
  • 原文地址:https://www.cnblogs.com/lixiaobin/p/FormScreen.html
Copyright © 2011-2022 走看看