記事本
如何使用Visual C# 2010設計一個Windows應用程序——記事本,學習,可以進一步掌握MenuStrip(菜單)、ToolStrip(工具欄)、RichTextBox(高級文本框)和StatusStrip(狀態欄控件)等控件的使用,以及如何使用CommonDialog(公共對話框)實現對文本的存取、格式設置等操作。
記事本簡介
本章介紹的記事本,實現了Windows自帶的記事本的部分功能外,並且還可以任意更改字體的字體類型、大小和顏色,並在狀態欄中顯示時間。為了方便用戶的操作,還在程序的窗體上放置了一個工具欄。
本章介紹的記事本程序具有文件的新建、打開、保存功能;文字的復制、粘貼、刪除功能;字體類型、格式的設置功能;查看日期時間等功能,並且用戶可以根據需要顯示或者隱藏工具欄和狀態欄。
接下來將詳細的介紹記事本程序的設計與實現的步驟和方法。
記事本界面設計
新建一個Windows應用程序,並命名為"Notepad"。本節介紹記事本程序的界面設計以及界面上各控件的屬性設置。
界面設計
新建好"Notepad"項目后,定位到記事本程序的窗體設計器窗口,然后依次在窗體上放置以下控件(各1個):
(1)MenuStrip(菜單控件)。
(2)ToolStrip(工具欄控件)。
(3)RichTextBox(多格式文本框控件)。
(4)StatusStrip(狀態欄控件)。
(5)OpenFileDialog(打開對話框)。
(6)SaveFileDialog(保存對話框)。
(7)FontDialog(字體對話框)。
(8)Timer(計時器控件)。
最終的用戶界面如圖17-2所示(設置好屬性后),其中MenuStrip控件、ToolStrip控件、StatusStrip控件、OpenFileDialog對話框、SaveFileDialog對話框、FontDialog對話框和Timer控件顯示在窗體設計器下方的組件板上。

圖17-2 記事本用戶界面
屬性設置
本小節將介紹窗體、菜單控件、工具欄控件、多格式文本框控件和狀態欄控件的屬性設置,下面首先來看一下窗體的屬性設置。
窗體的屬性設置
首先在【解決方案資源管理器】中將默認的窗體"Form1.cs"重命名為"frmNotepad.cs",然后再設置窗體的其他屬性,如表17-1所示。
表17-1 窗體的屬性設置
| 控件類型 |
控件名稱 |
屬性 |
設置結果 |
| Form |
Form1 |
Name |
frmNotepad |
| Text |
記事本 |
||
| StartPosition |
CenterScreen |
||
| Size |
600, 450 |
MenuStrip的屬性設置
將菜單控件MenuStrip的Name屬性設為"mnusNotepad",按照第6章介紹的方法設計好下拉菜單,它共有【文件(F)】、【編輯(E)】、【格式(O)】、【查看(V)】和【幫助(H)】5個下拉子菜單,各子菜單如圖17-3所示。

