编写一个写字板初步了解Winform编程(三)——代码设计

来源:互联网 发布:数据结构和算法的关系 编辑:程序博客网 时间:2024/06/05 20:34

写字板程序的所有功能几乎都是围绕richTextBox这个控件的,所以我们这边设计的代码都是关于richTextBox这个控件的方法属性的使用。当然还有一些其他基本控件的使用。如果有过java swing编程基础或者编写过VB等程序就很容易理解。


主要就是粘贴代码,对于一些重要部分做出解释。


打开文件:

        private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)        {            openFileDialog1.Filter = "文本文件|*.txt|RTF文本文档|*.rtf|所有写字板文档|*.txt;*.rtf|所有文件|*.*";            openFileDialog1.FileName = "";            openFileDialog1.FilterIndex = 3;            if (openFileDialog1.ShowDialog() == DialogResult.OK)            {                richTextBoxContent.Clear();                richTextBoxContent.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.RichText);                CurFileName = openFileDialog1.FileName;                this.Text = "C#写字板 " + CurFileName;                Start = 0;            }        }

主要用到openFileDalog控件,这个控件用于显示一个打开文件或者文件夹的窗口,待用户选择后,调用这个控件获得的文件路径。

这里首先要对这个控件进行设置,Filter属性需要一行文本,文本格式就是上述代码,先是要显示的提醒,用“|”分割符号分割,然后显示要显示文件的通配符,如果要显示多个通配符的话就用“;”分号隔开。

FilterIndex属性用于设置默认filter是哪个,从1开始。

然后调用ShowDialog()方法显示打开文件的窗口。它的返回值是用户到底按下了哪个按钮,使用枚举类型DialogResult进行匹配。

然后就是将文件载入到richTextBox中了,我们这边使用richTextBox的LoadFile方法,第一个参数是文件路径,第二个参数是载入模式,richText表示载入富文本,包括文件中的图片和字体格式。


保存文件:

        private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)        {            if (CurFileName != string.Empty)            {                Save();            }            else            {                SaveAs();            }        }        private void Save()        {            if (CurFileName == string.Empty)            {                SaveAs();            }            else            {                if (CurFileName.EndsWith(".rtf"))                {                    richTextBoxContent.SaveFile(CurFileName, RichTextBoxStreamType.RichText);                }                else                {                    richTextBoxContent.SaveFile(CurFileName, RichTextBoxStreamType.PlainText);                }                IsModify = false;                this.Text = "C#写字板 " + CurFileName;            }                    }        private void SaveAs()        {            SaveAs(2);        }        private void SaveAs(int Index)        {            saveFileDialog1.Filter = "文本文件|*.txt|RTF文本文档|*.rtf|所有文件|*.*";            saveFileDialog1.FilterIndex = Index;            saveFileDialog1.Title = "另存为";            saveFileDialog1.FileName = "";            if (saveFileDialog1.ShowDialog() == DialogResult.OK)            {                if (saveFileDialog1.DefaultExt == ".rtf")                {                    richTextBoxContent.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.RichText);                }                else                {                    richTextBoxContent.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);                }                if (CurFileName == string.Empty)                {                    CurFileName = saveFileDialog1.FileName;                    IsModify = false;                    this.Text = "C#写字板 " + CurFileName;                }            }        }

这边我们有一个类属性叫做CurFileName用于储存文件的默认保存位置,就和记事本一样,如果这个文件没有被指定过一次保存位置,点击保存会出现另存为的窗口,而保存过一次后,点击保存就将文件保存到之前保存过的位置上了。这个变量就是起这个效果的,如果它是空的话,就表示没有保存过,显示另存为。

这边用的saveFileDialog和openFileDialog的方法其实是一致的。

richTextBox的SaveFile与LoadFile也是类似的,这里就不做说明了。其中RichTextBoxStreamType.PlainText表示纯文本。


粘贴板操作:

        private void buttonPaste_Click(object sender, EventArgs e)        {            richTextBoxContent.Paste();        }        private void buttonCopy_Click(object sender, EventArgs e)        {            richTextBoxContent.Copy();        }        private void buttonCut_Click(object sender, EventArgs e)        {            richTextBoxContent.Cut();        }
粘贴板直接使用richText封装好的方法就行了,这里不做说明。


