成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何實現(xiàn)C#保存窗體狀態(tài)

開發(fā) 后端
本文通過利用與注冊表的信息交互和利用Settings(設(shè)置)實現(xiàn)c#保存窗體狀態(tài)(大小和位置)的方法,供大家參考。

當窗體大小和位置被用戶更改后,如何保存更改后的狀態(tài),確保用戶再次打開窗體時的狀態(tài)和最后一次更改保持一致?下面介紹兩種有代表性的方法:

c#保存窗體狀態(tài)——利用與注冊表的信息交互實現(xiàn)

在《Pro.dot.NET.2.0.Windows.Forms.and.Custom.Controls.in.C.Sharp》書上介紹了這種方法,具體的可以參見這本書,有電子版下載的。定義一個類FormPositionHelper用來設(shè)置和保存當前窗體的大小和位置信息。類設(shè)計代碼如下:

  1. using Microsoft.Win32;//這個需加上  
  2.  
  3. .......  
  4.  
  5.     class FormPositionHelper  
  6.     {  
  7.         // 在HKEY_CURRENT_USER 設(shè)置注冊表的路徑  
  8.         public static string RegPath = @"Software\App\";  
  9.         public static void SaveSize(System.Windows.Forms.Form frm)  
  10.         {  
  11.             //Create or retrieve a reference to a key where the settings  
  12.             //will be stored.  
  13.             RegistryKey key;  
  14.             key = Registry.LocalMachine.CreateSubKey(RegPath + frm.Name);  
  15.             key.SetValue("Height", frm.Height);  
  16.             key.SetValue("Width", frm.Width);  
  17.             key.SetValue("Left", frm.Left);  
  18.             key.SetValue("Top", frm.Top);  
  19.         }  
  20.         public static void SetSize(System.Windows.Forms.Form frm)  
  21.         {  
  22.             RegistryKey key;  
  23.             key=Registry.LocalMachine.OpenSubKey(RegPath+frm.Name);  
  24.             if(key!=null)  
  25.             {  
  26.             frm.Height=(int)key.GetValue("Height");  
  27.             frm.Width=(int)key.GetValue("Width");  
  28.             frm.Left=(int)key.GetValue("Left");  
  29.             frm.Top=(int)key.GetValue("Top");  
  30.             }  
  31.         }  
  32.      } 