圖17-3 記事本的菜單
下面用表格的形式給出各子菜單及其菜單項的屬性設置。【文件】菜單用於完成新建、打開、保存文件等功能,【文件(F)】菜單的屬性設置如表17-2所示。
表17-2 【文件(F)】菜單
| Text屬性 |
Name屬性 |
ShortcutKeys屬性 |
ShowShortcutKeys屬性 |
| 文件(&F) |
tsmiFile |
None |
- |
| 新建(&N) |
tsmiNew |
Ctrl+N |
True |
| 打開(&O) |
tsmiOpen |
Ctrl+O |
True |
| 保存(&S) |
tsmiSave |
Ctrl+S |
True |
| 另存為(&A) |
tsmiSaveAs |
None |
- |
| 分隔符 |
|||
| 退出(&X) |
tsmiClose |
None |
- |
【編輯】菜單用於完成撤銷編輯操作、復制、剪切和粘貼等功能,【編輯(E)】菜單的屬性設置如表17-3所示。
表17-3 【編輯(E)】菜單
| Text屬性 |
Name屬性 |
ShortcutKeys屬性 |
ShowShortcutKeys屬性 |
| 編輯(&E) |
tsmiEdit |
None |
- |
| 撤銷(&U) |
tsmiUndo |
Ctrl+Z |
True |
| 分隔符 |
|||
| 復制(&C) |
tsmiCopy |
Ctrl+C |
True |
| 剪切(&T) |
tsmiCut |
Ctrl+X |
True |
| 粘貼(&P) |
tsmiPaste |
Ctrl+V |
True |
| 分隔符 |
|||
| 全選(&A) |
tsmiSelectAll |
Ctrl+A |
True |
| 日期(&D) |
tsmiDate |
F5 |
True |
【編輯】菜單用於設置記事本中文本內容的格式,如字體和是否自動換行,【格式(O)】菜單的屬性設置如表17-4所示。
表17-4 【格式(O)】菜單
| Text屬性 |
Name屬性 |
Check屬性 |
| 格式(&O) |
tsmiFormat |
False |
| 自動換行(&W) |
tsmiAuto |
True |
| 字體(&F) |
tsmiFont |
False |
【編輯】菜單用於設置記事本程序界面中是否顯示工具欄和狀態欄,【查看(V)】菜單的屬性設置如表17-5所示。
表17-5 【查看(V)】菜單
| Text屬性 |
Name屬性 |
Checked屬性 |
| 查看(&V) |
tsmiView |
False |
| 工具欄(&T) |
tsmiToolStrip |
True |
| 狀態欄(&S) |
tsmiStatusStrip |
True |
本章介紹的記事本操作比較簡單,因此沒有設計詳細的幫助文檔,【幫助】菜單僅有一個菜單項,用戶單擊該菜單項彈出一個Windows窗體,顯示記事本的一些如版本號的相關信息,【幫助(H)】菜單的屬性設置如表17-6所示。
表17-6 【幫助(H)】菜單
| Text屬性 |
Name屬性 |
| 幫助(&H) |
tsmiHelp |
| 關於記事本(&A) |
tsmiAbout |
ToolStrip的屬性設置
首先將工具欄控件ToolStrip的Name屬性設為"tlsNotepad",打開其屬性窗口,然后單擊屬性
右邊的
按鈕,打開【項集合編輯器】,在下拉列表中選擇默認的【Button】,依次添加9個Button並重命名,再在下拉列表中選擇【Separator】,添加兩個分隔符,並上移至適當的位置,按照表17-2所示的信息設置好各子項的屬性后,如圖17-4所示。

圖17-4 【項集合編輯器】對話框
從上圖中可以看出,一共添加了9個按鈕和2個分隔符,設置各子項的屬性如表17-7所示。
表17-7 各子項的屬性設置
| Name屬性 |
ToolTipText屬性 |
| tsbNew |
新建 |
| tsbOpen |
打開 |
| tsbSave |
保存 |
| ToolStripSeparatorA |
說明:工具欄中按鈕之間的分隔符 |
| tsbCopy |
復制 |
| tsbCut |
剪切 |
| tsbPaste |
粘貼 |
| tsbUndo |
撤銷 |
| ToolStripSeparatorB |
說明:工具欄中按鈕之間的分隔符 |
| tsbFont |
字體 |
| tsbAbout |
關於記事本 |
說明:設置工具欄中各子項ToolTipText屬性的方法為:選中某子項后,拉動右邊的滾動條,找到ToolTipText屬性,修改其文本內容即可,如圖17-5所示。

