有了創(chuàng)建一個(gè)Windows窗體應(yīng)用程序的經(jīng)驗(yàn),就可以開始嘗試運(yùn)用更多的控件實(shí)現(xiàn)更多豐富的功能界面。以下分享我基于項(xiàng)目Helloworld_WinForm使用常用C#Windows窗體控件實(shí)現(xiàn)一些小功能。
每一節(jié)標(biāo)題為所用到的控件,全文以實(shí)際制作過程為序編制。
WinForm窗體應(yīng)用程序開發(fā)步驟
1、創(chuàng)建窗體Form
項(xiàng)目創(chuàng)建時(shí)會(huì)默認(rèn)創(chuàng)建一個(gè)窗體,默認(rèn)為父窗體。
新建的其他窗體為子窗體,子窗體調(diào)用時(shí)會(huì)在父窗體中顯示。
項(xiàng)目創(chuàng)建方法見:Helloworld_WinForm,本文直接基于之前創(chuàng)建的項(xiàng)目搭建功能。
2、創(chuàng)建控件Control
控件顯示在工具箱中,通過雙擊或拖拽的方式顯示在當(dāng)前打開的設(shè)計(jì)窗口中,可在屬性欄修改其屬性。
3、指定布局Layout
根據(jù)應(yīng)用拖動(dòng)控件位置,或在屬性中調(diào)整坐標(biāo)等。
4、響應(yīng)事件Event
事件包括雙擊控件、按下鼠標(biāo)、向文本框輸入內(nèi)容等等,可以在控件屬性中點(diǎn)擊事件圖標(biāo)查看所有事件。
響應(yīng)是指發(fā)生事件后,觸發(fā)的操作,通常以代碼的形式實(shí)現(xiàn)功能。
描述還是比較抽象,建議動(dòng)手實(shí)踐。
常用控件實(shí)例
MenuStrip 菜單欄
新建MenuStrip控件,修改屬性如下
- Name:tools
- Text:工具
在工具下,繼續(xù)新建TextBox,修改它們屬性的Text。
如果在子窗體中也加入Menustrip,則需在父窗體的Menustrip屬性中按下圖所示修改,否則子窗體菜單欄不會(huì)顯示出來,默認(rèn)二者菜單欄合并。
父窗體:
子窗體:
richTextBox富文本框
參考鏈接
在項(xiàng)目中右鍵添加子窗體,命名Text。
Anchor屬性選擇“Top,Bottom,Left,Right”,這樣當(dāng)窗體大小改變時(shí),RichTextBox控件的大小也會(huì)跟著改變
新建 richTextBox控件。屬性BackColor改為ControlLightLiight,ReadOnly改為True。修改Dock屬性為Fill,使控件鋪滿窗口。
將父窗體屬性中的IsMdiContainer改為true。
并雙擊父窗體菜單欄的“新建”,編輯程序,使點(diǎn)擊新建時(shí)打開子窗體。
private void toolStripTextBox3_Click(object sender, EventArgs e)
{
Text newMDIChild = new Helloworld_WinForm.Text();
// Set the Parent Form of the Child window.
newMDIChild.MdiParent = this;
// Display the new form.
newMDIChild.Show();
}
SaveFileDialog保存對(duì)話框
參考鏈接:c#保存textbox中的字符串到txt文件中
點(diǎn)擊記事本的【文件】→【保存】菜單項(xiàng)時(shí),使用SaveFileDialog保存文件。
用程序創(chuàng)建SaveFileDialog及修改屬性。
// 菜單欄中的保存按鈕。也可用Button
private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 新建SaveFileDialog,Name為saveFileDialog
SaveFileDialog saveFileDialog = new SaveFileDialog();
// 修改屬性,定義保存文件類型
saveFileDialog.Filter = "(*.txt)|*.txt|(*.*)|*.*|97-2003Word文檔|*.doc";
// 文件名是日期時(shí)間
saveFileDialog.FileName = "D:\\text\\" + DateTime.Now.ToString("yyyyMMddHHmm") + ".txt";
// 對(duì)話框打開
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
// 新建數(shù)據(jù)流
StreamWriter streamWriter = new StreamWriter(saveFileDialog.FileName, true);
// 寫入數(shù)據(jù)
streamWriter.Write(this.richTextBox1.Text);
// 關(guān)閉當(dāng)前streamWriter對(duì)象和基礎(chǔ)流
streamWriter.Close();
}
}
// 富文本,Name為richTextBox1
private void richTextBox1_TextChanged_1(object sender, EventArgs e)
{
}
上述程序啟動(dòng)后,點(diǎn)擊保存,會(huì)彈出保存窗口,如下:
可以選擇保存為txt或doc格式。
試一試效果:
FontDialog字體對(duì)話框
繼續(xù)增加菜單欄選項(xiàng):字體。其屬性Name為字體ToolStripMenuItem。
雙擊字體,編寫代碼,新建字體對(duì)話框,并將設(shè)置的字體賦給富文本中的Text。
private void 字體ToolStripMenuItem_Click(object sender, EventArgs e)
{
FontDialog fontDialog = new FontDialog();
if(fontDialog.ShowDialog() == DialogResult.OK)
{
richTextBox1.SelectionFont = fontDialog.Font;
}
}
試一下效果:
先設(shè)置字體,再輸入文本。也可在輸入文本后,選中需要修改字體的文本,再點(diǎn)擊字體修改。
richTextBox的屬性WordWrap
增加菜單欄選項(xiàng):自動(dòng)換行。其Name屬性為自動(dòng)換行ToolStripMenuItem。
自動(dòng)換行的Checked屬性默認(rèn)為“False”,文本內(nèi)容按照文本框的寬度自動(dòng)換行,否則只按段落標(biāo)記換行。
可以修改富文本屬性WordWrap,以決定是否默認(rèn)自動(dòng)換行,此處為默認(rèn)自動(dòng)換行:
將自動(dòng)換行選項(xiàng)的默認(rèn)狀態(tài)Checked改為被點(diǎn)擊的True狀態(tài):
雙擊自動(dòng)換行,編輯代碼如下:
private void 自動(dòng)換行ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 判斷自動(dòng)換行狀態(tài)標(biāo)記
if(自動(dòng)換行ToolStripMenuItem.Checked == false)
{
// 被按下后更新狀態(tài)
自動(dòng)換行ToolStripMenuItem.Checked = true;
// 自動(dòng)換行
richTextBox1.WordWrap = true;
}
else
{
// 被按下后更新狀態(tài)
自動(dòng)換行ToolStripMenuItem.Checked = false;
// 不自動(dòng)換行
richTextBox1.WordWrap = false;
}
}
實(shí)現(xiàn)的效果就是默認(rèn)自動(dòng)換行,點(diǎn)擊自動(dòng)換行后取消自動(dòng)換行,再次點(diǎn)擊則變?yōu)樽詣?dòng)換行。
ColorDialog顏色對(duì)話框
利用ColorDialog修改字體顏色。
增加菜單欄字體顏色,其Name屬性為字體顏色ToolStripMenuItem。
雙擊它編輯代碼如下:
// 第一種
private void 字體顏色ToolStripMenuItem_Click(object sender, EventArgs e)
{
ColorDialog colorDialog = new ColorDialog();
if (colorDialog.ShowDialog() == DialogResult.OK)
{
richTextBox1.SelectionColor = colorDialog.Color;
}
}
試一下效果:
若先設(shè)置字體顏色,再輸入文本,則此前輸入的文本不會(huì)變化,變更只適用于此后輸入的文本。
也可在輸入文本后,選中需要修改字體顏色的文本,再點(diǎn)擊字體顏色修改,變更適用于選中的文本。
修改為橙色:
如果在未選中文本時(shí)修改字體顏色,要將所有文本字體顏色同時(shí)修改,則可以這樣寫:
選中文本再修改顏色,只會(huì)修改選中文本的顏色。
// 第二種
private void 字體顏色ToolStripMenuItem_Click(object sender, EventArgs e)
{
ColorDialog colorDialog = new ColorDialog();
if (this.colorDialog1.ShowDialog() == DialogResult.OK)
{
if (this.richTextBox1.SelectedText == "") // 若未選中文本,則將設(shè)置顏色適用于所有文本
{
this.richTextBox1.ForeColor = this.colorDialog1.Color;
}
else
{
this.richTextBox1.SelectionColor = this.colorDialog1.Color;
}
}
}
Timer計(jì)時(shí)器
參考鏈接
在項(xiàng)目中新建Windows窗體,命名為Clock.cs。
在父窗體中,雙擊菜單欄Clock,編寫代碼,添加子窗體Clock。屬性BackColor改為ControlLightLiight,ReadOnly改為True。
代碼如下:
private void toolStripTextBox2_Click(object sender, EventArgs e)
{
Clock newMDIChild = new Helloworld_WinForm.Clock();
// Set the Parent Form of the Child window.
newMDIChild.MdiParent = this;
// Display the new form.
newMDIChild.Show();
}
在Clock窗體中,拖拽Label控件,Name為label1,修改屬性字體顏色為喜歡的字體。修改屬性Text為yyyy-MM-dd HH:mm:ss。
拖拽Timer計(jì)時(shí)器控件,Name為timer1,修改屬性Enable為True,Interval為1000。使能定時(shí),每1000ms執(zhí)行一次函數(shù)timer1_Tick中的內(nèi)容。
雙擊timer1,編寫代碼,使其顯示實(shí)時(shí)時(shí)間。
private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //年-月-日 小時(shí):分鐘:秒
}
其中,HH為24小時(shí)進(jìn)制,hh為12小時(shí)進(jìn)制。
讓Label文字居中的方法:設(shè)置Autosize的值為false,拉大這個(gè)label框的寬度,設(shè)置label屬性里的TextAlign為MiddleCenter,意思是讓框里的文字內(nèi)容居中。
啟動(dòng)后效果如下:每過一秒,時(shí)間更新一次。
PictureBox-如何加文字
參考鏈接
在父窗口的菜單欄工具中添加一項(xiàng):Panel。并添加子菜單 加水印 和 清屏。本節(jié)實(shí)現(xiàn)加水印的功能,后一節(jié)實(shí)現(xiàn)清屏。
從工具箱拖拽一個(gè)PictureBox控件到窗口,屬性Dock改為Fill。
屬性BackgroundImage可以上傳一個(gè)圖片,使PictureBox控件區(qū)域默認(rèn)顯示該圖片。
還有SizeMode屬性選Zoom,SizeMode屬性包含:
- Normal:圖片大小不變;
- strechImage:拉伸圖片適應(yīng)PictureBox(圖片會(huì)變形)
- AutoSize:PictureBox適應(yīng)圖片;
- CenterImage:圖片居中顯示;
- Zoom:圖片填充PictureBox(不變形)
雙擊“加水印”,編輯程序如下:實(shí)現(xiàn)將文字顯示在對(duì)應(yīng)坐標(biāo)。
private void 加水印ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 在pictureBox上創(chuàng)建畫圖板
Graphics g = pictureBox1.CreateGraphics();
// 設(shè)置字體的樣式
Font f = new Font("黑體", 24);
// 實(shí)例化一個(gè)實(shí)心畫刷,顏色是白色
SolidBrush brush = new SolidBrush(Color.White);
// 與左上角坐標(biāo)的距離
PointF point = new PointF(400, 300);
// 開始繪制
g.DrawString("From: Electrical_IT", f, brush, point);
}
啟動(dòng)運(yùn)行,點(diǎn)擊加水印,效果如下:
PictureBox-畫圖
參考鏈接:C#控件picturebox實(shí)現(xiàn)畫圖功能
C#控件畫圖方法
打開指定路徑圖片的方法
本部分實(shí)現(xiàn)鼠標(biāo)在PictureBox區(qū)域中使用鼠標(biāo)繪制的功能。
PictureBox控件屬性設(shè)置參考上一節(jié)。菜單欄也如上一節(jié)添加。
要實(shí)現(xiàn)繪圖功能,需要用到PictureBox的事件響應(yīng),位置在PictureBox的屬性框中,點(diǎn)擊PictureBox,點(diǎn)擊事件圖標(biāo)即可看到:
重命名事件MouseDown為drawstart,事件MouseMove為drawmove,事件MouseUp為drawstop。
每次命名后會(huì)自動(dòng)切換到代碼編輯界面。
修改代碼如下:
private void 清屏ToolStripMenuItem_Click(object sender, EventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
// 用原背景圖清屏
g.DrawImage(pictureBox1.BackgroundImage, 0, 0);
}
// 定義鼠標(biāo)繪制的終點(diǎn)(起點(diǎn)永遠(yuǎn)是鼠標(biāo)當(dāng)前坐標(biāo))
private Point endpoint;
// 繪制標(biāo)志
private static bool drawing = false;
private void drawstart(object sender, MouseEventArgs e)
{
// 創(chuàng)建終點(diǎn)
endpoint = new Point(e.X, e.Y);
// 鼠標(biāo)按下開始繪制
drawing = true;
}
private void drawstop(object sender, MouseEventArgs e)
{
// 鼠標(biāo)松開結(jié)束繪制
drawing = false;
}
private void drawmove(object sender, MouseEventArgs e)
{
// 鼠標(biāo)移動(dòng)進(jìn)行繪制,創(chuàng)建畫布
Graphics g = pictureBox1.CreateGraphics();
// 顯示時(shí)消除鋸齒
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
// 如果鼠標(biāo)按下的按鈕是左鍵
if(e.Button == MouseButtons.Left)
{
if(drawing)
{
// 當(dāng)前坐標(biāo)
Point currentpoint = new Point(e.X, e.Y);
// 用白藍(lán)色筆繪制連接p2和當(dāng)前坐標(biāo)的線
g.DrawLine(new Pen(Color.AliceBlue, 2), endpoint, currentpoint);
// 更新終點(diǎn)坐標(biāo)
endpoint.X = currentpoint.X;
endpoint.Y = currentpoint.Y;
}
}
}
用鼠標(biāo)畫一畫,繪制效果如下:
點(diǎn)擊清屏后效果如下:(清屏也會(huì)把水印清掉)
如果清屏想用白色清屏,參考以下代碼:
private void 清屏ToolStripMenuItem_Click(object sender, EventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
g.Clear(Color.White);
}
問題與解決
解決子窗體被父窗體控件擋住問題
上述實(shí)例先創(chuàng)建了子窗體Hello、Clock和Text,再在父窗體中添加了控件PictureBox。
啟動(dòng)后,點(diǎn)擊菜單欄Hello、Clock和文件新建時(shí),子窗體無法顯示在PictureBox控件前,原因是被父窗口的控件擋住了。
我的解決方法是在打開子窗體前,將父窗體中的控件PictureBox隱藏,點(diǎn)擊Panel后再顯示PictureBox控件。
隱藏:pictureBox1.Hide();
顯示:pictureBox1.Show();
首先將HelloWorld.cs中,菜單點(diǎn)擊事件的響應(yīng)程序里添加隱藏控件的函數(shù):
private void toolStripTextBox1_Click(object sender, EventArgs e)
{
Hello newMDIChild = new Helloworld_WinForm.Hello();
// Set the Parent Form of the Child window.
newMDIChild.MdiParent = this;
// Hide the pictureBox1
pictureBox1.Hide();
// Display the new form.
newMDIChild.Show();
}
private void toolStripTextBox3_Click(object sender, EventArgs e)
{
Text newMDIChild = new Helloworld_WinForm.Text();
// Set the Parent Form of the Child window.
newMDIChild.MdiParent = this;
//Hide the pictureBox1
pictureBox1.Hide();
// Display the new form.
newMDIChild.Show();
}
private void toolStripTextBox2_Click(object sender, EventArgs e)
{
Clock newMDIChild = new Helloworld_WinForm.Clock();
// Set the Parent Form of the Child window.
newMDIChild.MdiParent = this;
//Hide the pictureBox1
pictureBox1.Hide();
// Display the new form.
newMDIChild.Show();
}
其次,在點(diǎn)擊菜單中需要響應(yīng)主窗口控件pictureBox1的程序中,增加顯示控件函數(shù):
private void 加水印ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 設(shè)置字體的樣式
Font f = new Font("黑體", 24);
// 實(shí)例化一個(gè)實(shí)心畫刷,顏色是白色
SolidBrush brush = new SolidBrush(Color.White);
// 與左上角坐標(biāo)的距離
PointF point = new PointF(400, 300);
// 顯示pictureBox1控件
pictureBox1.Show();
// 在pictureBox上創(chuàng)建畫圖板
Graphics g = pictureBox1.CreateGraphics();
// 開始繪制
g.DrawString("From: Electrical_IT", f, brush, point);
}
private void 清屏ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 顯示pictureBox1控件
pictureBox1.Show();
Graphics g = pictureBox1.CreateGraphics();
// 用原背景圖清屏
g.DrawImage(pictureBox1.BackgroundImage, 0, 0);
}
測試后發(fā)現(xiàn)還一個(gè)問題:pictureBox1被隱藏后,點(diǎn)擊菜單中的加水印,會(huì)顯示pictureBox1控件背景,但不會(huì)顯示水印,還需要第二次點(diǎn)擊,才會(huì)顯示水印。不清楚為什么,還希望有大神評(píng)論指點(diǎn)。
另外,如果主窗口中控件非常多,不建議使用這種方式,建議將主窗口的控件放在Panel控件中,使子窗口的父類設(shè)置為Panel。參考鏈接
發(fā)布做好的程序
如果想將程序發(fā)給朋友玩一下,就需要發(fā)布。文章來源:http://www.zghlxwxcb.cn/news/detail-767665.html
首先,配置設(shè)置為Release、Any CPU。
找到生成,點(diǎn)擊發(fā)布。
根據(jù)發(fā)布向?qū)В付òl(fā)布的位置。
選擇用戶下載的方式,這里選從ROM。
選擇不檢查更新,并點(diǎn)擊完成。
等待片刻,就可以在路徑里找到setup.exe安裝包。雙擊運(yùn)行,就可以得到應(yīng)用配置文件夾和應(yīng)用程序。雙擊Helloworld_WinForm.application就可以運(yùn)行了。
如果想卸載,可以在控制面板的應(yīng)用中找到并卸載它。文章來源地址http://www.zghlxwxcb.cn/news/detail-767665.html
到了這里,關(guān)于C#實(shí)例:多功能Windows窗體應(yīng)用程序Helloworld_WinForm的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!