Windows應(yīng)用程序也稱為WinForm應(yīng)用程序,通常包含一個或多個窗體梆惯,窗體中又包含了多種控件备韧,如按鈕、文本框等痪枫。
基于可視化的窗體和控件织堂,用戶能夠較好的與應(yīng)用程序進行交互。
開發(fā)Windows應(yīng)用程序奶陈,推薦使用微軟的Visual Studio集成開發(fā)工具易阳,它提供了帶有拖放控件功能的可視化設(shè)計器,實現(xiàn)了所見即所吃粒。
一潦俺、創(chuàng)建第一個Windows Form應(yīng)用程序
功能需求如下圖,點擊第一張圖片的按鈕徐勃,程序切換成第二張圖的狀態(tài)事示,在左側(cè)顯示Hello World!
實現(xiàn)步驟:
(1)新建項目,并且選擇語言為"C#",項目類型選擇為"windows 窗體應(yīng)用程序"僻肖。
(2)在工具箱中肖爵,分別找到Label控件和Button控件,分別拖入放置到窗體的左邊和右邊臀脏。
(3)將Label控件的Text屬性設(shè)置為空字符串劝堪,將Button控件的Text屬性設(shè)置為"顯示"。
(4)在按鈕上進行雙擊揉稚,切換到代碼視圖秒啦,編寫如下代碼:
private void button1_Click(object sender, EventArgs e)
{
//單擊按鈕,將自動調(diào)用本方法處理
this.Label1.Text = “Hello World!”;
}
(5)選擇"調(diào)試--》開始執(zhí)行"菜單運行程序搀玖。
二余境、Form窗體
Form窗體是Windows應(yīng)用程序的基本單元。
Form窗體不僅是一個窗口灌诅,還是一個容器葛超,窗體內(nèi)可以放置各種控件來實現(xiàn)各種功能。
窗體的添加延塑,刪除操作均可以在資源管理器中進行管理绣张,通過鼠標右鍵進行操作。
(1)窗體的常用屬性如下:
Icon屬性:設(shè)置窗體圖標关带。
Text屬性:設(shè)置窗體標題侥涵。
MaximizeBox:禁用窗體最大化按鈕沼撕。
MinimizeBox:禁用窗體最小化按鈕。
FormBorderStyle屬性:設(shè)置窗體的邊框樣式(窗體是否固定也通過此屬性設(shè)置)芜飘。
StartPosition屬性:設(shè)置窗體首次出現(xiàn)的位置务豺。
WindowState屬性:設(shè)置窗體的初始可視狀態(tài)。
TopMost屬性:是否設(shè)置最前端窗口顯示嗦明。
BackColor屬性:設(shè)置窗體的背景顏色笼沥。
BackgroundImage屬性:設(shè)置窗體背景圖片。
BackgroundImageLayout屬性:背景圖片的布局方式娶牌。
ShowInTaskbar屬性:是否在任務(wù)欄顯示窗體奔浅。
(2)窗體的常用事件:
Load事件:窗體加載事件
Click事件:窗體單擊事件
FormClosing事件:窗體關(guān)閉事件(關(guān)閉前觸發(fā))
制作窗體關(guān)閉的確定取消效果:
//制作窗體關(guān)閉的是否確定詢問
//如果想窗體無法關(guān)閉,可以在代碼中直接編寫e.Cancel = true;
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("確定要關(guān)閉本窗體嗎诗良?","提示: ", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
//如果用戶選擇了“是”汹桦,繼續(xù)執(zhí)行關(guān)閉事件,關(guān)閉窗體
}
else
{
//如果用戶選擇了“否”鉴裹,取消窗體關(guān)閉事件
e.Cancel = true;
}
}
三舞骆、多窗體應(yīng)用
完整的Windows應(yīng)用程序通常具有多個業(yè)務(wù)模塊,不可能在一個窗體界面內(nèi)實現(xiàn)径荔。
實現(xiàn)這些業(yè)務(wù)模塊需要多個窗體界面督禽,在每個窗體界面中實現(xiàn)相應(yīng)的功能。
項目中有多個窗體時总处,從哪個窗體開始運行赂蠢?
從項目的啟動窗體開始運行
啟動窗體在Program類的Main()方法中使用Application.Run(窗體對象)進行設(shè)置
在多窗體應(yīng)用中,窗體間應(yīng)如何相互調(diào)用辨泳?
使用new關(guān)鍵字創(chuàng)建窗體對象
使用窗體對象.Show()或窗體對象.ShowDialog()彈出窗體
Show()與ShowDialog()的區(qū)別:
Show彈出的是非模式窗體虱岂,非模式窗體彈出時,仍能對其他窗體進行操作菠红。
ShowDialog彈出的是模式窗體第岖,模式窗體彈出時,無法對其他窗體進行操作试溯,直至模式窗體被關(guān)閉蔑滓。
多文檔界面MDI窗體,如下圖:
多文檔界面(MDI)的應(yīng)用程序有以下特點:
(1)每個應(yīng)用程序中只能有一個MDI父窗體遇绞,在父窗體中可以打開多個MDI子窗體键袱。
(2)任何MDI子窗體都只能在父窗體內(nèi)部區(qū)域活動。
(3)當關(guān)閉任何子窗體時摹闽,對其他打開的子窗體以及父窗體均沒有任何影響蹄咖。
(4)當關(guān)閉父窗體時,將關(guān)閉所有打開的子窗體付鹿。
實現(xiàn)MDI應(yīng)用程序澜汤,分為以下四個步驟:
(1)創(chuàng)建一個Windows應(yīng)用程序
(2)創(chuàng)建多個Form窗體
(3)設(shè)置MDI父窗體(設(shè)置父窗體IsMdiContainer屬性為true)
(4)設(shè)置并顯示子窗體(假設(shè)父窗體名為MainForm,兩個子窗體名為form1和form2),代碼如下:
private void MainForm_Load(object sender, EventArgs e)
{
//創(chuàng)建Form1窗體對象并顯示窗體
Form1 form1 = new Form1();
form1.Show();
//設(shè)置Form1窗體為MDI子窗體蚜迅,并置于MainForm父窗體容器內(nèi)
form1.MdiParent = this;
Form2 form2 = new Form2();
form2.Show();
form2.MdiParent = this;
}
四、娛樂一下:無法被拒絕的表白
功能需求如下:
(1)當用戶鼠標移動到按鈕上俊抵,如果移動到"是的"按鈕谁不,不做任務(wù)處理裸准,如果移動到"不是"按鈕枝哄,則把兩個按鈕的顯示文本進行互換轴咱。
(2)當用戶點擊右上角"關(guān)閉"按鈕的時候谤绳,提示"關(guān)閉窗口也改變不了你喜歡我的事實!",并且阻止窗體的關(guān)閉丈莺。
(3)當用戶點擊兩個按鈕中任意一個的時候扩氢,提示"就知道你喜歡我换衬!",并且退出程序院喜。
實現(xiàn)步驟:
(1)創(chuàng)建窗體亡蓉,調(diào)整至合適大小晕翠,選擇一個適合的icon圖標喷舀。
(2)設(shè)置窗體的MaximizeBox和MinimizeBox屬性為false,去掉窗體最大化淋肾,最小化按鈕硫麻。
(3)拖入控件,進行界面繪制(其中第一個按鈕name=bt1,第二個按鈕name=bt2)樊卓。
(4)在窗體的FormClosing事件中編寫代碼拿愧,阻止用戶關(guān)閉窗體:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//判斷是否用戶點擊關(guān)閉按鈕
if(e.CloseReason == CloseReason.UserClosing)
{
MessageBox.Show("關(guān)閉窗口也改變不了你喜歡我的事實!");
e.Cancel = true;
}
}
(5)分別為兩個按鈕的MouseEnter事件編寫代碼碌尔,判斷按鈕上的文本浇辜,進行文本的切換。
private void bt1_MouseEnter(object sender, EventArgs e)
{
if (this.bt1.Text.Equals("不 是"))
{
this.bt1.Text = "是 的";
this.bt2.Text = "不 是";
}
}
private void bt2_MouseEnter(object sender, EventArgs e)
{
if (this.bt2.Text.Equals("不 是"))
{
this.bt2.Text = "是 的";
this.bt1.Text = "不 是";
}
}
(6)分別為兩個按鈕的Click事件編寫代碼唾戚,實現(xiàn)用戶點擊之后的提示效果柳洋,并且退出程序。
private void bt1_Click(object sender, EventArgs e)
{
MessageBox.Show("就知道你喜歡我叹坦!");
Application.Exit();
}
private void bt2_Click(object sender, EventArgs e)
{
MessageBox.Show("就知道你喜歡我熊镣!");
Application.Exit();
}
五、Close()和Application.Exit()
在單窗體項目中募书,調(diào)用Close()和Application.Exit()可以起到相同的效果绪囱,都是退出整個應(yīng)用程序,因為關(guān)閉啟動窗體即認為關(guān)閉了整個程序莹捡。
但是在多窗體項目中鬼吵,Close()代表關(guān)閉某個窗體,而Application.Exit()代表退出整個應(yīng)用程序篮赢。
案例:
制作一個登陸窗體而柑,點擊登錄按鈕即直接打開程序另外一個窗體(此處跳過省略驗證用戶名密碼的驗證)文捶,并將登錄窗體隱藏起來。
登錄按鈕代碼:
FrmMain frm = new FrmMain();
frm.Show();
this.Hide();
問題:按照此種方式進行編碼媒咳,雖然可以實現(xiàn)效果粹排,但是當我們點擊第二個彈出來的窗體的關(guān)閉按鈕,我們會認為我們自己關(guān)閉了整個應(yīng)用程序涩澡,但是實際上應(yīng)用程序仍然在計算機后臺在運行顽耳,在Windows資源管理器中能夠查看的到,因為登錄窗體作為啟動窗體妙同,只是隱藏了射富,并沒有關(guān)閉,所以應(yīng)用程序并沒有退出粥帚。
為了解決此問題胰耗,我們可以在登錄之后的第二個窗體的FormClosed事件中添加代碼:
Application.Exit();
即表示,當我關(guān)閉登錄之后彈出的窗體之后芒涡,將整個應(yīng)用程序退出柴灯。