圖17-5 設置ToolTipText屬性
接下來為工具欄中的按鈕設置不同的圖片,選擇【新建】(tsbNew)按鈕,在右邊屬性窗口中找到
屬性,然后單擊右邊的
按鈕設置為標准的文本新建圖標(該圖標可以在項目文件夾中的"圖標"文件夾中找到);按同樣的方法設置其他按鈕的Image屬性,效果如圖17-2所示。
說明:因為記事本程序工具欄中使用的按鈕都是非常常見的,因此也可以在窗體的工具欄中單擊右鍵(或者在窗體設計器下方的組件板上右鍵單擊
圖標),然后在彈出的菜單中選擇【插入標准項】菜單項,這時可以看到工具欄中添加了一些標准的工具,如圖17-6所示。

圖17-6 標准工具
接下來根據程序本身的需要,對添加的標准工具子項進行增加和刪除,在設置好各子項的屬性即可。
RichTextBox的屬性設置
添加一個RichTextBox控件,將控件的大小調整接近窗體的邊緣,並將其Name屬性設為"rtxtNotepad",Anchor屬性選擇"Top,Bottom,Left,Right",這樣當窗體大小改變時,RichTextBox控件的大小也會跟着改變,如圖17-7所示。

圖17-7 Anchor屬性
StatusStrip的屬性設置
添加StatusStrip控件,將其Name屬性設為"stsNotepad",將Dock屬性設為"Bottom"再將Anchor屬性設為"Bottom,Left,Right"。然后單擊
右邊的
按鈕,打開【項集合編輯器】對話框,如圖17-8所示。

