《MyNotepad》是类似于Word的软件,但没有Word功能那么强大,比记事本略强。《MyNotepad》是练习控件、文件操作的学习软件,而不是一款商业目的的产品。
软件的基本功能有字体、字号、字型、对齐、编辑等操作,现在让我们来看看如何实现。
l 字体:
private
void tsbFont_Click(object sender, EventArgs e) {
Font font = rtfContent.SelectionFont;//
当前选中文字的字体
FontDialog dialog = new FontDialog();
dialog.Font = font;
if (dialog.ShowDialog() == DialogResult.OK) {//
打开选择字体对话框
rtfContent.SelectionFont = new Font(dialog.Font,font.Style);
}
}
l 字号:

private
void tsbFontSize_SelectedIndexChanged(object sender, EventArgs e) {
SetFontSize();
}
private
void tsbFontSize_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.Enter) {
SetFontSize();
}
}
private
void SetFontSize() {
try {
Font font = rtfContent.SelectionFont;
float size = Convert.ToSingle(tsbFontSize.Text);
rtfContent.SelectionFont = new Font(font.Name, size);
} catch { }
}
SelectedIndexChanged是选择了某个字号后设置字号大小,KeyDown是手动输入字号按回车后更改,SetFontSize是真正设置的代码。
l 字型:
//
粗体
private
void tsbBold_Click(object sender, EventArgs e) {
Font font = rtfContent.SelectionFont;
rtfContent.SelectionFont = new Font(font.Name, font.Size, font.Style ^ FontStyle.Bold);
}
//
斜体
private
void tsbItalic_Click(object sender, EventArgs e) {
Font font = rtfContent.SelectionFont;
rtfContent.SelectionFont = new Font(font.Name, font.Size, font.Style ^ FontStyle.Italic);
}
//
下划线
private
void tsbUnderLine_Click(object sender, EventArgs e) {
Font font = rtfContent.SelectionFont;
rtfContent.SelectionFont = new Font(font.Name, font.Size, font.Style ^ FontStyle.Underline);
}
注意:font.Style是使用^异或来完成的。FontStyle是枚举类型,分别有:
普通文本Regular:0
粗体Bold:1
斜体Italic:2
下划线Underline:4
删除线Strikeout:8
底层实现方式是采用1个字节的低四位方式:0000XXXX
最右边的位如果是0表示普通文本,如果是1表示粗体
右边数过来第二位如果是1表示斜体(2的二进制表示10)
右边数过来第三位如果是1表示下划线(4的二进制表示100)
右边数过来第四位如果是1表示删除线(8的二进制表示1000)
那么,如果是粗体+斜体,就应该是0000 0011,最后一个1表示粗体,倒数第二个1表示斜体。
那么,我要去除斜体,只需将倒数第二个1变成0即可。采用0000 0011B^10B。异或就是相同为0,相异为1。操作后就是0000 0001。
这就是为什么采用异或操作的原因。
l 编辑
//
剪切
private
void tsbCut_Click(object sender, EventArgs e) {
if (rtfContent.SelectedText.Length > 0) {
rtfContent.Cut();
}
}
//
复制
private
void tsbCopy_Click(object sender, EventArgs e) {
if (rtfContent.SelectedText.Length > 0) {
rtfContent.Copy();
}
}
//
粘贴
private
void tsbPaste_Click(object sender, EventArgs e) {
rtfContent.Paste();
}
//
撤销
private
void tsbUndo_Click(object sender, EventArgs e) {
rtfContent.Undo();
}
//
重做
private
void tsbRedo_Click(object sender, EventArgs e) {
rtfContent.Redo();
}
由于RichTextBox已封装了常见的操作方式,使得我们能很容易地操作这些方法。
l 对齐
//
左对齐
private
void tsbLeft_Click(object sender, EventArgs e) {
rtfContent.SelectionAlignment = HorizontalAlignment.Left;
}
//
居中对齐
private
void tsbCenter_Click(object sender, EventArgs e) {
rtfContent.SelectionAlignment = HorizontalAlignment.Center;
}
//
右对齐
private
void tsbRight_Click(object sender, EventArgs e) {
rtfContent.SelectionAlignment = HorizontalAlignment.Right;
}
l 自动换行
//
自动换行
private
void tsmiWordWrap_Click(object sender, EventArgs e) {
rtfContent.WordWrap = (tsmiWordWrap.Checked = !tsmiWordWrap.Checked);
}
这句语法可能有人会质疑。听我解释:自动换行需要设置两个内容,1.菜单项加一个打勾获取去除打勾,然后设置RichTextBox的WordWrap属性。
tsmiWordWrap.Checked = !tsmiWordWrap.Checked就是设置打勾与否,设置为相反。
rtfContent.WordWrap = XXX;就是将是否自动换行的属性赋给控件。一句话完成两个操作。