实现Form位置记录与设置
随着软件发展越来越成熟,“用户体验”这个词的份量也越来越重。就现在同类型的软件而言,本质上的东西基本差不到哪去,差就差在如何表现。耳熟能详的“3G”,“4G”体验等等很多例子。软件产品的用户体验内容很多,根据不同的用户情况还不一样。比如说咱们的火车售票系统,用户体验咋样,我就不多说了,大家心里都有数。我只想说人家日本的自动售票机1分钟之内就能搞定,中间没有什么读取身份证失败等等消息。人家能做到的水平我想国内也一定可以做得到,至于为啥做成这样,表示无语。进入正题,平时生活中经常可以看到有些人会把看电影窗口放到屏幕一个角,聊天窗口放一个角。这样既可以看电影又可以聊天,充分利用屏幕资源。那能不能省去这个每次打开调整窗口位置和大小的操作呢?答案是肯定的。特别是在触屏软件中,记录位置尤为重要,因为触屏软件调节位置和大小还是比较麻烦。如何解决?本文就winform程序说说如何实现位置记录与还原。
实现原理
1:程序打开时使用用户上回关闭程序时的位置和大小信息进行设置,还原上回的位置和大小。
2:关闭程序时,将程序的位置和大小做记录。
具体实现
主要用到了两个事件OnLoad和OnClosing,位置存储可以选择数据库或者Xml等,这里就用xml了。最好是写在基类里面。
在Form的OnClosing事件中将位置信息写入xml:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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的位置信息:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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:位置信息可以考虑一次性读取出来放内存做处理。
附上具体实现及测试代码(已将位置处理单独分出一个工程),点击这里下载。