圖17-8 【項集合編輯器】窗口
下拉列表中保留默認的選擇"StatusLabel",然后單擊【添加】按鈕,依次添加2個StatusLabel,並分別命名為"tssLbl1"和"tssLbl2",再將tssLbl1的Text屬性設為"就緒", tssLbl2的Text屬性設為"顯示日期、時間"。
OpenFileDialog的屬性設置
當用戶單擊記事本的【文件】→【打開】菜單項時,使用打開對話框OpenFileDialog打開文件。OpenFileDialog控件的Name屬性為"odlgNotepad",Filter屬性設為"RTF文件|*.rtf|所有文件|*.*"。
SaveFileDialog的屬性設置
當用戶單擊記事本的【文件】→【保存】(或【另存為】)菜單項時,使用保存對話框SaveFileDialog保存文件。SaveFileDialog控件的Name屬性為"sdlgNotepad",FileName屬性改為"無標題",Filter屬性設為"RTF文件|*.rtf"。
FontDialog的屬性設置
當用戶單擊記事本的【格式】→【字體】菜單項時,使用字體對話框FontDialog設置文本字體。FontDialog控件的Name屬性為"fdlgNotepad"。
Timer的屬性設置
本章介紹的記事本在狀態欄中顯示了時鍾,這就需要使用一個Timer控件來實現。Timer控件的Name屬性設為"tmrNotepad",Enabled屬性設為"True",Interval屬性設為"1000",表示1秒種觸發一次Tick事件,即1秒鍾改變一次時鍾。
設置好所有的屬性后,最終的用戶界面如圖17-2所示。到此,用戶界面設計完畢,接下來介紹具體的實現過程及源代碼的編寫。
編寫程序代碼
首先在代碼的通用段聲明以下兩個公共變量,他們都是布爾型的,"b"用於判斷文件是新建的還是從磁盤打開的,"s"用於判斷文件是否被保存。
//*************************************************************************
/* 布爾變量b用於判斷文件是新建的還是從磁盤打開的,
true表示文件是從磁盤打開的,false表示文件是新建的,默認值為false*/
bool b = false;
/* 布爾變量s用於判斷文件件是否被保存,
true表示文件是已經被保存了,false表示文件未被保存,默認值為true*/
bool s = true;
//*************************************************************************
接下來介紹多格式文本框(rtxtNotepad)、菜單(mnusNotepad)、工具欄(tlsNotepad)、計時器(tmrNotepad)對象的程序代碼。
多格式文本框代碼
當多格式文本框中的文本發生改變后,應當設置布爾變量"s"的值為false,表示文件未保存,因此編寫多格式文本框的TextChanged事件代碼如下:
//*************************************************************************
// 多格式文本框的TextChanged事件代碼
//*************************************************************************
private void rtxtNotepad_TextChanged(object sender, EventArgs e)
{
// 文本被修改后,設置s為false,表示文件未保存
s = false;
}
//*************************************************************************
//*************************************************************************
菜單代碼
在本章介紹的記事本程序中,幾乎所有的功能都是通過菜單來實現的,本小節將介紹各菜單項的單擊事件代碼,
【文件(F)】菜單
【文件(F)】菜單的功能是完成文件的新建、打開、保存、另存為功能,以及退出記事本程序,下面對各個菜單項的源代碼進行詳細的說明。
(1) 【新建(N)】菜單項
單擊該菜單項時新建一個空白文檔,首先應該判斷文件是從磁盤打開的還是新建的,若從磁盤打開則將前面定義的變量(b)設為"true",否則設為"false"。這樣做可以根據這個變量對文件進行相應的操作。並且每次保存文件后,都要將前面定義的變量(s)設為"true",表示文件已經被保存。
單擊新建菜單時,如果當前文件是從磁盤打開的,並且已經過修改,則要按OpenFileDialog控件的路徑來保存文件。
如果是新建的文件且內容不為空,則需要用SaveFileDialog控件來保存文件,【新建(N)】菜單項的代碼如下:
//*************************************************************************
// 【新建】菜單代碼
//*************************************************************************
private void tsmiNew_Click(object sender, EventArgs e)
{
// 判斷當前文件是否從磁盤打開,或者新建時文檔不為空,並且文件未被保存
if (b == true || rtxtNotepad.Text.Trim() != "")
{
// 若文件未保存
if (s == false)
{
string result;
result = MessageBox.Show("文件尚未保存,是否保存?",
"保存文件", MessageBoxButtons.YesNoCancel).ToString();
switch (result)
{
case "Yes":
// 若文件是從磁盤打開的
if (b == true)
{
// 按文件打開的路徑保存文件
rtxtNotepad.SaveFile(odlgNotepad.FileName);
}
// 若文件不是從磁盤打開的
else if (sdlgNotepad.ShowDialog() == DialogResult.OK)
{
rtxtNotepad.SaveFile(sdlgNotepad.FileName);
}
s = true;
rtxtNotepad.Text = "";
break;
case "No":
b = false;
rtxtNotepad.Text = "";
break;
}
}
}
}
//*************************************************************************
//*************************************************************************
(2) 【打開(O)】菜單項
單擊該菜單項時,如果是要從磁盤或其他設備打開"*.rtf"文件,同樣要作出判斷,所不同的是判斷后用OpenFileDialog控件打開文件,並且每次保存文件后,都要將前面定義的變量(s)設為"true",表示文件已經被保存。代碼如下:
//*************************************************************************
// 【打開】菜單代碼
//*************************************************************************
private void tsmiOpen_Click(object sender, EventArgs e)
{
if (b == true || rtxtNotepad.Text.Trim() != "")
{
if (s == false)
{
string result;
result = MessageBox.Show("文件尚未保存,是否保存?",
"保存文件", MessageBoxButtons.YesNoCancel).ToString();
switch (result)
{
case "Yes":
if (b == true)
{
rtxtNotepad.SaveFile(odlgNotepad.FileName);
}
else if (sdlgNotepad.ShowDialog() == DialogResult.OK)
{
rtxtNotepad.SaveFile(sdlgNotepad.FileName);
}
s = true;
break;
case "No":
b = false;
rtxtNotepad.Text = "";
break;
}
}
}
odlgNotepad.RestoreDirectory = true;
if ((odlgNotepad.ShowDialog() == DialogResult.OK) && odlgNotepad.FileName != "")
{
rtxtNotepad.LoadFile(odlgNotepad.FileName);
b = true;
}
s = true;
}
//*************************************************************************
//*************************************************************************
(3) 【保存(S)】菜單項
單擊此菜單項保存文本框的內容,需要判斷該文件是從磁盤打開還是新建的,如果是從磁盤打開的,則要判斷是否有更改,只有有更改時才進行保存操作,否則不作任何處理。如果是新建的文檔就調用SaveFileDialog控件保存文件,然后把bool變量b改為"true",同時把SaveFileDialog控件的文件路徑賦給OpenFileDialog控件,這樣下次打開文件時,文件路徑默認為剛剛保存文件的路徑,並且每次保存文件后,都要將前面定義的變量(s)設為"true",表示文件已經被保存。代碼如下:
//*************************************************************************
// 【保存】菜單代碼
//*************************************************************************
private void tsmiSave_Click(object sender, EventArgs e)
{
// 若文件從磁盤打開並且修改了其內容
if (b == true && rtxtNotepad.Modified == true)
{
rtxtNotepad.SaveFile(odlgNotepad.FileName);
s = true;
}
else if (b == false && rtxtNotepad.Text.Trim() != "" &&
sdlgNotepad.ShowDialog() == DialogResult.OK)
{
rtxtNotepad.SaveFile(sdlgNotepad.FileName);
s = true;
b = true;
odlgNotepad.FileName = sdlgNotepad.FileName;
}
}
//*************************************************************************
//*************************************************************************
(4) 【另存為(A)】菜單項
將文件另存為后,要將前面定義的變量(s)設為"true",表示文件已經被保存。本菜單項的代碼如下:
//*************************************************************************
// 【另存為】菜單代碼
//*************************************************************************
private void tsmiSaveAs_Click(object sender, EventArgs e)
{
if (sdlgNotepad.ShowDialog() == DialogResult.OK)
{
rtxtNotepad.SaveFile(sdlgNotepad.FileName);
s = true;
}
}
//*************************************************************************
//*************************************************************************
(5) 【退出(X)】菜單項
本菜單項的功能是退出記事本程序,代碼如下:
//*************************************************************************
// 【退出】菜單代碼
//*************************************************************************
private void tsmiClose_Click(object sender, EventArgs e)
{
Application.Exit();
}
//*************************************************************************
//*************************************************************************
【編輯(E)】菜單
【編輯(E)】菜單用於完成撤銷(撤銷最近一次對文本框的編輯操作)、復制(復制選中的文本內容)、剪切(剪切選中的文本內容)、粘貼(粘貼剪貼板中的內容)、全選(選中多格式文本框中所有的內容)以及將當前日期追加至文本文件的功能。【編輯(E)】菜單各菜單項的單擊事件代碼如下:
//*************************************************************************
// 【編輯】菜單各菜單項的單擊代碼
//*************************************************************************
// 【撤銷】菜單代碼
private void tsmiUndo_Click(object sender, EventArgs e)
{
rtxtNotepad.Undo();
}
// 【復制】菜單代碼
private void tsmiCopy_Click(object sender, EventArgs e)
{
rtxtNotepad.Copy();
}
// 【剪切】菜單代碼
private void tsmiCut_Click(object sender, EventArgs e)
{
rtxtNotepad.Cut();
}
// 【粘貼】菜單代碼
private void tsmiPaste_Click(object sender, EventArgs e)
{
rtxtNotepad.Paste();
}
// 【全選】菜單代碼
private void tsmiSelectAll_Click(object sender, EventArgs e)
{
rtxtNotepad.SelectAll();
}
// 【日期】菜單代碼
private void tsmiDate_Click(object sender, EventArgs e)
{
rtxtNotepad.AppendText(System.DateTime.Now.ToString());
}
//*************************************************************************
//*************************************************************************
【格式(O)】菜單
【格式(O)】菜單用於設置打開或新建的文本內容是否自動換行,以及設置字體的格式功能。
(1) 【自動換行(W)】菜單項
此菜單項的Checked屬性默認為"True",文本內容按照文本框的寬度自動換行,否則只按段落標記換行,【自動換行(W)】菜單項的代碼如下:
//*************************************************************************
// 【自動換行】菜單代碼
//*************************************************************************
private void tsmiAuto_Click(object sender, EventArgs e)
{
if (tsmiAuto.Checked == false)
{
tsmiAuto.Checked = true; // 選中該菜單項
rtxtNotepad.WordWrap = true; // 設置為自動換行
}
else
{
tsmiAuto.Checked = false;
rtxtNotepad.WordWrap = false;
}
}
//*************************************************************************
//*************************************************************************
(2) 【字體(F)】菜單項
單擊此菜單項時,彈出字體對話框以調整選擇內容的字體、顏色等屬性。因此需要使用前面添加的FontDialog控件來實現。【字體(F)】菜單項的單擊事件代碼如下:
//*************************************************************************
// 【字體】菜單代碼
//*************************************************************************
private void tsmiFont_Click(object sender, EventArgs e)
{
fdlgNotepad.ShowColor = true;
if (fdlgNotepad.ShowDialog() == DialogResult.OK)
{
rtxtNotepad.SelectionColor = fdlgNotepad.Color;
rtxtNotepad.SelectionFont = fdlgNotepad.Font;
}
}
//*************************************************************************
//*************************************************************************
【查看(V)】菜單
【查看(V)】菜單用於設置記事本上是否顯示工具欄和狀態欄,這兩個菜單項默認情況下是被選中的,可以通過單擊相應的菜單項設置不同的顯示效果。
(1) 【工具欄(T)】菜單項
該菜單項用於控制工具欄的顯示和隱藏,默認狀態下顯示工具欄,當隱藏時應當修改多格式文本框的位置和高度。代碼如下:
//*************************************************************************
// 【工具欄】菜單代碼
//*************************************************************************
private void tsmiToolStrip_Click(object sender, EventArgs e)
{
Point point;
if (tsmiToolStrip.Checked == true)
{
// 隱藏工具欄時,把坐標設為(0,24),因為菜單的高度為24
point = new Point(0, 24);
tsmiToolStrip.Checked = false;
tlsNotepad.Visible = false;
// 設置多格式文本框左上角位置
rtxtNotepad.Location = point;
// 隱藏工具欄后,增加文本框高度
rtxtNotepad.Height += tlsNotepad.Height;
}
else
{
/* 顯示工具欄時,多格式文本框左上角位置的位置為(0,49),
因為工具欄的高度為25,加上菜單的高度24后為49 */
point = new Point(0, 49);
tsmiToolStrip.Checked = true;
tlsNotepad.Visible = true;
rtxtNotepad.Location = point;
rtxtNotepad.Height -= tlsNotepad.Height;
}
}
//*************************************************************************
//*************************************************************************
(2) 【狀態欄(S)】菜單項
該菜單項用於控制狀態欄的顯示和隱藏,默認狀態下顯示狀態欄,當隱藏時應當修改多格式文本框的高度。代碼如下:
//*************************************************************************
// 【狀態欄】菜單代碼
//*************************************************************************
private void tsmiStatusStrip_Click(object sender, EventArgs e)
{
if (tsmiStatusStrip.Checked == true)
{
tsmiStatusStrip.Checked = false;
stsNotepad.Visible = false;
rtxtNotepad.Height += stsNotepad.Height;
}
else
{
tsmiStatusStrip.Checked = true;
stsNotepad.Visible = true;
rtxtNotepad.Height -= stsNotepad.Height;
}
}
//*************************************************************************
//*************************************************************************
【幫助(H)】菜單
本菜單只有一個菜單項【關於記事本(A)】,該菜單項調用一個窗體(frmAbout)顯示本程序的一些相關信息。並用LinkLabel控件設置鏈接,通過它可以方便地給作者發送E-Mail。frmAbout窗體的設計將在下一小節(17.3.3 關於記事本)中詳細的介紹。
設計好frmAbout窗體后,為了顯示該窗體,需要編寫【關於記事本(A)】菜單項的單擊事件代碼如下:
//*************************************************************************
// 【關於記事本】菜單代碼
//*************************************************************************
private void tsmiAbout_Click(object sender, EventArgs e)
{
frmAbout ob_FrmAbout = new frmAbout();
ob_FrmAbout.Show();
}
//*************************************************************************
//*************************************************************************
關於記事本
接下來單擊Visual C#2010的【項目】→【添加Windows窗體】菜單項,添加一個名為"frmAbout"的窗體,如圖17-9所示。

