C#+Winform記事本程序


記事本

  如何使用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 修改字體格式和顏色

單擊【查看】子菜單中的【工具欄】和【狀態欄】菜單項可以顯示或隱藏工具欄和狀態欄

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM