手机
当前位置:查字典教程网 >编程开发 >C#教程 >c#保存窗口位置大小操作类(序列化和文件读写功能)
c#保存窗口位置大小操作类(序列化和文件读写功能)
摘要:记录窗口上次关闭的位置和大小复制代码代码如下:namespacePDSafe.Base{publicclassSetting{//////把...

记录窗口上次关闭的位置和大小

复制代码 代码如下:

namespace PDSafe.Base

{

public class Setting

{

///<summary>

/// 把对象序列化为字节数组

///</summary>

public static byte[] SerializeObject(object obj)

{

if (obj == null)

return null;

MemoryStream ms = new MemoryStream();

BinaryFormatter formatter = new BinaryFormatter();

formatter.Serialize(ms, obj);

ms.Position = 0;

byte[] bytes = new byte[ms.Length];

ms.Read(bytes, 0, bytes.Length);

ms.Close();

return bytes;

}

///<summary>

/// 把字节数组反序列化成对象

///</summary>

public static object DeserializeObject(byte[] bytes)

{

object obj = null;

if (bytes == null)

return obj;

MemoryStream ms = new MemoryStream(bytes);

ms.Position = 0;

BinaryFormatter formatter = new BinaryFormatter();

try

{

obj = formatter.Deserialize(ms);

}

catch { obj = null; }

ms.Close();

return obj;

}

public static bool Save(string path, object value, bool isCeranew)

{

//如果不存在创建文件

FileStream fs;

if ((!File.Exists(path)) && isCeranew)

{

try

{

fs = File.Create(path);

}

catch

{

return false;

}

}

//如果存在则打开

else

{

try

{

fs = File.Open(path, FileMode.Open, FileAccess.Write);

}

catch

{

return false;

}

}

//写文件

byte[] buffer = SerializeObject(value);

try

{

for (long i = 0; i < buffer.LongLength; i++)

fs.WriteByte(buffer[i]);

}

catch

{

return false;

}

fs.Close();

return true;

}

public static object Read(string path)

{

FileStream fs;

try

{

fs = File.OpenRead(path);

}

catch

{

return null;

}

//读入缓存

StreamReader sreader = new StreamReader(fs);

string str = sreader.ReadToEnd();

fs.Close();

sreader.Close();

//分析内容

byte[] buffer = Encoding.Default.GetBytes(str);

return DeserializeObject(buffer);

}

[Serializable]

public struct FormSizeandLocation

{

public int SizeW;

public int SizeH;

public int LocationX;

public int LocationY;

public int Style;

}

private static Setting.FormSizeandLocation fsp = new Setting.FormSizeandLocation();

public static void AddRenewFormSizeControl(Form form)

{

form.FormClosing += new FormClosingEventHandler(FormcloseEvent);

form.Load += new EventHandler(FormloadEvent);

}

private static void FormcloseEvent(object sender, EventArgs e)

{

Form form = (Form)sender;

switch (form.WindowState)

{

case FormWindowState.Maximized:

fsp.Style = 2;

fsp.SizeW = form.Width;

fsp.SizeH = form.Height;

fsp.LocationX = form.Location.X;

fsp.LocationY = form.Location.Y;

break;

case FormWindowState.Minimized:

fsp.Style = 1;

break;

case FormWindowState.Normal:

fsp.Style = 0;

fsp.SizeW = form.Width;

fsp.SizeH = form.Height;

fsp.LocationX = form.Location.X;

fsp.LocationY = form.Location.Y;

break;

}

Setting.Save(Directory.GetCurrentDirectory() + @"" + "Location.set", fsp, true);

}

private static void FormloadEvent(object sender, EventArgs e)

{

Form form = (Form)sender;

object result = Setting.Read(Directory.GetCurrentDirectory() + @"" + "Location.set");

if (result != null)

{

fsp = (Setting.FormSizeandLocation)result;

switch (fsp.Style)

{

case 2:

form.WindowState = FormWindowState.Maximized;

break;

default:

form.WindowState = FormWindowState.Normal;

break;

}

form.Left = fsp.LocationX;

form.Top = fsp.LocationY;

form.Size = new Size(fsp.SizeW, fsp.SizeH);

}

}

}

}

基本功能就是保存一个结构体类型的数据

bool Save(filePath,value,true);

还有读取被保存数据的文件,从中读取,这个结构体被装箱,要做的只是拆箱

object result = Save(filePath,将要保存的数据实例,true)

if(result != null)//确认文件存在且读取成功

将这两个功能结合,能不能把窗口的位置和大小记录下来呢,当然可以,首先要做的事声明一个结构体,用来保存大小和位置还有状态

复制代码 代码如下:

[Serializable]

public struct FormSizeandLocation

{

public int SizeW;

public int SizeH;

public int LocationX;

public int LocationY;

public int Style;

}

然后进行保存和设置,代码108-172行都是对于它的处理,How does it work?

让用户给出一个窗口实例

订阅实例的 Load和Closing事件

在load事件中把保存的文件读取,并更改实例的位置和大小

在closing事件中把大小和位置保存

AddRenewFormSizeControl(this);

//只需一句代码,一定要写在InitializeComponent函数后。不能写在load事件里

注意,保存的文件是 工作路径+Location.set 你也可以自己改写此类。

【c#保存窗口位置大小操作类(序列化和文件读写功能)】相关文章:

程序中两个Double类型相加出现误差的解决办法

C#: 引用变量与数值变量的区别

基于静态Singleton模式的使用介绍

C#保存图片到数据库并读取显示图片的方法

C#自动创建数据库实现代码

C# DataTable 转换为 实体类对象实例

桌面浮动窗口(类似恶意广告)的实现详解

描述C#多线程中lock关键字的使用分析

Treeview动态添加用户控件传值和取值的实例代码

c#读取文件详谈

精品推荐
分类导航