我的记事本 第三讲:保存配置信息

默认字体、字号、背景色、前景色都是保存在Option.xml文件中。

<? xml version = "1.0"encoding="utf-8" ?>
< settings >
 < fontname > 微软雅黑 </ fontname >
 < fontsize > 20</fontsize>
 < fontcolor > Black</fontcolor>
 < backcolor > White</backcolor>
 < wordwrap > false</wordwrap>
</ settings >
l         AppHelper的实现
/// <summary>
/// 应用程序辅助类,保存、加载应用程序配置信息
/// </summary>
public class AppHelper {
    public static Font DefaultFont;     // 默认字体
    public static Color FontColor;      // 默认字体颜色
    public static Color BackColor;      // 文本框背景颜色
    public static bool WordWrap;        // 自动换行
 
    private static string xmlFilename = "Option.xml";
 
    ///<summary>
    /// 加载应用程序配置信息
    ///</summary>
    public static void LoadSettings() {
       XmlDocument doc = new XmlDocument();
       doc.Load(xmlFilename);// 加载 xml 文件
       // 读取 fontname 节点
       string fontname = " 宋体 " ;
       XmlNode fontnameNode = doc.SelectSingleNode("//fontname");
       if (fontnameNode != null) {
           fontname = fontnameNode.InnerText;
       }
       // 读取 fontsize 节点
       float fontsize = 10;
       XmlNode fontsizeNode = doc.SelectSingleNode("//fontsize");
       if (fontsizeNode != null) {
           fontsize = Convert.ToSingle(fontsizeNode.InnerText);
       }
       // 读取 fontcolor 节点
       DefaultFont = new Font(fontname, fontsize);
       string fontcolor = "Black";
       XmlNode fontcolorNode = doc.SelectSingleNode("//fontcolor");
       if (fontcolorNode != null) {
           fontcolor = fontcolorNode.InnerText;
       }
       FontColor = Color.FromName(fontcolor);
       // 读取 backcolor 节点
       string backcolor = "White";
       XmlNode backcolorNode = doc.SelectSingleNode("//backcolor");
       if (backcolorNode != null) {
           backcolor = backcolorNode.InnerText;
       }
       BackColor = Color.FromName(backcolor);
    }
 
    ///<summary>
    /// 保存应用程序配置信息
    ///</summary>
    public static void SaveSettings() {
       XmlDocument doc = new XmlDocument();
       doc.Load(xmlFilename);
 
       XmlNode fontnameNode = doc.SelectSingleNode("//fontname");
       if (fontnameNode != null) {
           fontnameNode.InnerText = DefaultFont.Name;
       }
       XmlNode fontsizeNode = doc.SelectSingleNode("//fontsize");
       if (fontsizeNode != null) {
           fontsizeNode.InnerText = DefaultFont.Size.ToString();
       }
       XmlNode fontcolorNode = doc.SelectSingleNode("//fontcolor");
       if (fontcolorNode != null) {
           fontcolorNode.InnerText = FontColor.Name;
       }
       XmlNode backcolorNode = doc.SelectSingleNode("//backcolor");
       if (backcolorNode != null) {
           backcolorNode.InnerText = BackColor.Name;
       }
       // 保存 xml 更改
       doc.Save(xmlFilename);
    }
}
这里的成员变量为什么要使用static呢?
static类型变量使得即使创建多个AppHelper实例,静态变量仍只有一个,多个实例共享同一个变量。因为对于应用程序而言,整体的配置信息没必要创建多个实例对象,而是针对一个应用程序,只有一个实例。
l         加载系统的所有字体
int selectedIndex = -1;
for (int i = 0; i < FontFamily.Families.Length; i++) {
    FontFamily family = FontFamily.Families[i];
    cboFontFamily.Items.Add(family.Name);
    if (family.Name == AppHelper.DefaultFont.Name) {
       selectedIndex = i;
    }
}
cboFontFamily.SelectedIndex = selectedIndex;

l         在组合框中添加颜色块,需要改写组合框的DrawItem事件
private void cboColor_DrawItem(object sender, DrawItemEventArgs e) {
    Rectangle re = e.Bounds;
    if (e.Index >= 0) {
       if (e.State == DrawItemState.Selected) {
           e.Graphics.FillRectangle(SystemBrushes.Highlight, re);
       } else {
           e.Graphics.FillRectangle(SystemBrushes.Window, re);
       }
       StringFormat sf = new StringFormat();
       sf.Alignment = StringAlignment.Near;
       string s = (string)(((ComboBox)sender).Items[e.Index]);
       Rectangle rd = new Rectangle(re.X + 2, re.Y + 2, 20, re.Height - 4);
       Rectangle rt = new Rectangle(re.X + 24, re.Y + 2, re.Width - 20, re.Height - 4);
       e.Graphics.FillRectangle(new SolidBrush(Color.FromName(s)), rd);
       e.Graphics.DrawRectangle(new Pen(Color.Black), rd);
       if (e.State == DrawItemState.Selected) {
           e.Graphics.DrawString(s, new Font(" 宋体 " , 9), new SolidBrush(Color.White), rt, sf);
       } else {
           e.Graphics.DrawString(s, new Font(" 宋体 " , 9), new SolidBrush(Color.Black), rt, sf);
       }
    }
}
至此,我们完成了《MyNotepad》的大部分内容,当然还有很多进行扩充或者优化的。比如:实现搜索、替换,状态栏,显示文字的行号,图片设置等等。
希望有兴趣,且有能力的读者能继续完善它。

谢谢您的阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值