基于.NET的Windows窗体编程之WinForms输入与显示
在日常软件开发中文本输入与显示是最基础的功能也是最简单的内容主要用于在表单中获取用户输入的内容和向用户展示内容。如果只是简单的文本输入与显示用Label和TextBox就可以实现但是富文本对控件的要求就比较多了比如加粗斜体下划线等样式设置它在一些应用场景中比较常见比如留言板论坛文章编辑器等今天我们以一些简单的小例子简述文本输入与显示的相关控件的使用仅供学习分享使用如有不足之处还请指正。概述在WinForms窗体开发中文本输入与显示是最基础的功能也是最简单的内容主要用于在表单中获取用户输入的内容和向用户展示内容。常见的输入与显示控件有以下几种TextBox 文本框可以用于输入纯文本内容。Label只能用于显示文本不可编辑。RichTextBox可以显示富文本如加粗斜体以及图片等样式。LinkLabel用于显示带链接的文本。MaskedTextBox使用掩码区分正确和不正确的用户输入的文本框。LabelLabel 控件显示用户无法编辑的文本主要用于标识窗体上的对象并提供特定控件所代表或执行的作的说明。例如可以使用标签向文本框、列表框、组合框等添加描述性标题还可以编写代码来更改Label在运行时显示的文本。Label控件的关键属性如下所示Text用于在Lable控件上显示的内容。TextAlign设置文本在Lable控件中的对齐方式。UseMnemonic 由于Label控件无法接收焦点因此可用于为其他相邻控件创建访问键此属性用于标识是否将Text属性中文本的与号设置为标签分配访问键。TabIndex 的Tab键的索引值当被置为访问键时它的TabIndex属性需要比被相邻控件小1。AutoSize 自动设置Lable控件的大小当此属性为true时有助于调整控件的大小以适应较大或较小的标题如果标题在运行时更改则特别有用。如果此属性为false则Text 属性中指定的单词将尽可能换行到下一行但控件不会增长。说明使用一个符号 () 指示访问键用两个符号 () 显示符号当设置访问键是即可通过Alt访问键进行快捷访问。首先创建两个Label控件和TextBox控件用于设置学生的年龄和姓名在Form的Load事件中设置控件TabIndex和访问键属性如下所示private void FrmText_Load(object sender, EventArgs e) { this.lblStudent.Text 姓名(N); this.lblStudent.TabIndex 0; this.lblStudent.UseMnemonic true; this.txtName.TabIndex 1; this.lblAge.Text 年龄(A); this.lblAge.TabIndex 2; this.lblAge.UseMnemonic true; this.txtAge.TabIndex 3; }运行程序在软件页面上通过Alt访问键进行聚焦文本框如下所示在上述示例中不需要通过鼠标选择聚焦文本框只需要通过Alt访问键进行聚焦即可。需要注意的是首先Focus焦点应该在当前软件页面上才可以通过快捷键进行访问。LinkLabelLinkLabel控件使你可以向 Windows 窗体应用程序添加 Web 样式链接LinkLabel 控件具有Label控件的所有内容还可以将文本的一部分设置为指向文件、文件夹或网页的链接。LinkLable控件的关键属性如下所示LinkArea 属性设置激活链接的文本区域。LinkColor VisitedLinkColor和ActiveLinkColor属性设置链接的颜色。LinkClicked 事件确定选择链接文本时会发生什么情况。Links 属性显示多个超链接。LinkData 可用于存储要显示的文件的位置或网站的地址。首先拖动一个LinkLable控件到Form表单中并设置Text和LinkArea属性如下所示在LinkLabel控件的属性窗体的事件Tab页通过双击设置LinkLabel的LinkClicked事件如下所示在LinkClicked事件中编写逻辑打开网页如下所示private void llblBaiDu_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { System.Diagnostics.Process.Start(C:\Users\Alan.hsiang\AppData\Local\Google\Chrome\Application\chrome.exe,https://www.baidu.com); }运行程序如下所示TextBoxTextBox控件用于从用户处获取输入或显示文本。此控件通常用于可编辑文本但也可以将其设置为只读。 文本框可以显示多行换行文本以适应控件大小并添加基本格式。 TextBox控件允许在控件中显示的或输入的文本使用单一格式。TextBox控件的关键属性Text 显示文本框中的文本。 默认情况下文本框中最多输入 2048 个字符。 如果将 Multiline 属性设置为 true则最多可以输入 32 KB 的文本。 Text 属性可以在设计时通过“属性”窗口设置也可以在运行时通过代码或用户输入进行设置。通过读取 Text 属性可以在运行时获取文本框中的当前输入内容。SelectionStart 属性设置当前选择内容的起始位置如果设置为0则将插入点立即置于第一个字符的左侧。SelectionLength 属性设置为要选择的文本长度。TabIndexTab键的索引当TabIndex属性设置为0时则默认将焦点设置为此控件并显示插入点光标。PasswordChar指定文本框中显示的字符如将PasswordChar设置为星号则无论用户在文本框中键入什么字符都会显示星号。MaxLength标识可以在文本框中键入多少个字符。 如果超出最大长度系统将发出蜂鸣声文本框不接受更多字符。ReadOnly标识是否可以修改文本框中的文本内容如果设置为true文本框转换为只读控件。SelectedText 属性访问所选文本。Multiline 是否显示多行文本如果设置为true则显示为多行文本如果要在多行 TextBox 中显示回车符请使用 NewLine 属性。WordWrap属性是否自动换行如果设置为true不会显示水平滚动条如果设置为false控件中的文本不会自动换行因此将向右滚动直到到达换行符。ScrollBars 属性是否显示滚动条None完全不显示Horizontal仅显示水平滚动条Vertical仅显示垂直滚动条Both同时显示水平和垂直滚动条。首先拖动TextBoxLabel控件到Form表单中分别显示密文和明文如下所示在属性窗体的事件Tab页设置TextBox的TextChanged事件如下所示在TextChanged事件中同步将TextBox的内容显示在Label上如下所示private void txtPassword_TextChanged(object sender, EventArgs e) { this.lblContent.Text this.txtPassword.Text; }运行程序效果如下所示通过上述示例可以看出PasswordChar只是在显示上加密但实际输入的文本不会以任何方式加密。MaskedTextBoxMaskedTextBox是一个增强 TextBox 控件支持用于接受或拒绝用户输入的声明性语法通过此控件可以使用掩码区分正确和不正确的用户输入。MaskedTextBox控件的关键属性如下所示Mask属性可以设置控件的掩码。MaskInputRejected当字符不符合掩码时使用事件处理程序向用户发出警报TypeValidationCompleted事件处理程序在尝试提交的值对类型无效时向用户发出警报即失去Focus焦点时触发类型验证事件。首先拖动MaskedTextBox控件的Form窗体中选择控件点击控件右上角的“黑色右箭头”在弹出的“MaskedTextBox任务”窗口中点击“设置掩码...”打开“输入掩码”对话框如下所示在MaskedTextBox的属性窗口中切换到事件Tab页分别为控件设置TypeValidationCompleted事件和MaskInputRejected事件如下所示在两个事件中输入错误提示private void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e) { lblError.Text 输入错误; } private void maskedTextBox1_TypeValidationCompleted(object sender, TypeValidationEventArgs e) { if (e.IsValidInput) { this.lblError.Text ; } }运行程序示例效果如下说明系统预先定义了一部分掩码如果不合适还可以自定义新的掩码。RichTextBoxWindows窗体中的RichTextBox控件用于显示输入和操作格式化的文本RichTextBox除了拥有TextBox控件的所有功能外还可以显示字体颜色链接从文件中读取和加载图像以及查找指定的字符。RichTextBox控件通常用于提供类似字体处理程序如Microsoft Word的文本操作和显示功能。RichTextBox控件可以显示滚动条且默认根据需要进行显示。RichTextBox的关键属性如下所示SelectionFont 获取或设置当前选定文本或插入点的字体。FontStyle 指定应用到文本的字形信息。SelectionAlignment 获取或设置应用到当前选定内容或插入点的对齐方式。SelectionIndent 获取或设置所选内容开始行的缩进距离以像素为单位。SelectionCharOffset 获取或设置控件中的文本是显示在基线上、作为上标还是作为基线下方的下标。SelectionColor 获取或设置当前选定文本或插入点的文本颜色。SelectionBackColor 获取或设置在 System.Windows.Forms.RichTextBox 控件中选中文本时文本的颜色。SelectionBullet 获取或设置一个值通过该值指示项目符号样式是否应用到当前选定内容或插入点。Clipboard Paste 粘贴指定剪贴板格式的剪贴板内容【插入图片时使用】。Find 在对搜索应用特定选项的情况下在 System.Windows.Forms.RichTextBox 控件的文本中搜索位于控件内特定位置的字符串。首先布局UI页面主要包括RichTextBox和一些功能按钮如加粗斜体下划线等如下所示定义RichTextBox的格式接口和枚举类型namespace Okcoder.WinForm.Demo.Model { /// summary /// 富文本框格式 /// /summary public interface IRichFormat { void SetFormat(RichTextBox rtbInfo); } } namespace Okcoder.WinForm.Demo.Model { /// summary /// 按钮类型 /// /summary public enum BTNType { Bold 0, Italic, UnderLine, Font, BGColor, ForeColor, Left, Center, Right, Indent, OutIndent, Ul, StrikeLine, SubScript, SuperScript, Pic, Print, Search, Del, FontSize } } namespace Okcoder.WinForm.Demo.Model { public abstract class BaseRichFormat : IRichFormat { public abstract void SetFormat(RichTextBox rtbInfo); } }实现具体的每一个按钮的功能namespace Okcoder.WinForm.Demo.Model { public class DefaultRickFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { } } /// summary /// 加粗格式 /// /summary public class BoldRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { Font oldFont rtbInfo.SelectionFont; Font newFont; if (oldFont.Bold) { newFont new Font(oldFont, oldFont.Style ~FontStyle.Bold);//支持位于运算 } else { newFont new Font(oldFont, oldFont.Style | FontStyle.Bold); } rtbInfo.SelectionFont newFont; } } /// summary /// 斜体 /// /summary public class ItalicRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { Font oldFont rtbInfo.SelectionFont; Font newFont; if (oldFont.Italic) { newFont new Font(oldFont, oldFont.Style ~FontStyle.Italic); } else { newFont new Font(oldFont, oldFont.Style | FontStyle.Italic); } rtbInfo.SelectionFont newFont; rtbInfo.Focus(); } } /// summary /// 下划线 /// /summary public class UnderLineRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { Font oldFont rtbInfo.SelectionFont; Font newFont; if (oldFont.Underline) { newFont new Font(oldFont, oldFont.Style ~FontStyle.Underline); } else { newFont new Font(oldFont, oldFont.Style | FontStyle.Underline); } rtbInfo.SelectionFont newFont; rtbInfo.Focus(); } } /// summary /// 删除线 /// /summary public class StrikeLineRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { Font oldFont rtbInfo.SelectionFont; Font newFont; if (oldFont.Underline) { newFont new Font(oldFont, oldFont.Style ~FontStyle.Strikeout); } else { newFont new Font(oldFont, oldFont.Style | FontStyle.Strikeout); } rtbInfo.SelectionFont newFont; rtbInfo.Focus(); } } /// summary /// 左对齐 /// /summary public class LeftRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { rtbInfo.SelectionAlignment HorizontalAlignment.Left; rtbInfo.Focus(); } } /// summary /// 居中对齐 /// /summary public class CenterRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { if (rtbInfo.SelectionAlignment HorizontalAlignment.Center) { rtbInfo.SelectionAlignment HorizontalAlignment.Left; } else { rtbInfo.SelectionAlignment HorizontalAlignment.Center; } rtbInfo.Focus(); } } /// summary /// 右对齐 /// /summary public class RightRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { if (rtbInfo.SelectionAlignment HorizontalAlignment.Right) { rtbInfo.SelectionAlignment HorizontalAlignment.Left; } else { rtbInfo.SelectionAlignment HorizontalAlignment.Right; } rtbInfo.Focus(); } } /// summary /// 缩进对齐 /// /summary public class IndentRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { //每次以10个像素进行缩进 rtbInfo.SelectionIndent rtbInfo.SelectionIndent 10; rtbInfo.Focus(); } } /// summary /// 缩进对齐 /// /summary public class OutIndentRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { //每次以10个像素进行缩进 rtbInfo.SelectionIndent rtbInfo.SelectionIndent - 10; rtbInfo.Focus(); } } /// summary /// 下标 /// /summary public class SubScriptRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { if (rtbInfo.SelectionCharOffset 0) { rtbInfo.SelectionCharOffset 0; } else { rtbInfo.SelectionCharOffset -5; } rtbInfo.Focus(); } } /// summary /// 上标 /// /summary public class SuperScriptRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { if (rtbInfo.SelectionCharOffset 0) { rtbInfo.SelectionCharOffset 0; } else { rtbInfo.SelectionCharOffset 5; } rtbInfo.Focus(); } } /// summary /// 字体 /// /summary public class FontRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { FontDialog f new FontDialog(); if (f.ShowDialog() DialogResult.OK) { FontFamily family f.Font.FontFamily; rtbInfo.SelectionFont new Font(family, rtbInfo.SelectionFont.Size, rtbInfo.SelectionFont.Style); } rtbInfo.Focus(); } } /// summary /// 文本颜色 /// /summary public class ForeColorRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { ColorDialog f new ColorDialog(); if (f.ShowDialog() DialogResult.OK) { rtbInfo.SelectionColor f.Color; } rtbInfo.Focus(); } } /// summary /// 文本背景颜色 /// /summary public class BgColorRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { ColorDialog f new ColorDialog(); if (f.ShowDialog() DialogResult.OK) { rtbInfo.SelectionBackColor f.Color; } rtbInfo.Focus(); } } /// summary /// UL列表,项目符号样式 /// /summary public class UlRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { if (rtbInfo.SelectionBullet) { rtbInfo.SelectionBullet false; } else { rtbInfo.SelectionBullet true; rtbInfo.BulletIndent 10; } rtbInfo.Focus(); } } /// summary /// 图片插入 /// /summary public class PicRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { OpenFileDialog o new OpenFileDialog(); o.InitialDirectory AppDomain.CurrentDomain.BaseDirectory; o.Title 请选择图片; o.Filter jpeg|*.jpeg|jpg|*.jpg|png|*.png|gif|*.gif; if (o.ShowDialog() DialogResult.OK) { string fileName o.FileName; try { Image bmp Image.FromFile(fileName); Clipboard.SetDataObject(bmp); DataFormats.Format dataFormat DataFormats.GetFormat(DataFormats.Bitmap); if (rtbInfo.CanPaste(dataFormat)) { rtbInfo.Paste(dataFormat); } } catch (Exception exc) { MessageBox.Show(图片插入失败。 exc.Message, 提示, MessageBoxButtons.OK, MessageBoxIcon.Information); } } rtbInfo.Focus(); } } /// summary /// 删除 /// /summary public class DelRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { rtbInfo.SelectedText ; rtbInfo.Focus(); } } /// summary /// 查找 /// /summary public class SearchRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { string find rtbInfo.Tag.ToString(); int index rtbInfo.Find(find, 0,RichTextBoxFinds.None); int startPos index; int nextIndex 0; while (nextIndex ! startPos)//循环查找字符串并用蓝色加粗12号Times New Roman标记之 { rtbInfo.SelectionStart index; rtbInfo.SelectionLength find.Length; rtbInfo.SelectionColor Color.Blue; rtbInfo.SelectionFont new Font(Times New Roman, (float)12, FontStyle.Bold); rtbInfo.Focus(); nextIndex rtbInfo.Find(find, index find.Length, RichTextBoxFinds.None); if (nextIndex -1)//若查到文件末尾则充值nextIndex为初始位置的值使其达到初始位置顺利结束循环否则会有异常。 { nextIndex startPos; } index nextIndex; } rtbInfo.Focus(); } } /// summary /// 打印 /// /summary public class PrintRichFormat : BaseRichFormat { private RichTextBox richTextbox; public override void SetFormat(RichTextBox rtbInfo) { this.richTextbox rtbInfo; PrintDocument pd new PrintDocument(); pd.PrintPage new PrintPageEventHandler(pd_PrintPage); // 打印文档 pd.Print(); } private void pd_PrintPage(object sender, PrintPageEventArgs ev) { //ev.Graphics.DrawString(richTextbox.Text); //ev.HasMorePages true; } } /// summary /// 字体大小 /// /summary public class FontSizeRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { string fontSize rtbInfo.Tag.ToString(); float fsize 0.0f; if (float.TryParse(fontSize, out fsize)) { rtbInfo.SelectionFont new Font(rtbInfo.Font.FontFamily, fsize, rtbInfo.SelectionFont.Style); } rtbInfo.Focus(); } } }创建RichFormatFactory工厂用于实现根据枚举类型创建实例对象的方法namespace Okcoder.WinForm.Demo.Model { public class RichFormatFactory { public static IRichFormat CreateRichFormat(BTNType btnType) { IRichFormat richFormat; switch (btnType) { case BTNType.Bold: richFormat new BoldRichFormat(); break; case BTNType.BGColor: richFormat new BgColorRichFormat(); break; case BTNType.Center: richFormat new CenterRichFormat(); break; case BTNType.Del: richFormat new DelRichFormat(); break; case BTNType.Font: richFormat new FontRichFormat(); break; case BTNType.ForeColor: richFormat new ForeColorRichFormat(); break; case BTNType.FontSize: richFormat new FontSizeRichFormat(); break; case BTNType.Indent: richFormat new IndentRichFormat(); break; case BTNType.Italic: richFormat new ItalicRichFormat(); break; case BTNType.Left: richFormat new LeftRichFormat(); break; case BTNType.OutIndent: richFormat new OutIndentRichFormat(); break; case BTNType.Pic: richFormat new PicRichFormat(); break; case BTNType.Print: richFormat new PrintRichFormat(); break; case BTNType.Right: richFormat new RightRichFormat(); break; case BTNType.Search: richFormat new SearchRichFormat(); break; case BTNType.StrikeLine: richFormat new StrikeLineRichFormat(); break; case BTNType.SubScript: richFormat new SubScriptRichFormat(); break; case BTNType.SuperScript: richFormat new SuperScriptRichFormat(); break; case BTNType.Ul: richFormat new UlRichFormat(); break; case BTNType.UnderLine: richFormat new UnderLineRichFormat(); break; default: richFormat new DefaultRickFormat(); break; } return richFormat; } } }在Form表单中当点击按钮时根据点击按钮的类型创建不同的实例来实现相应的功能namespace Okcoder.WinForm.Demo { public partial class FrmRichText : Form { public FrmRichText() { InitializeComponent(); } public void btnButtonClick(object sender, EventArgs e) { Button btn (Button)sender; BTNType btnType; if (Enum.TryParseBTNType(btn.Tag.ToString(), out btnType)) { if (btnType BTNType.Search) { if (!string.IsNullOrEmpty(this.txtSearch.Text.Trim())) { this.rtbInfo.Tag this.txtSearch.Text.Trim(); } else { return; } } IRichFormat richFomat RichFormatFactory.CreateRichFormat(btnType); richFomat.SetFormat(this.rtbInfo); } } private void combFontSize_SelectedIndexChanged(object sender, EventArgs e) { float fsize 12.0f; if (combFontSize.SelectedIndex -1) { if (float.TryParse(combFontSize.SelectedItem.ToString(), out fsize)) { rtbInfo.Tag fsize.ToString(); IRichFormat richFomat RichFormatFactory.CreateRichFormat(BTNType.FontSize); richFomat.SetFormat(this.rtbInfo); } return; } } } }运行代码示例效果如下所示源码获取关于本系列的完整代码可以通过gitee上的库进行获取https://gitee.com/ahsiang/winforms以上就是《基于.NET的Windows窗体编程之WinForms输入与显示》的全部内容旨在抛砖引玉一起学习共同进步。