然后分別在窗體第一次加載和關(guān)閉之前調(diào)用上述類中的兩個方法,具體如下:

  1. private void Form1_Load(object sender, EventArgs e)  
  2. {  
  3.     FormPositionHelper.SetSize(this);  
  4. }  
  5.  
  6. private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
  7. {  
  8.  
  9.    //必須加上這個判斷,否則窗體最小化后無法恢復(fù)和還原了  
  10.  
  11.     if (this.WindowState != FormWindowState.Minimized)  
  12.         FormPositionHelper.SaveSize(this);  

c#保存窗體狀態(tài)——利用Settings(設(shè)置)完成

這個是在codeproject上講解到的另一種方法,地址是http://www.codeproject.com/KB/cs/UserSettings.aspx  當然是英文的啦~

注意:在Settings.settings文件中定義配置字段。把作用范圍定義為:User則運行時可更改,Applicatiion則運行時不可更改。當設(shè)置scope為User時他的配置放在 C:\Documents and Settings\LocalService\Local Settings\Application Data\在這個目錄下或子目錄user.config 配置文件中。 

具體實現(xiàn)方法如下:

a.打開項目屬性-》設(shè)置 如下圖:

c#保存窗體狀態(tài)  

b.在需要保存狀態(tài)的窗體頂部添加using CtrlStudy.Properties;//CtrlStudy為項目名稱

c.代碼設(shè)計: 

  1. private void Form1_Load(object sender, EventArgs e)  
  2.  {  
  3.      if (Settings.Default.WindowLocation != null)  
  4.      {  
  5.          this.Location = Settings.Default.WindowLocation;  
  6.      }  
  7.      if (Settings.Default.WindowSize != null)  
  8.      {  
  9.          this.Size = Settings.Default.WindowSize;  
  10.      }  
  11.  }  
  12.  
  13.  private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
  14.  {  
  15.      Settings.Default.WindowLocation = this.Location;  
  16.      if (this.WindowState == FormWindowState.Normal)  
  17.      {  
  18.          Settings.Default.WindowSize = this.Size;  
  19.      }  
  20.      else 
  21.      {  
  22.          Settings.Default.WindowSize = this.RestoreBounds.Size;  
  23.      }  
  24.      if (this.WindowState != FormWindowState.Minimized)  
  25.          Settings.Default.Save();//使用Save方法保存更改  
  26.  } 

需要的時候可以采用Settings.Default.Reset()方法將屬性值還原為默認值,即在上圖中手動設(shè)置的值。

上面介紹到的方法雖然能夠解決我們所提出的問題,但是不夠理想,對窗體的兩個特殊狀態(tài)(最大化和最小化)實則做了偷懶處理,即對于非正常狀態(tài)下的狀態(tài)更改不予以保存。所以解決不了窗體在最小化時能夠還原和最大化時能夠最小的轉(zhuǎn)換處理。

針對這個問題,提出一種新的解決方案,即采用WIN32中的GetWindowPlacement()和SetWindowPlacement()方法,兩個方法的定義大家可以查下資料,這里就不再作介紹了。當然這個方法也是我在前面提到的電子書《Pro.dot.NET.2.0.Windows.Forms.and.Custom.Controls.in.C.Sharp》上發(fā)現(xiàn)的,覺得不錯,趕緊總結(jié)總結(jié)記錄下來了。順道在這里推薦在下這本關(guān)于控件開發(fā)的書,有VB和C#版本的,它從控件、窗體的基礎(chǔ)講起,直到向大家講解如何開發(fā)一個滿足自己需求的控件,當然里面也介紹到了控件和組件編程的其他知識,還是很不錯的一本書,可惜只有英文的啦,目前正在研讀中。。。。

轉(zhuǎn)入正題,同前,合理應(yīng)用上面GetWindowPlacement()和SetWindowPlacement()方法設(shè)計設(shè)置和保存窗體狀態(tài)的類如下:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Drawing;  
  5. using System.Runtime.InteropServices; //注意這幾個命名空間的引入  
  6. using Microsoft.Win32;  
  7. using System.IO;  
  8. using System.Runtime.Serialization.Formatters.Binary;  
  9.  
  10. namespace CtrlStudy  
  11. {  
  12.     class FormPositionHelper2  
  13.     {  
  14.         [DllImport("user32.dll")]  
  15.         private static extern bool GetWindowPlacement(IntPtr handle, ref ManagedWindowPlacement placement);  
  16.  
  17.         [DllImport("user32.dll")]  
  18.         private static extern bool SetWindowPlacement(IntPtr handle, ref ManagedWindowPlacement placement);  
  19.  
  20.         [Serializable]   //必須加上,否則后面會提示為非可序列化標記  
  21.         public struct ManagedWindowPlacement  
  22.         {  
  23.             public int length;  
  24.             public int flags;  
  25.             public int showCmd;  
  26.             public Point  ptMinPosition;  
  27.             public Point ptMaxPosition;  
  28.             public Rectangle rcNormalPosition;  
  29.         }  
  30.  
  31.         public static string RegPath = @"Software\App\";  
  32.         public static void SaveSize(System.Windows.Forms.Form frm)  
  33.         {  
  34.             RegistryKey key;  
  35.             key = Registry.LocalMachine.CreateSubKey(RegPath + frm.Name);  
  36.                       // Get the window placement.  
  37.             ManagedWindowPlacement placement = new ManagedWindowPlacement();  
  38.             GetWindowPlacement(frm.Handle, ref placement);  
  39.             // Serialize it.  
  40.             MemoryStream ms = new MemoryStream();  
  41.             BinaryFormatter f = new BinaryFormatter();  
  42.             f.Serialize(ms, placement);  
  43.             // Store it as a byte array.  
  44.             key.SetValue("Placement", ms.ToArray());  
  45.         }  
  46.  
  47.         public static void SetSize(System.Windows.Forms.Form frm)  
  48.         {  
  49.             RegistryKey key;  
  50.             key = Registry.LocalMachine.OpenSubKey(RegPath + frm.Name);  
  51.             if (key != null)  
  52.             {  
  53.                 MemoryStream ms = new MemoryStream((byte[])key.GetValue("Placement"));  
  54.                 BinaryFormatter f = new BinaryFormatter();  
  55.                 ManagedWindowPlacement placement = (ManagedWindowPlacement)  
  56.                   f.Deserialize(ms);  
  57.                 SetWindowPlacement(frm.Handle, ref placement);  
  58.             }  
  59.         }  
  60.     }  

這個方法比較完善,其實序列在很早就提出來了。有時間還得專門研究研究這個序列化的問題,后面還會不斷研究并總結(jié)的。

好了,C#保存窗體狀態(tài)的方法就給大家介紹到這里。

【編輯推薦】

  1. C#實現(xiàn)多語言界面程序的方法介紹
  2. 介紹C#構(gòu)造函數(shù)的使用方法
  3. C#多態(tài)性的概念及其應(yīng)用
  4. 淺析C# treeview控件的使用方法
  5. 總結(jié)C#獲取當前路徑的7種方法
責任編輯:book05 來源: 新浪博客
相關(guān)推薦

2009-08-10 14:23:39

C# Setting

2009-08-25 09:19:01

C#實現(xiàn)窗體顯示

2009-08-26 11:07:36

C#打印窗體

2009-09-07 03:44:50

C#窗體間傳值

2009-09-07 05:24:22

C#窗體繼承

2009-08-20 10:10:55

C#透明窗體

2009-09-07 05:31:39

C#窗體關(guān)閉事件

2009-07-16 10:58:11

C#枚舉

2009-08-28 15:58:54

C#窗體里調(diào)用

2009-09-07 06:31:32

C#窗體移動

2009-09-07 04:19:56

C#窗體事件

2009-09-07 06:48:13

C#透明窗體

2009-08-13 10:42:31

C#窗體拖動事件

2009-09-07 06:07:46

C#窗體設(shè)計

2009-09-07 04:56:52

C#模式窗體

2009-09-07 05:10:52

C#模式窗體

2009-08-19 14:29:33

C#代理

2009-09-07 06:18:57

C#窗體設(shè)計器

2009-09-22 17:53:32

C# COM組件開發(fā)

2019-10-08 11:10:18

React自動保存前端
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 色综合天天天天做夜夜夜夜做 | 一区二区三区四区视频 | 亚洲精品永久免费 | 免费激情网站 | 久久爆操| 欲色av | 国产一区二区三区视频 | 在线观看成人免费视频 | 亚洲视频手机在线 | 国产精品久久久久久久久久久免费看 | 国产美女自拍视频 | 中文字幕av第一页 | 天堂va在线观看 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 亚洲狠狠 | 久久免费国产 | 亚洲一区毛片 | 国产精品99久久久久久宅男 | a在线视频| 欧美日韩视频 | 久久精品国产一区二区电影 | 免费观看一级特黄欧美大片 | 日韩欧美专区 | 中文字幕综合在线 | 福利视频亚洲 | 日日噜噜噜夜夜爽爽狠狠视频, | 一区视频在线免费观看 | 国产精品美女一区二区 | 久久99网站 | 自拍偷拍一区二区三区 | 99视频在线播放 | 黄色免费看 | 日韩一及片| 久久久久久国产精品 | 一级爱爱片 | 成年男女免费视频网站 | 一区二区福利视频 | 午夜久久| 日本不卡高字幕在线2019 | 在线免费看黄 | 男女视频在线免费观看 |