圖17-9 添加Windows窗體
界面設計
然后給窗體"frmAbout"添加幾個Label、Button、LinkLabel和PictrueBox控件,按照表17-8給出的信息設置好屬性后的程序界面如圖17-10所示。

圖17-10 【關於】用戶界面
【關於記事本】窗體和窗體上各控件的屬性設置如表17-8所示。
表17-8 窗體和各控件的屬性
| 控件類型 |
控件名稱 |
屬性 |
設置結果 |
| Form |
Form2 |
Name |
frmAbout |
| Text |
關於記事本 |
||
| StartPosition |
CenterScreen |
||
| MaximizeBox |
False |
||
| AutoSizeMode |
GrowAndShrink |
||
| PictureBox |
PictureBox1 |
Image |
選擇記事本圖標文件 |
| Button |
Button1 |
Name |
btnOk |
| Text |
確定 |
||
| Label |
Label1 |
Text |
記事本 |
| Label2 |
Text |
版本號:1.0.0.0 |
|
| LinkLabel |
LinkLabel1 |
Name |
llblEMail |
| Text |
E-Mail:xlingyun@126.com |
||
| LinkArea |
7, 16 |
編寫代碼
本部分的代碼很簡單,單擊【確定】按鈕關閉本窗體。並且利用LinkLabel控件調用Windows的OutLook發送E-Mail。代碼如下:
//*************************************************************************
// 【關於記事本】代碼
//*************************************************************************
// 【確定】按鈕
private void btnOk_Click(object sender, EventArgs e)
{
this.Close();
}
// 使用LinkLabel發送電子郵件
private void llblEmail_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start("mailto:xlingyun@126.com");
}
//*************************************************************************
//*************************************************************************
工具欄代碼
工具欄提供了一些快捷按鈕,用來方便用戶的操作,用戶按下按鈕時相當於選擇了某個菜單項,用switch語句實現如下,雙擊工具欄的空白部位,編寫工具欄的ItemClicked事件代碼如下:
//*************************************************************************
// 工具欄的ItemClicked事件代碼
//*************************************************************************
private void tlsNotepad_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
int n;
// 變量n用來接收按下按鈕的索引號
n = tlsNotepad.Items.IndexOf(e.ClickedItem);
switch (n)
{
case 0:
tsmiNew_Click(sender, e);
break;
case 1:
tsmiOpen_Click(sender, e);
break;
case 2:
tsmiSave_Click(sender, e);
break;
case 4:
tsmiCopy_Click(sender, e);
break;
case 5:
tsmiCut_Click(sender, e);
break;
case 6:
tsmiPaste_Click(sender, e);
break;
case 7:
tsmiUndo_Click(sender, e);
break;
case 9:
tsmiFont_Click(sender, e);
break;
case 10:
tsmiAbout_Click(sender, e);
break;
}
}
//*************************************************************************
// 工具欄的ItemClicked事件代碼
//*************************************************************************
計時器代碼
要在狀態欄的tssLbl2中顯示當前時間,需要編寫計時器控件的Tick事件(每秒鍾觸發一次)代碼如下:
//*************************************************************************
// 計時器控件的Tick事件代碼
//*************************************************************************
private void tmrNotepad_Tick(object sender, EventArgs e)
{
tssLbl2.Text = System.DateTime.Now.ToString();
}
//*************************************************************************
//*************************************************************************
窗體代碼
在改變窗體大小時(例如最大化窗口或使用鼠標改變窗口大小),為了使狀態欄中的標簽也隨之改變其寬度,應當編寫窗體的SizeChanged事件代碼如下:
//*************************************************************************
// 窗體的的SizeChanged事件代碼
//*************************************************************************
private void frmNotepad_SizeChanged(object sender, EventArgs e)
{
frmNotepad ob_frmNotepad = new frmNotepad();
tssLbl1.Width = this.Width / 2 - 12;
tssLbl2.Width = tssLbl1.Width;
}
//*************************************************************************
//*************************************************************************
指定項目圖標
在第5章介紹窗體Form的Icon屬性時介紹過,通過Icon屬性可以更改窗體左上角(即標題欄左邊)的默認圖標
。首先設置兩個窗體(frmNotepad和frmAbout)的Icon屬性為指定的記事本圖標(該圖標可以在本書的源代碼文件中找到)。
細心的讀者還可以發現,創建並生成一個項目后,在項目文件夾的"bin"文件夾中,有一個名為"Debug"的文件夾,該文件夾中有一個與項目同名的可執行文件,如生成本章介紹的記事本應用程序后,會生成一個名為"Notepad"的可執行文件,讀者可以打開"Notepad"項目的"bin"文件夾中的"Debug"的文件夾查看,如作者的"Debug"文件夾如圖17-11所示。

