我的记事本 第二讲:基本功能的实现

来源:互联网 发布:windowxp主题 windows 编辑:程序博客网 时间:2024/06/18 05:20

《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;就是将是否自动换行的属性赋给控件。一句话完成两个操作。