基於C#開發的一款記事本軟件,包括記事本文件的新建、打開、讀取、保存、文本的加粗、傾斜、字體、字號,記事本的批量操作等。
Hello!大灰狼又來和大家分享值得學習的C#開發項目了,今天和大家分享一個大家應該都比較熟悉的開發項目—“記事本”。
很多小夥伴可能也都使用過記事本來記錄一些自己比較重要或者容易忘記的事情,但是你知道它是怎麼開發出來的嘛?
同樣和之前大灰狼和大家分享的計算器項目一樣,記事本項目也可以使用很多不同的語言開發,今天大灰狼就先和大家介紹一下使用C#開發記事本的思路和流程。
同時對於Java和C#在GUI編程上相同和不同之處,小夥伴可以看我之前的這篇文章“Java交互界面實現計算器開發設計【附函數源碼】”,
好了,廢話不多說,直接上教程。
C#的記事本開發需要我們定義兩個窗體,也就是一個承載所有記事本的父窗體,一個具有記事本基本功能的子窗體。
.
記事本子窗體
所以我們首先來聊一下具有記事本基本功能的子窗體的開發。
在C#的窗體應用中,我們可以直接對界面進行控件佈局,不需要使用代碼定義控件,在這一點上C#的窗體應用開發是很不錯的。
那麼在記事本應用中,我們應該添加在窗體中的控件應該有,文件的新建、打開、保存,以及字體的樣式、字號、是否加粗傾斜這些基本的記事本控件。同時當然還需要記事本的編輯文本框,方便我們對內容的修改和輸入。
瞭解了這些基本的控件之後,就是我們對每一個控件所綁定的函數的書寫了,
獲取系統字體函數
首先我們是在設置字體時的需要獲取到系統的所有字體樣式,
通過以下函數實現:
//獲取系統字體
private void FormSon_Load(object sender, EventArgs e)
{
//窗體加載時要加載的字體
InstalledFontCollection MyFontStaly = new InstalledFontCollection();
//獲取InstalledFontCollection對象的數據
FontFamily[] ff = MyFontStaly.Families;
//定義一個新的ArrayList數組列表
ArrayList list = new ArrayList();
//獲取到字體數組的列表的長度
int count = ff.Length;
for (int i = 0; i < count; i++)
{
//獲取到字體數組的字體的名字
string FontName = ff[i].Name;
//將字體保存在字體控件中
toolStripComboBox_fonyStaly.Items.Add(FontName);
}
}
字體空間函數
在獲取到系統可以設置的所有字體樣式之後,就是我們在點擊字體時,字體變化的控件了,在這裏我們需要在改變字體索引的控件中進行設置,
函數如下:
//改變字體的索引
private void toolStripComboBox_fonyStaly_SelectedIndexChanged(object sender, EventArgs e)
{
//接收當前字體框的文本
string fontname = toolStripComboBox_fonyStaly.Text;
//接收當前字號框的數值
float fontsize = float.Parse(toolStripComboBox_fontSize.Text);
textBox_Text.Font = new Font(fontname, fontsize);
}
字號空間函數
設置完成字體控件的屬性之後,就是字號屬性了,與設置字體控件的思路相似,我們同樣需要先獲取到改變字號的索引,函數如下:
//改變字號的索引
private void toolStripComboBox_fontSize_SelectedIndexChanged(object sender, EventArgs e)
{
//接收當前字體框的文本
string fontname = toolStripComboBox_fonyStaly.Text;
//接收當前字號框的數值
float fontsize = float.Parse(toolStripComboBox_fontSize.Text);
textBox_Text.Font = new Font(fontname, fontsize);
}
在字號發生變化時,我們需要將文本框中的內容的字號進行改變,這個時候就需要我們在相應的函數中進行設置:
//當字號發生改變時
private void toolStripComboBox_fontSize_TextChanged(object sender, EventArgs e)
{
//接收當前字體框的文本
string fontname = toolStripComboBox_fonyStaly.Text;
//接收當前字號框的數值
float fontsize = float.Parse(toolStripComboBox_fontSize.Text);
textBox_Text.Font = new Font(fontname, fontsize);
}
加粗控件函數
//加粗按鈕
private void toolStripButton_over_Click(object sender, EventArgs e)
{
//點擊加粗按鈕,字體加粗,加粗是點擊按鈕取消加粗
//如果目前處於未加粗狀態,點擊進行加粗
if (textBox_Text.Font.Bold == false)
{
textBox_Text.Font = new Font(textBox_Text.Font, FontStyle.Bold);
}
//如果當前處於加粗狀態,點擊取消加粗
else
{
textBox_Text.Font = new Font(textBox_Text.Font, FontStyle.Regular);
}
}
傾斜控件函數
//傾斜按鈕
private void toolStripButton_slanr_Click(object sender, EventArgs e)
{
if (textBox_Text.Font.Italic == false)
{
textBox_Text.Font = new Font(textBox_Text.Font, FontStyle.Italic);
}
else
{
textBox_Text.Font = new Font(textBox_Text.Font, FontStyle.Regular);
}
}
保存控件函數
在做保存控件的時候,我們需要考慮到一點,就是我們所保存的文件信息,是否是新建的文本框,如我們是新建的記事本,則在保存時則需要選擇保存路徑和文件名,如果我們是對原有的文件進行二次編輯,則我們在點擊保存按鈕時只需要進行保存即可,無需重新選擇文件的保存路徑。
函數代碼如下:
//保存按鈕
private void toolStripButton_save_Click(object sender, EventArgs e)
{
//創建一個篩選器
saveFileDialog1.Filter = ("文本文檔(*,txt)|*.txt");
// 判斷如果當前文本框不爲空,則進行保存
if (textBox_Text.Text.Trim() != "")
{
//如果記事本文件是新的,則選擇路徑保存
if (this.Text == "記事本")
{
//保存文件到用戶的指定目錄下
//判斷用戶是保存還是取消
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//獲取用戶選擇的文件及路徑
string path = saveFileDialog1.FileName;
//保存文件到指定路徑
StreamWriter sw = new StreamWriter(path, false);
sw.WriteLine(textBox_Text.Text.Trim());
//在窗體上方顯示路徑
this.Text = path;
//清空緩存
sw.Flush();
sw.Close();
}
}
//如果是已經打開的文件,則直接進行保存
else
{
//保存文件到用戶的指定目錄下
//獲取用戶選擇的文件及路徑
string path = this.Text;
//保存文件到指定路徑
StreamWriter sw = new StreamWriter(path, false);
sw.WriteLine(textBox_Text.Text.Trim());
sw.Flush();
sw.Close();
}
}
//如果爲空,則進行消息框提示
else
{
MessageBox.Show("當前文本框爲空!\n不可進行保存!", "警告");
}
}
打開文件控件函數:
在進行文件的打開操作時,我們需要對所打開的文件進行篩選,只要求打開txt格式的文本文件即可。
實現函數如下:
//打開文件
private void toolStripButton_open_Click(object sender, EventArgs e)
{
//篩選一個打開文件
openFileDialog1.Filter = ("文本文檔(*,txt)|*.txt");
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
string path = openFileDialog1.FileName;
StreamReader sr = new StreamReader(path, Encoding.UTF8);
string text = sr.ReadToEnd();
//在文本框上方顯示路徑
this.Text = path;
textBox_Text.Text = text;
sr.Close();
}
}
新建文本控件函數
在點擊新建文本之後,我們需要將原來編輯的內容進行清空並且重新建立編輯。
函數如下:
//新建文本
private void toolStripButton1_Click(object sender, EventArgs e)
{
this.Text = "記事本";
textBox_Text.Text = "";
toolStripTextBox1.Text = "";
}
窗體關閉控件函數
在我們的文本被修改之後,如果用戶點擊關閉按鈕,這個時候就需要對用戶進行提示,如果用戶選擇關閉,則進行記事本文本框的關閉操作,並且不會進行保存,如果用戶點擊了否,則重新回到編輯頁面進行編輯。
函數如下:
///窗體關閉時
private void FormSon_FormClosing(object sender, FormClosingEventArgs e)
{
//如果文件已經被修改,則進行提示
if (toolStripTextBox1.Text == "文本已修改")
{
DialogResult dr = MessageBox.Show("文本已經修改!是否繼續退出?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
//如果用戶選擇是,則退出
if (dr == DialogResult.Yes)
{
this.Dispose();
}
//如果用戶選擇否,則返回頁面
else
{
e.Cancel = true;
}
}
}
在以上這些函數完成之後,我們的記事本文本編輯窗口就完成了,看一下效果:
.
主控頁面父窗體
接下來就是承載記事本編輯窗口的父窗體了。
在父窗體中需要包括的控件有記事本的新建、關閉、全部關閉、退出等。
新建記事本
設置新建記事本控件屬性的時候,我們只需要調用我們剛剛完成的記事本子窗體即可。
函數如下:
//新建
private void ToolStripMenuItem_newfile_Click(object sender, EventArgs e)
{
//定義一個變量接收子窗體
FormSon son = new FormSon();
//定義子窗體的父窗體
son.MdiParent = this;
//顯示子窗體
son.Show();
}
關閉窗體
關閉窗體時,我們所關閉的是當前處於最前方的活躍的窗體。
函數如下:
//關閉窗體
private void ToolStripMenuItem_closefile_Click(object sender, EventArgs e)
{
//接收當前窗體
Form form = this.ActiveMdiChild;
//關閉當前窗體
form.Close();
}
關閉全部窗體
點擊關閉全部窗體時,我們會將已經打開的所有記事本窗體全部關閉。
函數如下:
//關閉全部窗體
private void ToolStripMenuItem_closeall_Click(object sender, EventArgs e)
{
//循環遍歷當前已經打開的所有窗體的集合
foreach (Form form in this.MdiChildren)
{
Form frm = this.ActiveMdiChild;
frm.Close();
}
}
退出控件
最後一個需要設置的是退出,點擊時會將記事本窗體整體關閉,因此,我們只需要將當前打開的窗體關閉即可。
函數如下:
//退出
private void ToolStripMenuItem_quit_Click(object sender, EventArgs e)
{
this.Close();
}
設置完父窗體之後,記事本的整體開發就完成了,現在看一下整體效果。
覺得不錯記得點贊關注大灰狼喲!
可以點擊此處下載“開發源碼”,或者關注大灰狼的微信公衆號 “灰狼洞主” 回覆“C#記事本”即可獲取完整源碼!
大灰狼陪你一起進步!