图片插入:

        private void buttonPic_Click(object sender, EventArgs e)        {            openFileDialog1.Filter = "BMP文件|*.bmp|JPG文件|*.jpg|PNG文件|*.png|所有支持的图片文件|*.bmp;*.jpg;*.png|所有文件|*.*";            openFileDialog1.Title = "打开图片";            openFileDialog1.FilterIndex = 4;            if (openFileDialog1.ShowDialog() == DialogResult.OK)            {                Bitmap bmp = new Bitmap(openFileDialog1.FileName);//获得图片                Clipboard.SetDataObject(bmp, false);//将图片放在剪贴板中                if (richTextBoxContent.CanPaste(DataFormats.GetFormat(DataFormats.Bitmap)))                    richTextBoxContent.Paste();//粘贴数据            }        }
图片插入的原理是先把图片加到剪贴板中,然后再粘贴到richTextBox。

openFileDialog的使用就不说了。这里定义了一个位图Bitmap,然后通过Bitmap类的构造方法构造,Clipboard.SetDataObject方法第一个参数是想要加入的对象,第二个参数是表示退出程序后不保存剪贴板数据。注意:使用这个方法本身 就会把剪贴板数据清除。


插入时间:

        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)        {            richTextBoxContent.AppendText(dateTimePicker1.Text);        }
值得注意的方法是richTextBox的AppendText是往文本末尾加入的。而不是插入点。


撤销、重复、搜索

        private void buttonUndo_Click(object sender, EventArgs e)        {            if (richTextBoxContent.CanUndo)            {                richTextBoxContent.Undo();            }        }        private void buttonRedo_Click(object sender, EventArgs e)        {            if (richTextBoxContent.CanRedo)            {                richTextBoxContent.Redo();            }        }        private void buttonSearch_Click(object sender, EventArgs e)        {            int FindPos = richTextBoxContent.Find(textBoxSearchText.Text,Start + 1,RichTextBoxFinds.None);            if (FindPos >= 0)            {                Start = FindPos;            }            else            {                MessageBox.Show("没有找到!", "提示");            }        }
注意点是Undo、Redo操作前一定要用CanUdo或CanRedo判断是否能撤销和重复,否则可能会发生错误。

其中FindPos是查找开始的位置,用于循环查找。否则只会查找第一个。


设置粗体、斜体、下划线、删除线

        private void buttonBold_Click(object sender, EventArgs e)        {            SetFontStyle(FontStyle.Bold);        }        private void SetFontStyle(FontStyle style)        {            int SelectStart = richTextBoxContent.SelectionStart;            int SelectLength = richTextBoxContent.SelectionLength;            RichTextBox TempText = new RichTextBox();            TempText.Rtf = richTextBoxContent.SelectedRtf;            for (int i = 0; i < TempText.Rtf.Length; i++)            {                TempText.Select(i, 1);                TempText.SelectionFont = new Font(TempText.SelectionFont, TempText.SelectionFont.Style ^ style);            }            TempText.Select(0, TempText.Rtf.Length - 1);            richTextBoxContent.SelectedRtf = TempText.SelectedRtf;            richTextBoxContent.Select(SelectStart, SelectLength);            richTextBoxContent.Focus();        }        private void buttonItalic_Click(object sender, EventArgs e)        {            SetFontStyle(FontStyle.Italic);        }        private void buttonUnderline_Click(object sender, EventArgs e)        {            SetFontStyle(FontStyle.Underline);        }
这里有一个注意点,当选中的文本中有很多字体的时候,使用SelectionFont方法获得的字体会空。所以需要一个一个字的来判断。

还有一个就是多种字体的组合需要用异或。


获取系统已经安装的字体:

        private void Form1_Load(object sender, EventArgs e)        {            //获取系统已经安装的字体,添加进comboBox中            InstalledFontCollection MyFont = new InstalledFontCollection();            FontFamily[] MyFontFamilies = MyFont.Families;            int Count = MyFontFamilies.Length;            for (int i = 0; i < Count; i++)            {               comboBoxInstalledFont.Items.Add(MyFontFamilies[i].Name);            }            //获取richTextBox默认字体            comboBoxInstalledFont.SelectedItem = richTextBoxContent.Font.Name;            //获取字号            numericUpDownFontSize.Value = (decimal)richTextBoxContent.Font.Size;        }
当窗口载入的时候就要初始化。这个方法我也是百度来的,直接用吧。


numericUpDown控件:

        private void numericUpDownFontSize_ValueChanged(object sender, EventArgs e)        {            richTextBoxContent.SelectionFont = new Font(comboBoxInstalledFont.Text, (float)numericUpDownFontSize.Value);        }
这个控件用于数字选择,可以直接输入,也可以按上下三角形加减。

它有几个重要的属性:1.Increment:增量,就是单击一下增加或者减少的数值。 2.Maximum、Minimum就是最大值和最小值


定义字体颜色和异常:

        private void buttonConfirmColor_Click(object sender, EventArgs e)        {            try {                int R = Convert.ToInt32(textBoxR.Text);                int G = Convert.ToInt32(textBoxG.Text);                int B = Convert.ToInt32(textBoxB.Text);                richTextBoxContent.SelectionColor = Color.FromArgb(R, G, B);            }            catch            {                MessageBox.Show(this, "RGB值应该为0~255之间的数字。", "警告");            }        }
定义字体颜色只要修改richText的SelectionColor属性就好了。

异常与java一致,用try...catch...语句包围。


缩放:

        private void buttonNormal_Click(object sender, EventArgs e)        {            richTextBoxContent.ZoomFactor = 1;            ZoomFactor = 1;        }        private void buttonZoomUp_Click(object sender, EventArgs e)        {            ZoomFactor *= 2;            if (ZoomFactor >= 64)                ZoomFactor = 63;            richTextBoxContent.ZoomFactor = ZoomFactor;        }        private void buttonZoomDown_Click(object sender, EventArgs e)        {            ZoomFactor /= 2;            if (ZoomFactor <= 0.015625)                ZoomFactor = 0.015626f;            richTextBoxContent.ZoomFactor = ZoomFactor;        }
缩放就是调整richText的ZoomFactor属性。需要注意的是它有最大值和最小值,分别为64和0.015625,左右都开。


总结,总得来说很容易就能设计出一个符合Windows风格的winform程序。有些控件的使用千奇百怪,所以用好搜索引擎很重要。


我上传了我的项目工程,下载地址:http://pan.baidu.com/s/1dDoGYYl

















0 0