圖17-11 "Debug"文件夾
使用"Notepad"可執行文件可以打開本章設計的記事本程序,而不需要在Visual C# 2008的環境下運行。
可以看到,"Notepad"可執行文件的圖標是系統默認的圖標,有的時候,讀者希望更改成特別的或者有一定意義的個性化圖標。下面以本章介紹的記事本程序為例介紹一種指定項目圖標的方法,使用該方法可以更改生成的可執行文件的圖標。
指定記事本程序項目圖標的具體方法和步驟如下:
(1)首先在Visual C# 2008環境下選擇【項目】→【Notepad屬性】菜單項(Notepad即為項目的名稱,該菜單項一般為【項目】子菜單的最后一個菜單項),將切換到如圖17-12所示的Notepad屬性頁面。

圖17-12 Notepad屬性頁
(2)在彈出的默認頁面中的【資源】→【圖標】部分單擊右邊的
按鈕,然后選擇記事本圖標(該圖標可以在本書的源代碼文件中找到),這時的Notepad屬性頁默認的系統圖標
被更換成了
,如圖17-13所示。

圖17-13 更換系統圖標
(3)更換完項目圖標后,保存文件,再次查看"Notepad"項目的"bin"文件夾中的"Debug"的文件夾,如圖17-14所示。可以看到,"Notepad"可執行文件的圖標被更換成了指定的圖標。

圖17-14 更換項目圖標后的"Debug"文件夾
運行記事本程序
編寫完程序代碼,並設置好系統圖標后,雙擊打開"Debug"文件夾中的可執行文件Notepad(也可以按下鍵盤的【F5】鍵),運行程序,查看運行效果。圖17-15為保存文件時彈出的保存文件對話框的操作界面。

圖17-15 保存文件
選中多格式文本框中全部和文本內容后,可以使用【字體】菜單項(或者使用工具欄中的【字體】按鈕),可以修改被選中文本的字體格式,如圖17-16為修改字體("第17章 記事本")格式和顏色的操作界面。

圖17-16 修改字體格式和顏色
單擊【查看】子菜單中的【工具欄】和【狀態欄】菜單項可以顯示或隱藏工具欄和狀態欄
