01-Form窗體

Windows應(yīng)用程序也稱為WinForm應(yīng)用程序,通常包含一個或多個窗體梆惯,窗體中又包含了多種控件备韧,如按鈕、文本框等痪枫。

基于可視化的窗體和控件织堂,用戶能夠較好的與應(yīng)用程序進行交互。

開發(fā)Windows應(yīng)用程序奶陈,推薦使用微軟的Visual Studio集成開發(fā)工具易阳,它提供了帶有拖放控件功能的可視化設(shè)計器,實現(xiàn)了所見即所吃粒。

0001.PNG

一潦俺、創(chuàng)建第一個Windows Form應(yīng)用程序

功能需求如下圖,點擊第一張圖片的按鈕徐勃,程序切換成第二張圖的狀態(tài)事示,在左側(cè)顯示Hello World!


0002.PNG

實現(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)閉的確定取消效果:

0005.PNG

//制作窗體關(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窗體,如下圖:

0004.PNG

多文檔界面(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;
}

四、娛樂一下:無法被拒絕的表白

功能需求如下:


0036.PNG

(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)樊卓。


0036.PNG

(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)用程序篮赢。

案例:

制作一個登陸窗體而柑,點擊登錄按鈕即直接打開程序另外一個窗體(此處跳過省略驗證用戶名密碼的驗證)文捶,并將登錄窗體隱藏起來。


0050.PNG

0051.PNG

登錄按鈕代碼:

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)用程序退出柴灯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市费尽,隨后出現(xiàn)的幾起案子赠群,更是在濱河造成了極大的恐慌,老刑警劉巖旱幼,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件查描,死亡現(xiàn)場離奇詭異,居然都是意外死亡柏卤,警方通過查閱死者的電腦和手機冬三,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缘缚,“玉大人勾笆,你說我怎么就攤上這事∶ψ疲” “怎么了匠襟?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長该园。 經(jīng)常有香客問我酸舍,道長,這世上最難降的妖魔是什么里初? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任啃勉,我火速辦了婚禮,結(jié)果婚禮上双妨,老公的妹妹穿的比我還像新娘淮阐。我一直安慰自己叮阅,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布泣特。 她就那樣靜靜地躺著浩姥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪状您。 梳的紋絲不亂的頭發(fā)上勒叠,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音膏孟,去河邊找鬼眯分。 笑死,一個胖子當著我的面吹牛柒桑,可吹牛的內(nèi)容都是我干的弊决。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼魁淳,長吁一口氣:“原來是場噩夢啊……” “哼飘诗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起先改,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤疚察,失蹤者是張志新(化名)和其女友劉穎蒸走,沒想到半個月后仇奶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡比驻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年该溯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片别惦。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡狈茉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掸掸,到底是詐尸還是另有隱情氯庆,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布扰付,位于F島的核電站堤撵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏羽莺。R本人自食惡果不足惜实昨,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盐固。 院中可真熱鬧荒给,春花似錦丈挟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挑辆,卻和暖如春桐绒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背之拨。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工茉继, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚀乔。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓烁竭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吉挣。 傳聞我的和親對象是個殘疾皇子派撕,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一、窗體 1.常用屬性(1)Name屬性:用來獲取或設(shè)置窗體的名稱睬魂,在應(yīng)用程序中可通過Name屬性來引用窗體终吼。(2...
    五維思考閱讀 1,135評論 0 1
  • 1、窗體 1氯哮、常用屬性 (1)Name屬性:用來獲取或設(shè)置窗體的名稱际跪,在應(yīng)用程序中可通過Name屬性來引用窗體。 ...
    Moment__格調(diào)閱讀 4,548評論 0 11
  • 1喉钢、常用屬性 Name屬性:用來獲取或設(shè)置窗體的名稱姆打,在應(yīng)用程序中可通過Name屬性來引用窗體。 WindowSt...
    五維思考閱讀 1,046評論 0 0
  • 模擬題1: https://ks.wjx.top/jq/40059499.aspx 選擇題(針對下列題目肠虽,選擇符合...
    程序媛_閱讀 1,179評論 1 0
  • 創(chuàng)建非矩形窗體的過程有兩個要素:創(chuàng)建成形的窗體幔戏,并編寫某些編程邏輯的代碼以允許移動和關(guān)閉窗體。 第二個步驟是必要的...
    稚琦閱讀 495評論 0 2