写字板(Windows程序设计)

絕刀狂花
发布: 2025-08-22 08:24:29
原创
173人浏览过

大家好,又见面了,我是你们的朋友全栈君。

今天我们来探讨如何验证并实现一个简易相册程序(不需要撰写报告)。我们将设计一个类似于Windows写字板的程序,并赋予其以下功能:提供基本的写字板功能,如文件的打开和保存,支持txt、rtf格式;实现多种格式文本的编辑和修饰,通过菜单控制,常用菜单项配备相应的工具栏按钮(可参考Windows自带的写字板);按需添加窗口布局等其他代码;实现自定义的查找对话框,有能力的同学可以进一步实现替换/全文替换等功能;状态栏显示学生学号、姓名等信息,窗口标题显示当前编辑的文件名(可选);支持其他实用功能,如word格式支持(可选);将程序改造成MDI程序:父窗口包含新建、窗口、帮助等菜单,运行时子窗口菜单与其合并,合理设置各菜单项的MergeIndex/MergeAction属性以符合使用习惯;允许用户调整窗口间的布局关系(平铺、层叠等)。

先让我们看看效果图:

写字板(Windows程序设计)

解决方案中,我们使用RichTextBox控件,它类似于写字板,支持rtf、txt等格式。如果需要支持doc文档,可以通过百度搜索Microsoft.Office.Interop.Word.dll,下载并引用。以下是打开和保存文件的代码示例(其中saveName为文件名):

/// <summary>
/// 打开文档操作
/// </summary>
private void 打开OToolStripMenuItem_Click(object sender, EventArgs e)
{
    openFileDialog1.InitialDirectory = "C:\";
    openFileDialog1.Filter = "rtf 文件|*.rtf|txt 文件|*.txt|doc files|*.doc";
    if (openFileDialog1.ShowDialog() != DialogResult.OK)
        return;
    saveName = openFileDialog1.FileName;
    if (openFileDialog1.FilterIndex == 1)
        richTextBox1.LoadFile(saveName);
    else if (openFileDialog1.FilterIndex == 2)
        richTextBox1.LoadFile(saveName, RichTextBoxStreamType.PlainText);
    else
        OpenWord(saveName);
    Text = saveName;
}

public void 父窗体打开Open(WritingBoard writingBoard)
{
    writingBoard.openFileDialog1.InitialDirectory = "C:\";
    writingBoard.openFileDialog1.Filter = "rtf 文件|*.rtf|txt 文件|*.txt|doc files|*.doc";
    if (writingBoard.openFileDialog1.ShowDialog() != DialogResult.OK)
        return;
    saveName = writingBoard.openFileDialog1.FileName;
    if (writingBoard.openFileDialog1.FilterIndex == 1)
        writingBoard.richTextBox1.LoadFile(saveName);
    else if (writingBoard.openFileDialog1.FilterIndex == 2)
        writingBoard.richTextBox1.LoadFile(saveName, RichTextBoxStreamType.PlainText);
    else
        OpenWord(saveName);
    writingBoard.Text = saveName;
    return;
}

public void OpenWord(string fileName)
{
    ApplicationClass applicationClass = new ApplicationClass();
    Document document = null;
    object obj = Missing.Value;
    object FileName = fileName;
    object ReadOnly = false;
    object Visible = true;
    try
    {
        document = applicationClass.Documents.Open(ref FileName, ref obj, ref ReadOnly, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref Visible, ref obj, ref obj, ref obj, ref obj);
        document.ActiveWindow.Selection.WholeStory();
        document.ActiveWindow.Selection.Copy();
        richTextBox1.Paste();
    }
    finally
    {
        document?.Close(ref obj, ref obj, ref obj);
        applicationClass?.Quit(ref obj, ref obj, ref obj);
    }
}

/// <summary>
/// 保存操作
/// </summary>
private void 保存SToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (saveName != "")
    {
        richTextBox1.SaveFile(saveName, RichTextBoxStreamType.RichText);
    }
    else
    {
        saveFileDialog1.Filter = "rtf files|*.rtf";
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            saveName = saveFileDialog1.FileName;
            richTextBox1.SaveFile(saveName, RichTextBoxStreamType.RichText);
        }
    }
}

