一、描述
本博客介紹如何使用Visual Studio 2019設(shè)計(jì)一個(gè)Windows應(yīng)用程序——記事本,通過學(xué)習(xí),可以進(jìn)一步掌握MenuStrip(菜單)、ToolStrip(工具欄)、RichTextBox(高級(jí)文本框)和StatusStrip(狀態(tài)欄控件)等控件的使用,以及如何使用CommonDialog(公共對(duì)話框)實(shí)現(xiàn)對(duì)文本的存取、格式設(shè)置等操作。(說明:所有代碼必須在英文狀態(tài)下使用!)
二、記事本簡(jiǎn)介
記事本是一種常用的軟件,在微軟的Windows中,自帶了一個(gè)記事本軟件,Windows 10下的記事本軟件如下圖所示。
三、記事本界面設(shè)計(jì)
新建一個(gè)Windows窗體應(yīng)用程序,并命名為“Notepad”
更改窗體名稱 單擊窗體, →右下角屬性→text 修改為“記事本”如圖所示
按下表設(shè)置剩下的窗體屬性
1)界面設(shè)計(jì)
新建好“Notepad”項(xiàng)目后,定位到記事本程序的窗體設(shè)計(jì)器窗口,然后依次在窗體上放置以下控件(各1個(gè)):
(1)MenuStrip(菜單控件)。
1.單擊窗體左邊會(huì)出現(xiàn)工具箱→ 找到menustrip →拖動(dòng)到窗體中
2.單擊菜單欄→右下角屬性→修改Name屬性為“mnusNotepad”
3.單擊 輸入【文件(F)】、【編輯(E)】、【格式(O)】、【查看(V)】和【幫助(H)】如圖所示
4.設(shè)置【文件(F)】、【編輯(E)】、【格式(O)】、【查看(V)】和【幫助(H)】的屬性→
單擊【文件(F)】、【編輯(E)】、【格式(O)】、【查看(V)】和【幫助(H)】找到對(duì)應(yīng)的屬性窗口,按照以下表格進(jìn)行設(shè)置
(2) ToolStrip(工具欄控件)。
1.單擊窗體左邊會(huì)出現(xiàn)工具箱→ 找到“ToolStrip” →拖動(dòng)到窗體中
2.單擊工具欄→右下角屬性→修改Name屬性為“tlsNotepad”
3.右擊工具欄→ 插入標(biāo)準(zhǔn)項(xiàng) 出現(xiàn)如圖所示
4.右擊工具欄→ 編輯項(xiàng) 可以看到我們的按鈕成員 在這里我們可以刪除或者增加,為了新手學(xué)習(xí),我們只設(shè)置幾個(gè)簡(jiǎn)單的功能(新建,打開,保存,剪切,粘貼,復(fù)制)。其它我們不再設(shè)置。
為了看起來直觀,這個(gè)我們不更改它們的Name屬性了。
(3) RichTextBox(多格式文本框控件)。
1.單擊窗體左邊會(huì)出現(xiàn)工具箱→ 找到“RichTextBox” →拖動(dòng)到窗體中
2.單擊工具欄→右下角屬性→修改Name屬性為“rtxtNotepad”
3.Anchor屬性選擇“Top,Bottom,Left,Right”,這樣當(dāng)窗體大小改變時(shí),RichTextBox控件的大小也會(huì)跟著改變,如圖所示。
(4) StatusStrip(狀態(tài)欄控件)。
1.添加StatusStrip控件,將其Name屬性設(shè)為“stsNotepad”,將Dock屬性設(shè)為“Bottom”再將Anchor屬性設(shè)為“Top, Left”。
2.然后單擊 右邊的 按鈕,打開【項(xiàng)集合編輯器】對(duì)話框。
下拉列表中保留默認(rèn)的選擇“StatusLabel”,然后單擊【添加】按鈕,依次添加2個(gè)StatusLabel,并分別命名為“tssLbl1”和“tssLbl2”,再將tssLbl1的Text屬性設(shè)為“就緒”, tssLbl2的Text屬性設(shè)為“顯示日期、時(shí)間”。
5) OpenFileDialog(打開對(duì)話框)。
從工具箱中找到OpenFileDialog直接拖入窗體中 單擊屬性
當(dāng)用戶單擊記事本的【文件】→【打開】菜單項(xiàng)時(shí),使用打開對(duì)話框OpenFileDialog打開文件。OpenFileDialog控件的Name屬性為“odlgNotepad”,F(xiàn)ilter屬性設(shè)為
RTF文件|.rtf|所有文件|.*
(6) SaveFileDialog(保存對(duì)話框)。
從工具箱中找到SaveFileDialog直接拖入窗體中 單擊屬性
當(dāng)用戶單擊記事本的【文件】→【保存】(或【另存為】)菜單項(xiàng)時(shí),使用保存對(duì)話框SaveFileDialog保存文件。SaveFileDialog控件的Name屬性為“sdlgNotepad”,F(xiàn)ileName屬性改為“無標(biāo)題”,F(xiàn)ilter屬性設(shè)為
RTF文件|*.rtf
(7) FontDialog(字體對(duì)話框)。
從工具箱中找到FontDialog直接拖入窗體中 單擊屬性
當(dāng)用戶單擊記事本的【格式】→【字體】菜單項(xiàng)時(shí),使用字體對(duì)話框FontDialog設(shè)置文本字體。FontDialog控件的Name屬性為“fdlgNotepad”。
(8) Timer(計(jì)時(shí)器控件)。
從工具箱中找到Timer直接拖入窗體中 單擊屬性
本章介紹的記事本在狀態(tài)欄中顯示了時(shí)鐘,這就需要使用一個(gè)Timer控件來實(shí)現(xiàn)。Timer控件的Name屬性設(shè)為“tmrNotepad”,Enabled(激活的可行的)屬性設(shè)為“True”,Interval(間隔,間距,幕間時(shí)間)屬性設(shè)為“1000”,表示1秒種觸發(fā)一次Tick事件,即1秒鐘改變一次時(shí)鐘。
最終設(shè)置界面如下圖所示到此,用戶界面設(shè)計(jì)完畢,接下來介紹具體的實(shí)現(xiàn)過程及源代碼的編寫。
關(guān)于記事本
接下來單擊【項(xiàng)目】→【添加Windows窗體】菜單項(xiàng),添加一個(gè)名為“frmAbout”的窗體,如圖所示。
界面設(shè)計(jì)
然后給窗體“frmAbout”添加幾個(gè)Label、Button、LinkLabel控件,如圖所示。
【關(guān)于記事本】窗體和窗體上各控件的屬性設(shè)置如表所示。
四、源代碼
namespace 記事本
{
public partial class frmNotepad : Form
{
bool b = false;
bool s = true;
public frmNotepad()
{
InitializeComponent();
}
private void NotePad_Load(object sender, EventArgs e)
{
}
private void rtxtNotePad_TextChanged(object sender, EventArgs e)
{
s = false;
}
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;
}
}
}
}
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;
}
private void tsmiSave_Click(object sender, EventArgs e)
{
// 若文件從磁盤打開并且修改了其內(nèi)容
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;
}
}
private void tsmiSaveAs_Click(object sender, EventArgs e)
{
if (sdlgNotePad.ShowDialog() == DialogResult.OK)
{
rtxtNotePad.SaveFile(sdlgNotePad.FileName);
s = true;
}
}
private void tsmiClose_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void tsmiUndo_Click(object sender, EventArgs e)
{
rtxtNotePad.Undo();//撤銷
}
private void tsmiCopy_Click(object sender, EventArgs e)
{
rtxtNotePad.Copy();//復(fù)制
}
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());//顯示當(dāng)前日期
}
private void tsmiAuto_Click(object sender, EventArgs e)
{
if (tsmiAuto.Checked == false)
{
tsmiAuto.Checked = true; //選中該菜單項(xiàng)
rtxtNotePad.WordWrap = true; //設(shè)置為自動(dòng)換行
}
else
{
tsmiAuto.Checked = false;
rtxtNotePad.WordWrap = false;
}
}
private void tsmiFont_Click(object sender, EventArgs e)
{
fdlgNotePad.ShowColor = true;
if (fdlgNotePad.ShowDialog() == DialogResult.OK)
{
rtxtNotePad.SelectionColor = fdlgNotePad.Color;
rtxtNotePad.SelectionFont = fdlgNotePad.Font;
}
}
private void tsmiToolStrip_Click(object sender, EventArgs e)
{
Point point;
if (tsmiToolStrip.Checked == true)
{
//隱藏工具欄時(shí),把坐標(biāo)設(shè)為(0,24),因?yàn)椴藛蔚母叨任?4
point = new Point(0, 24);
tsmiToolStrip.Checked = false;
tlsNotePad.Visible = false;
//設(shè)置多格式文本框左上角位置
rtxtNotePad.Location = point;
//隱藏工具欄后,增加文本框高度
rtxtNotePad.Height += tlsNotePad.Height;
}
else
{
/*顯示工具欄時(shí),多格式文本框左上角位置的位置為(0.49),
因?yàn)楣ぞ邫诘母叨葹?5,加上菜單的高度24后為49*/
point = new Point(0, 49);
tsmiToolStrip.Checked = true;
tlsNotePad.Visible = true;
rtxtNotePad.Location = point;
rtxtNotePad.Height += rtxtNotePad.Height;
}
}
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;
}
}
private void tsmiAbout_Click(object sender, EventArgs e)
{
frmAbout ob_FrmAbout = new frmAbout();
ob_FrmAbout.Show();
}
private void tlsNotePad_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
int n;
//變量n用來接收按下按鈕的索引號(hào)從0開始
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 3:
tsmiCopy_Click(sender,e);
break;*/
case 4:
tsmiCut_Click(sender, e);
break;
case 5:
tsmiPaste_Click(sender, e);
break;
/*case 6:
tsmiPaste_Click(sender,e);
break;*/
case 7:
tsmiAbout_Click(sender, e);
break;
}
}
private void tmrNotePad_Tick(object sender, EventArgs e)
{
tssLbl2.Text = System.DateTime.Now.ToString();
}
private void toolTip1_Popup(object sender, PopupEventArgs e)
{
}
private void toolStripMenuItem4_Click(object sender, EventArgs e)
{
}
private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
}
private void tsmiFile_Click(object sender, EventArgs e)
{
}
}
};
關(guān)于記事本
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 記事本
{
public partial class frmAbout : Form
{
public frmAbout()
{
InitializeComponent();
}
private void label1_Click(object sender, EventArgs e)
{
}
private void frmAbout_Load(object sender, EventArgs e)
{
}
//*************************************************************************
// 【關(guān)于記事本】代碼
//*************************************************************************
// 【確定】按鈕
private void btnOk_Click(object sender, EventArgs e)
{
this.Close();
}
// 使用LinkLabel打開郵件或者網(wǎng)頁
private void llblEmail_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start("http://www.baidu.com");
}
}
}
五、運(yùn)行結(jié)果
文章來源:http://www.zghlxwxcb.cn/news/detail-772829.html
六、源代碼
源碼文章來源地址http://www.zghlxwxcb.cn/news/detail-772829.html
到了這里,關(guān)于Windows應(yīng)用程序——記事本的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!