C#文本编辑器_第1页
C#文本编辑器_第2页
C#文本编辑器_第3页
C#文本编辑器_第4页
C#文本编辑器_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四讲 Windows界面程序设计简介本讲涉及的控件有:菜单、工具条、状态栏、分页控件、系统对话框(打开对话框、保存对话框、预览对话框、打印对话框、打印设置对话框、颜色对话框、字体对话框)、用户自定义对话框等。1 功能设计1.1 文件新建:新建一个编辑窗口;打开:弹出打开对话框,打开一个指定的文本文件;保存:如果当前有文件名,就保存当前编辑的文本文件,如果没有文件名,弹出保存对话框,保存当前编辑的文本文件;另存为:弹出保存对话框,将当前编辑的文本文件以指定的另一个文件名存盘;退出:结束当前编辑的文本文件,退出系统;1.2 编辑剪切:剪切选定内容,并放到剪切板;复制:复制选定内容,并放到剪切板;粘贴:将剪切板的内容插入到当前位置;撤消:撤消上次操作;恢复:恢复上次操作;查找:?替换:?1.3 格式字体:弹出字体对话框,设置选定文本的字体;颜色:弹出颜色对话框,设置选定文本的颜色;左对齐:当前段文本左对齐;中对齐:当前段文本中对齐;右对齐:当前段文本右对齐;缩进:当前段文本悬挂缩进;1.4 打印预览:预览编辑器中的内容;打印:打印编辑器中的内容;设置:设置默认打印页面;2 功能实现2.1 建立项目解决方案(ChA201 文本文件编辑器),项目名称(Editor),窗体文件(frmEditor);测试结果:2.2 设计窗体控件属性属性值说明FormNamefrmEditorText文本文件编辑器Font宋体,五号MenuStripNamemsEditor菜单条ToolStripMenuItemNamemnFile文件菜单Text文件ToolStripMenuItemNamemiFileNewText新建ToolStripMenuItemNamemiFileOpenText打开ToolStripMenuItemNamemiFileSaveText保存ToolStripMenuItemNamemiFileSaveAsText另存为ToolStripMenuItemNamemiFileExitText退出ToolStripMenuItemNamemnEdit编辑菜单Text编辑ToolStripMenuItemNamemiEditCutText剪切ToolStripMenuItemNamemiEditCopyText复制ToolStripMenuItemNamemiEditPasteText粘贴ToolStripMenuItemNamemiEditUnDoText撤消ToolStripMenuItemNamemiEditReDoText恢复ToolStripMenuItemNamemiEditFindText查找ToolStripMenuItemNamemiEditReplaceText替换ToolStripMenuItemNamemnStyle格式菜单Text格式ToolStripMenuItemNamemiStyleFontText字体ToolStripMenuItemNamemiStyleColorText颜色ToolStripMenuItemNamemiStyleAlignLeftText左对齐ToolStripMenuItemNamemiStyleAlignCenterText中对齐ToolStripMenuItemNamemiStyleAlignRightText右对齐ToolStripMenuItemNamemiStyleIndentText缩进ToolStripMenuItemNamemnPrint打印菜单Text打印ToolStripNametsEditor工具条StatusStripNamessEditor状态条RichTextBoxNamertbEditor富格式文本编辑器DockFillOpenFileDialogNamedlgOpen打开文件对话框PrintDocumentNamedocPrint打印文档控件测试:2.3 文件功能实现在frmEditor类的开始定义一个数据成员_fileName,用于保存当前正在编辑的文件名。 public partial class frmEditor : Form private string _fileName; / 编辑的当前文件名 public frmEditor() InitializeComponent(); . 2.3.1 退出实际上就是退出应用程序。 private void miFileExit_Click(object sender, EventArgs e) Application.Exit(); 2.3.2 新建文件实际上就是将rtbEditor中的内容清空,同时将当前正在编辑的文件名也设置为空。 private void miFileNew_Click(object sender, EventArgs e) rtbEditor.Text = ; _fileName = ; 2.3.3 打开文件设置文件打开对话框的过滤参数,即:Filter=文本文件(*.txt)|*.txt|所有文件(*.*)|*.*,然后弹出一个打开对话框,用户指定一个文件,然后将文件的内容读入到rtbEditor中。 private void miFileOpen_Click(object sender, EventArgs e) dlgOpen.Filter = 文本文件(*.txt)|*.txt|富格式文件(*.rtf)|*.rtf|所有文件(*.*)|*.*; if (dlgOpen.ShowDialog() = DialogResult.OK) _fileName = dlgOpen.FileName; if (Path.GetExtension(_fileName) = .rtf) rtbEditor.LoadFile(_fileName, RichTextBoxStreamType.RichText); else rtbEditor.LoadFile(_fileName, RichTextBoxStreamType.PlainText); 测试:选择菜单“文件 | 打开”时,弹出一个文件打开对话框,初始的路径为“我的文档”。思考题:?如何指定打开对话框默认的路径?2.3.4 保存文件文本编辑器类frmEditor有一个数据成员_fileName,用于保存当前正在编辑的文件名,新建文件时,设置_fileName为空。选择“保存”菜单时,如果_fileName为空,动态创建一个保存对话框(默认扩展名、默认文件夹、默认文件类型),由用户指定保存的文件名,将编辑器中的内容保存到指定的文件中,然后修改_fileName。 private void miFileSave_Click(object sender, EventArgs e) / 如果文件名为空,表示是新文件,保存时需要用户指定文件名 if (_fileName = ) / 动态创建一个文件保存对话框 SaveFileDialog dlgSave = new SaveFileDialog(); / 设置保存对话框的默认参数 dlgSave.InitialDirectory = c:tmp; dlgSave.Filter = 文本文件(*.txt)|*.txt|富格式文件(*.rtf)|*.rtf|所有文件(*.*)|*.*; dlgSave.Title = 保存我的文件; / 显示保存对话框 if (dlgSave.ShowDialog() = DialogResult.OK) / 表示按下“确认”按钮 _fileName = dlgSave.FileName; / 得到用户指定的文件名 / 如果扩展名为rtf格式,则以RTF格式保存文件,否则以普通文本格式保存文件 if (Path.GetExtension(_fileName) = .rtf) rtbEditor.SaveFile(_fileName, RichTextBoxStreamType.RichText); else rtbEditor.SaveFile(_fileName, RichTextBoxStreamType.PlainText); / 如果不是新文件,根据当前文件的格式保存当前文件 else if (Path.GetExtension(_fileName) = .rtf) rtbEditor.SaveFile(_fileName, RichTextBoxStreamType.RichText); else rtbEditor.SaveFile(_fileName, RichTextBoxStreamType.PlainText); 2.3.5 另存为文件弹出一个文件保存对话框,用户指定保存的文件名,将当前的文件内容保存到用户的指定文件中,并修改当前文件名_fileName。(代码留给学生自己完成)测试:新建一个文件,输入文件内容,保存(这时需要指定新文件名,扩展名为txt),退出。打开一个文本文件,添加一行文本,修改部分内容,删除一些内容,保存(这时不需要指定新文件名),另存为一个新文件,扩展名为rtf,退出。打开一个扩展名为rtf文件的文件,退出。2.4 编辑功能实现2.4.1 剪切、复制、粘贴、撤消、恢复这几个功能都是RichTextBox自身提供的,我们直接引用就可以了。以Cut为例,其代码如下: private void miEditCut_Click(object sender, EventArgs e) rtbEditor.Cut(); 测试:新建一个文件,输入文件内容,保存(这时需要指定新文件名,扩展名为txt),退出。思考题:?可以实现查找和替换功能?2.5 格式功能实现2.5.1 字体创建一个字体对话框(dlgFont),弹出字体对话框,选择字体。根据是否有选择文本,若有,修改选择文本的字体,否则,修改整个文本的字体。 private void miStyleFont_Click(object sender, EventArgs e) / 创建字体对话框 FontDialog dlgFont = new FontDialog(); dlgFont.ShowColor = true; dlgFont.ShowApply = true; / 设置字体对框的默认字体, / 如果已经有选择文本,则设置为选择文本的字体和颜色 / 否则设置为全文的字体和姿色 if (rtbEditor.SelectionLength 0) dlgFont.Font = rtbEditor.SelectionFont; dlgFont.Color = rtbEditor.SelectionColor; else dlgFont.Font = rtbEditor.Font; dlgFont.Color = rtbEditor.ForeColor; / 显示字体对话框,且用户按下了“确认”按钮 if (dlgFont.ShowDialog() = DialogResult.OK) / 如果有选择文件,刚修改选择文本的字体和颜色 if (rtbEditor.SelectionLength 0) rtbEditor.SelectionFont = dlgFont.Font; rtbEditor.SelectionColor = dlgFont.Color; / 否则修改整个文本的字体和颜色 else rtbEditor.Font = dlgFont.Font; rtbEditor.ForeColor = dlgFont.Color; 2.5.2 颜色创建一个颜色对话框(dlgColor),设置颜色对话框的当前颜色(没有选定,就为编辑器的颜色,若有选定,就为选定文本的颜色),弹出颜色对话框,选择颜色。测试:首先打开一个文件,然后选择菜单“格式 | 字体”,弹出字体对话框,选择一种字体,然后确认对话框,观察编辑器中的字体变化。选择菜单“格式 | 颜色”,弹出颜色对话框,选择一种颜色,然后确认对话框,观察编辑器中的颜色变化。?在字体对话框中怎么没有字体的颜色?如何只改变选择部分的字体?= 答案设置字体对话框的一些属性(ShowColor, ShowApply);只改变选择部分的字体(SelectionFont)和颜色(SelectionColor);2.5.3 左、中、右对齐改变当前段的对齐方式,是RichEditBox自带的属性SelectionAlignment,下面的代码是实现了当前段的左对齐。 private void miStyleAlignLeft_Click(object sender, EventArgs e) rtbEditor.SelectionAlignment = HorizontalAlignment.Left; 2.5.4 缩进改变当前段的缩进方式,是RichEditBox自带的属性SelectionHangingIndent(悬挂),SelectionIndent(左缩进),SelectionRightIndent(右缩进),下面的代码指定了当前段的左缩进。 private void miStyleIndent_Click(object sender, EventArgs e) rtbEditor.SelectionIndent = 20; 测试:首先打开一个文件,然后选择菜单“格式 | 左对齐”,可以设置光标所在行左对齐,还可设置中对齐、右对齐、左缩进。思考题:?如何设置首行缩进、悬挂缩进?首行缩进和悬挂缩进均采用SelectionHangingIndent进行设置,设置值为负值时,设置首行缩进,设置值为正值时,设置悬挂缩进。2.6 打印功能实现无论是预览还是打印,主要还是要依赖PrintDocument控件来完成的,响应该控件的PrintPage事件,在该事件响应中真正输出每页的内容。下面几个功能的实现,有些内容是相互关系,如:要显示或打印的内容、当前显示或打印的字体、当前的打印机设置和页面设置,所以,添加四个数据成员如下: / 下面几个数据成员用于打印 private StringReader _srPrint = null; / 打印的内容 private Font _printFont; / 打印字体 PrinterSettings _printerSettings = new PrinterSettings(); / 打印机设置 PageSettings _pageSettings = new PageSettings(); / 页面设置2.6.1 预览创建打印预览对话框,将当前编辑器中的文本读到一个文本流StringReader中,设置打印字体与文件编辑器中的字体相同,设置PrintDocument控件的页面设置为用户设置的值,将PrintDocument控件与预览对话框关联起来,调用预览对话框,即可预览文本编辑器中的内容。2.6.2 打印创建打印对话框,将当前编辑器中的文本读到一个文本流StringReader中,设置打印字体与文件编辑器中的字体相同,设置PrintDocument控件的页面设置为用户设置的值,将PrintDocument控件与打印对话框关联起来,调用打印对话框,即可打印文本编辑器中的内容。2.6.3 设置打印机和设置页面这两个功能是关联的,以设置页面为主,在设置页面中包含了设置打印机功能。创建页面设置对话框,设置对话框的当前打印机参数和页面参数,显示对话框,用户可以修改打印机或页面的参数,确认后,即可保存当前的设置。 private void miPrintPrinterSetup_Click(object sender, EventArgs e) / 创建页面设置对话框 PageSetupDialog dlgPageSetup = new PageSetupDialog(); / 使用用户指定的打印机设置:这里需要既设置打印机设置,还要设置页面设置 dlgPageSetup.PrinterSettings = _printerSettings; dlgPageSetup.PageSettings = _pageSettings; / 显示页面设置对话框 if (dlgPageSetup.ShowDialog() = DialogResult.OK) _printerSettings = dlgPageSetup.PrinterSettings; private void miPrintPageSetup_Click(object sender, EventArgs e) / 创建页面设置对话框 PageSetupDialog dlgPageSetup = new PageSetupDialog(); / 使用用户指定的页面设置 dlgPageSetup.PageSettings = _pageSettings; / 显示页面设置对话框 if (dlgPageSetup.ShowDialog() = DialogResult.OK) _pageSettings = dlgPageSetup.PageSettings; 测试:首先打开一个文件,然后选择菜单“打印 | 预览”,可以看到预览效果,如下图。选择菜单“打印 | 打印”,会弹出选择打印机对话框,确认打印机后,即可打印当前编辑器中的内容。选择菜单“打印 | 设置打印机”,绘弹出页面设置对话框,其中包含选择打印机对话框,如下左图。 选择菜单“打印 | 设置页面”,绘弹出页面设置对话框,但其中不包含选择打印机对话框,如上右图。思考题:?如何设置打印机?如何设置打印文档的名称?如果是富文本格式(不同段落不同文字都可能有不同的字体和大小)怎样实现打印?2.7 工具栏实现2.7.1 制作图标每个按钮做一个图标文件,大小为16*16,参见FileNew.bmp,FileOpen.bmp,FileSave.bmp,EditCut.bmp,EditCopy.bmp,EditPaste.bmp。2.7.2 制作按钮在工具栏添加按钮并装入每个按钮的图象,图标命名:tsbFileName, tsbFileOpen, tsbFileSave, tsbEditCut, tsbEditCopy, tsbEditPaste控件属性属性值说明ToolStripButtonNametsbFileNew新建文件ImageFileNew.bmpimageTransparentColorOliveToolStripButtonNametsbFileOpen打开文件ImageFileOpen.bmpimageTransparentColorOliveToolStripButtonNametsbFileSave保存文件ImageFileSave.bmpimageTransparentColorOliveToolStripButtonNametsbEditCut剪切ImageEditCut.bmpimageTransparentColorOliveToolStripButtonNametsbEditCopy编辑ImageEditCopy.bmpimageTransparentColorOliveToolStripButtonNametsbEditPaste粘贴ImageEditPaste.bmpimageTransparentColorOlive设计完成后的效果如下图:响应每个按钮的Click消息,分别选择对应菜单项的消息响应。测试:测试六个工具条按钮的功能是否与对应菜单项的功能一致。添加每个按钮的ToolTipText;每个按钮的响应对应相应菜单的功能。2.8 状态栏实现希望象Word等软件一样,当光标移到某个菜单项上或工具条的某个工具上时,在状态栏显示对应菜单项或工具的功能说明。此外,还可以显示光标当前行号、列号,键盘的当前状态信息:是否按下插入键、数字锁定键、大小写转换键、滚动锁定键等。2.8.1 确定信息区在状态栏添加五个ToolStripStatusLabel,其属性设置如下表。控件属性属性值说明ToolStripStatusLabelNametsslMenuTip显示菜单项功能Text就绪SpringTrue其宽度随对话框的宽度变化而变化TextAlignMiddleLeftToolStripStatusLabelNametsslRowNo显示行号Text行:TextAlignMiddleLeftToolStripStatusLabelNametsslColNo显示列号Text列:TextAlignMiddleLeftToolStripStatusLabelNametsslInsert显示插入键Text(3个空格)BorderSidesAllBorderStyleSunkenToolStripStatusLabelNametsslNumLock显示数字锁定键Text(3个空格)BorderSidesAllBorderStyleSunkenToolStripStatusLabelNametsslCapsLock显示大写锁定键Text(4个空格)BorderSidesAllBorderStyleSunkenToolStripStatusLabelNametsslScrolLock显示滚动锁定键Text(6个空格)BorderSidesAllBorderStyleSunken设计完成后的效果如下图:2.8.2显示菜单项和工具的提示信息如果要实现当鼠标移到菜单项上或工具上时,实时显示菜单项或工具的提示信息,首先要给这些菜单项和工具添加提示信息,即设置ToolTipText属性值,各菜单项和工具的ToolTipText属性设置如下表。控件属性属性值说明mnFileToolTipText文件管理miFileNewToolTipText建立一个新文件miFileOpenToolTipText打开一个指定文件miFileSaveToolTipText保存当前文件miFileSaveasToolTipText另存为一个指定文件miFileExitToolTipText退出系统mnEditToolTipText编辑功能miEditCutToolTipText剪切选择内容到剪切板miEditCopyToolTipText复制选择内容到剪切板miEditPasteToolTipText粘贴剪切板的内容到当前光标处miEditUndoToolTipText撤消上次操作miEditRedoToolTipText恢复上次撤消的操作.tsbFileNewToolTipText建立一个新文件tsbFileOpenToolTipText打开一个指定文件tsbFileSaveToolTipText保存当前文件tsbEditCutToolTipText剪切选择内容到剪切板tsbEditCopyToolTipText复制选择内容到剪切板tsbEditPasteToolTipText粘贴剪切板的内容到当前光标处测试:运行程序,当光标移到菜单项或工具上时,可以看到该菜单项或工具的小提示,如下图。2.8.3 在状态栏实时显示菜单和工具的提示信息所有要在状态栏显示菜单项小提示的菜单项,均响应MouseEnter和MouseLeave消息,使用同一个消息响应程序,如下代码,则可实现当鼠标移到菜单项上时,状态栏标签显示菜单项的ToolTipText值,离开时,显示为空。同样,响应工具栏按钮的MouseEnter和MouseLeave消息,当鼠标移到工具栏按钮上时,状态栏标签显示工具栏按钮的ToolTipText值,离开时,显示为空。 private void MenuItem_MouseEnter(object sender, EventArgs e) ToolStripMenuItem menuItem = sender as ToolStripMenuItem; tsslMenuTip.Text = menuItem.ToolTipText; private void MenuItem_MouseLeave(object sender, EventArgs e) tsslMenuTip.Text = 就绪; private void ToolButton_MouseEnter(object sender, EventArgs e) ToolStripButton toolButton = sender as ToolStripButton; tsslMenuTip.Text = toolButton.ToolTipText; private void ToolButton_MouseLeave(object sender, EventArgs e) tsslMenuTip.Text = 就绪; 测试:运行程序,当光标移到菜单项或工具上时,可以看到该菜单项或工具的小提示出现在状态栏中,如下图。2.8.4 在状态栏实时显示光标的位置响应文本编辑器rtbEditor的MouseDown消息,得到光标的位置,进而得到光标的行号和列号。响应文本编辑器rtbEditor的KeyUp消息,得到光标的位置,进而得到光标的行号和列号。 private void rtbEditor_MouseDown(object sender, MouseEventArgs e) / 根据光标所在象素位置,得到字符索引号 int nCharIndex = rtbEditor.GetCharIndexFromPosition(new Point(e.X, e.Y); / 根据字符索引号,得到所在行号和列号 int nRowNo = rtbEditor.GetLineFromCharIndex(nCharIndex); int nFirstCharIndex = rtbEditor.GetFirstCharIndexFromLine(nRowNo); int nColNo = nCharIndex - nFirstCharIndex; / 在状态栏上显示行号和列号 tsslRowNo.Text = string.Format(行:0, nRowNo + 1); tsslColNo.Text = string.Format(列:0, nColNo); private void rtbEditor_KeyUp(object sender, KeyEventArgs e) / 根据光标所在位置,得到字符索引号 int nCharIndex = rtbEditor.SelectionStart; / 根据字符索引号,得到所在行号和列号 int nRowNo = rtbEditor.GetLineFromCharIndex(nCharIndex); int nFirstCharIndex = rtbEditor.GetFirstCharIndexFromLine(nRowNo); int nColNo = nCharIndex - nFirstCharIndex; / 在状态栏上显示行号和列号 tsslRowNo.Text = string.Format(行:0, nRowNo + 1); tsslColNo.Text = string.Format(列:0, nColNo); 测试:运行程序,打开一个文档,移到光标到不同的位置,观察状态条中显示当前光标所在的位置的变化,如下图。2.8.5 在状态栏实时显示键盘的状态在窗体的构造函数frmEditor()中添加如下语句:Application.Idle += new EventHandler(Application_Idle)然后定义Application_Idle()方法,见程序。 public frmEditor() InitializeComponent(); Application.Idle += new EventHandler(Application_Idle); private void Application_Idle(object sender, EventArgs e) if (Control.IsKeyLocked(Keys.Insert) tsslInsert.Text = Ins; else tsslInsert.Text = ; if (Control.IsKeyLocked(Keys.NumLock) tsslNumLock.Text = Num; else tsslNumLock.Text = ; if (Control.IsKeyLocked(Keys.CapsLock) tsslCapsLock.Text = Caps; else tsslCapsLock.Text = ; if (Control.IsKeyLocked(Keys.Scroll) tsslScrollLock.Text = Scroll; else tsslScrollLock.Text = ; 测试:运行程序,打开一个文档,按下插入键、数字锁定键、大写锁定键、滚动锁定键,测试状态条显示的改变,如下图。2.9 文本查找和替换2.9.1 添加一个新的窗体文件控件属性属性值说明FormNamefrmFindAndReplace查找与替换Text查找和替换Font宋体,五号TopMostTrue总显示在最上面TabControlNametabControl1卡片控制TabPageNametabFind卡片页:查找Text查找TabPageNametabReplace卡片页:替换Text替换TextBoxNametxtFindFind查找页:查找文本CheckBoxNamecbFindWholeWord查找页:全字匹配Text全字匹配CheckBoxNamecbFindMatchCase查找页:区分大小写Text区分大小写ButtonNamebtnFindFindNext查找页:查找下一个Text查找下一个ButtonNamebtnFindCancel查找页:取消Text取消TextBoxNametxtReplaceFind替换页:查找文本TextBoxNametxtReplaceReplace替换页:替换文本CheckBoxNamecbReplaceWholeWord替换页:全字匹配Text全字匹配CheckBoxNamecbReplaceMatchCase替换页:区分大小写Text区分大小写ButtonNamebtnReplaceFindNext查找页:查找下一个Text查找下一个ButtonNamebtnReplaceReplace查找页:替换Text替换ButtonNamebtnReplaceReplaceAll查找页:全部替换Text全部替换ButtonNamebtnReplaceCancel查找页:取消Text取消设计完成后的窗口如下: 2.9.2 数据成员和属性设计为了便于功能实现,设计了四个数据成员和属性,如下: / 要查找的字符串 string _findStr; public string FindStr get return _findStr; set _findStr = value; txtFindFind.Text = _findStr; txtReplaceFind.Text = _findStr; / 要替换的字符串 string

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论