/// <summary>
/// 另存为操作
/// </summary>
private void 另存为AToolStripMenuItem_Click(object sender, EventArgs e)
{
    saveFileDialog1.FileName = saveName.Substring(saveName.LastIndexOf('\') + 1);
    saveFileDialog1.Filter = "rtf files|*.rtf|txt files|*.txt|doc files|*.doc";
    saveFileDialog1.AddExtension = true;
    if (saveFileDialog1.ShowDialog() != DialogResult.OK)
        return;
    saveName = saveFileDialog1.FileName;
    if (saveFileDialog1.FilterIndex == 1)
        richTextBox1.SaveFile(saveName, RichTextBoxStreamType.RichText);
    else if (saveFileDialog1.FilterIndex == 2)
        richTextBox1.SaveFile(saveName, RichTextBoxStreamType.PlainText);
    else
        SaveAsWord(saveName);
}

public void SaveAsWord(string fileName)
{
    ApplicationClass applicationClass = new ApplicationClass();
    Document document = null;
    object obj = Missing.Value;
    object FileName = fileName;
    try
    {
        document = applicationClass.Documents.Add(ref obj, ref obj, ref obj, ref obj);
        document.ActiveWindow.Selection.WholeStory();
        richTextBox1.SelectAll();
        Clipboard.SetData(DataFormats.Rtf, richTextBox1.SelectedRtf);
        document.ActiveWindow.Selection.Paste();
        document.SaveAs(ref FileName, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj);
    }
    finally
    {
        document?.Close(ref obj, ref obj, ref obj);
        applicationClass?.Quit(ref obj, ref obj, ref obj);
    }
}

/// <summary>
/// 新建操作
/// </summary>
private void 新建NToolStripMenuItem_Click(object sender, EventArgs e)
{
    richTextBox1.Clear();
    saveName = "";
}
登录后复制

写字板操作的其他设置,如加粗、倾斜、下划线、左中右对齐、字体型号颜色、查找(大小写、全字、正逆)等,本质上是对RichTextBox控件属性的修改。建议多使用DropDownOpening、DropDownItemClicked等事件替代Click事件,以使代码更加简洁高效。

写字板(Windows程序设计)

这是使用DropDownItemClicked调整MDI子窗体布局的示例,简洁而优雅:

private void 窗口WToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    string layout=e.ClickedItem.Text;
    switch(layout)
    {
        case "水平平铺": LayoutMdi(MdiLayout.TileHorizontal);break;
        case "垂直平铺": LayoutMdi(MdiLayout.TileVertical); break;
        case "层叠": LayoutMdi(MdiLayout.Cascade); break;
    }
}
登录后复制

MDI的使用是为了让一个父窗体拥有多个子窗体,从而进行更简单有效的操作:

写字板(Windows程序设计)

在父窗体中新建子窗体,记得进行一系列基本操作,也可以通过生成函数和属性进行快速高效设置:

private void 新建ToolStripMenuItem_Click(object sender, EventArgs e)
{
    WritingBoard writingBoard = new WritingBoard();
    writingBoard.TopLevel = false;
    writingBoard.MdiParent = this;
    writingBoard.Show();
}

private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
{
    WritingBoard writingBoard = new WritingBoard();
    writingBoard.TopLevel = false;
    writingBoard.MdiParent = this;
    writingBoard.父窗体打开Open(writingBoard);
    writingBoard.Show();
}

private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
    foreach (WritingBoard writingBoard in MdiChildren) writingBoard.Close();
    Application.Exit();
}

private void 窗口WToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    string layout=e.ClickedItem.Text;
    switch(layout)
    {
        case "水平平铺": LayoutMdi(MdiLayout.TileHorizontal);break;
        case "垂直平铺": LayoutMdi(MdiLayout.TileVertical); break;
        case "层叠": LayoutMdi(MdiLayout.Cascade); break;
    }
}
登录后复制

源码已上传至传送门,我设置了分支,这样可以将不同内容但相同属性的代码放在一起,同时也可以拥有不同的MD文件进行阅读,这对于git的整理也是不错的。

写字板(Windows程序设计)

发布者:全栈程序员栈长,转载请注明出处://m.sbmmt.com/link/b6ecac22311ccb4c6370be154552f3e5

原文链接://m.sbmmt.com/link/c8377ad2a50fb65de28b11cfc628d75c

以上就是写字板(Windows程序设计)的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号