偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

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

  1. using Microsoft.Win32;//這個(gè)需加上  
  2.  
  3. .......  
  4.  
  5.     class FormPositionHelper  
  6.     {  
  7.         // 在HKEY_CURRENT_USER 設(shè)置注冊(cè)表的路徑  
  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)用上述類中的兩個(gè)方法,具體如下:

  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.    //必須加上這個(gè)判斷,否則窗體最小化后無(wú)法恢復(fù)和還原了  
  10.  
  11.     if (this.WindowState != FormWindowState.Minimized)  
  12.         FormPositionHelper.SaveSize(this);  

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

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

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

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

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

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

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

c.代碼設(shè)計(jì): 

  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.  } 

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

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

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

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

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Drawing;  
  5. using System.Runtime.InteropServices; //注意這幾個(gè)命名空間的引入  
  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]   //必須加上,否則后面會(huì)提示為非可序列化標(biāo)記  
  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.     }  

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

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

【編輯推薦】

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

2009-08-10 14:23:39

C# Setting

2009-08-25 09:19:01

C#實(shí)現(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#窗體移動(dòng)

2009-09-07 04:19:56

C#窗體事件

2009-09-07 06:48:13

C#透明窗體

2009-08-13 10:42:31

C#窗體拖動(dòng)事件

2009-09-07 06:07:46

C#窗體設(shè)計(jì)

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è)計(jì)器

2009-09-22 17:53:32

C# COM組件開發(fā)

2019-10-08 11:10:18

React自動(dòng)保存前端
點(diǎn)贊
收藏

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