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

来源:互联网 发布:windowxp主题 windows 编辑:程序博客网 时间:2024/05/26 08:41

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

<?xmlversion="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》的大部分内容,当然还有很多进行扩充或者优化的。比如:实现搜索、替换,状态栏,显示文字的行号,图片设置等等。
希望有兴趣,且有能力的读者能继续完善它。

谢谢您的阅读!

原创粉丝点击