C#實現(xiàn)聊天窗體以及抖動
本文實例為大家分享了C#實現(xiàn)聊天窗體以及抖動的具體代碼,供大家參考,具體內(nèi)容如下
一、聊天窗體案例
1、聊天窗體的要求?
(1)由兩個文本框組以及兩個按鈕組成(一個只讀框,一個輸入框與取消按鈕,一個發(fā)送按鈕)
(2)只讀框就是只讀,并且沒有焦點,并且消息發(fā)送多了以后會自動往下滾動,并且有滾動條
(3)輸入框就是有焦點,可以輸入消息
(4)取消按鈕就是按下按鈕后輸入框中的內(nèi)容消失
(5)發(fā)送按鈕就是點擊或者按下Enter鍵后發(fā)送輸入框中的內(nèi)容
2、C#如何實現(xiàn)
(1)將窗體居中(2種方法)
①使用CenterToScreen()這個方法
this.CenterToScreen();//使窗體再當(dāng)前顯示器中居中
②使用公式
要想使窗體居中,就必須計算窗體左邊緣與容器工作區(qū)左邊緣之間距離以及控件上邊緣與容器工作區(qū)上邊緣之間的距離
this.Left = Screen.PrimaryScreen.WorkingArea.Width / 2 - this.Width/2; //控件左邊緣與容器工作區(qū)左邊緣之間的距離=顯示器工作區(qū)域的寬度/2-控件的寬度/2 this.Top = Screen.PrimaryScreen.WorkingArea.Height / 2 - this.Height/2; //控件行編譯與容器工作區(qū)上邊緣之間的距離=顯示器工作區(qū)域的高度/2-控件的高度/21
(2)給窗體一個名字,以及大小,背景顏色
this.Text = "與吳京正在聊天中....."; this.Size = new Size(680, 500); this.BackColor = Color.PowderBlue;
(3)插入只讀框textbox并設(shè)置大小,并且只讀
那么該如何設(shè)置大小呢,它的寬是可以拉動的,但是高不行,所以必須設(shè)置Multiline這個屬性才可以設(shè)置高度,然后,只讀的話就是ReadOnly這個屬性。
textBox1.Multiline = true;//設(shè)置可以多行顯示 textBox1.Size = new Size(630, 250); textBox1.ReadOnly = true;//設(shè)置控件中的文本內(nèi)容只讀
(4)插入輸入框textbox,并設(shè)置大小
textBox2.Multiline = true;//設(shè)置textbox2可以多行顯示 textBox2.Size = new Size(textBox1.Width, 100);
此時,我們發(fā)現(xiàn)一個問題,就是鼠標(biāo)的焦點跑到了只讀框中,所以此時就應(yīng)該使用TabIndex這個屬性來將鼠標(biāo)的默認(rèn)焦點給輸入框,它的值是0就是打開
textBox2.TabIndex = 0;//獲取textbox2的默認(rèn)焦點
(5)插入兩個按鈕,一個叫取消,一個叫發(fā)送,并且他們的大小都是一樣的,背景顏色和字體顏色也是一樣的
//buttom1的屬性 button1.Size = new Size(60, 30);//設(shè)置button1的寬為60像素高為30像素 button1.Text = "取消";//設(shè)置button1的文本內(nèi)容 button1.ForeColor = Color.White;//設(shè)置字體顏色 button1.BackColor = Color.MediumSeaGren;//設(shè)置背景顏色
//button2的屬性 button2.Size = new Size(button1.Width, button1.Height);//設(shè)置button2的寬和高與button1一樣 button2.Text = "發(fā)送"; button2.ForeColor = Color.White; button2.BackColor = Color.MediumSeaGreen;
(6)按下發(fā)送,輸入框中的內(nèi)容發(fā)送給了只讀框,并且輸入框中的內(nèi)容消失,此時,鼠標(biāo)的焦點還在輸入框中,但是按下空格發(fā)送或者直接發(fā)送,不能發(fā)送,并且鼠標(biāo)焦點還在,而且是在輸入框最左邊的位置。
①這里我們要用到if判斷它是不是空字符或者是空格,如果是就不發(fā)送,否則就發(fā)送,必須在發(fā)送按鈕下進(jìn)行。
string.IsNullOrWhiteSpace 表示指示指定的字符串是null、空還是僅由空白字符組成。
Focus() 表示獲取輸入后的焦點。
實現(xiàn)發(fā)送功能實則就是把輸入框中的內(nèi)容賦值給只讀框。
然后發(fā)送完后輸入框中的內(nèi)容消失,可以用空的字符串代替
if (string.IsNullOrWhiteSpace(textBox2.Text))//判斷textbox2中輸入的內(nèi)容是否為空或者空格 { textBox2.Focus();//獲取輸入焦點 textBox2.Text = "";//假如輸入空格就將textbox2中的內(nèi)容清空 } else { textBox1.Text+= "挪威的森林 2024415986" + DateTime.Now + "\r\n" + "\r\n" + textBox2.Text + "\r\n" + "\r\n"; textBox2.Text = "";//內(nèi)容發(fā)送給textbox1后清空textbox2中的內(nèi)容 } //+號表示鏈接上次發(fā)發(fā)送的內(nèi)容,"\r\n"表示換行
(7)此時,我們發(fā)現(xiàn)一個問題,就是當(dāng)只讀框中的內(nèi)容超出范圍后,它就不再顯示
那么,該如何解決這個問題呢?這里我們可以引入一個屬性和一個方法
①SelectionStart 表示獲取文本范圍的起始點 或者 Select來獲取文本范圍
②ScrollToCaret() 表示將控件內(nèi)容滾動到當(dāng)前插入符號位置
通過這兩行代碼就可以解決這個問題,必須在只讀框中寫
textBox1.SelectionStart = textBox1.TextLength;//獲取textbox1中的文本范圍的起始點 textBox1.ScrollToCaret();//將控件內(nèi)容滾動到插入符號位置
(8)按下發(fā)送后取消輸入框中的內(nèi)容
這個就可以用空的字符串來代替,但是必須在取消按鈕的事件當(dāng)中寫
//取消后觸發(fā)的事件 private void button1_Click(object sender, EventArgs e) { textBox2.Text = ""; }
(9)按下Enter鍵發(fā)送內(nèi)容
這里要使用到一個方法,AcceptButton這個屬性,但是這個屬性只有在窗體中才能找到。
AcceptButton 表示獲取或設(shè)置當(dāng)前用戶按Enter鍵時所單擊的窗體上的按鈕
this.AcceptButton = this.button2;//按下Enter鍵觸發(fā)button2中的事件
二、窗體抖動
1、窗體抖動的原理
實質(zhì)就是:窗體位置的改變和快速移動。
第一步:
使窗體在顯示器中居中,并設(shè)置窗體的文本
this.CenterToScreen();//使窗體在當(dāng)前顯示器中居中 this.Text = "抖一抖";
第二步:
插入按鈕,并設(shè)置按鈕的大小和文本內(nèi)容
this.button1.Size = new Size(80, 40); button1.Text = "抖一抖";
第三步:
就是設(shè)置窗體的位置了,那么它位置的改變就是從窗體居中后的位置左上角的位置開始順時針移動改變。
那么它改變的規(guī)律是什么?
是先從初始的位置(就是劇中后左上角的位置往右移動=》再往下=》往左=》往左=》往上=》往上=》往右=》往右=》往下=》往左。最終回到初始位置
要用到location這個屬性
但是,每次移動后都要讓他停留幾毫秒,所以,就要用到線程這個概念。
那么,什么是線程?
Thread線程是操作系統(tǒng)能夠進(jìn)行運算調(diào)度的最小單位,它被包涵在進(jìn)程之中,是行程中的實際運作單位。
Thread.Sleep(); 表示當(dāng)前線程掛起指定的毫秒數(shù)
Thread.Sleep(20);//線程控制20毫秒
但是,位置改變一圈后回到初始位置不是抖動,所以,必須使用for循環(huán)讓他多次移動來實現(xià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; using System.Threading.Tasks; using System.Windows.Forms; namespace 窗體抖動 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.CenterToScreen();//使窗體在當(dāng)前顯示器中居中 this.Text = "抖一抖"; this.button1.Size = new Size(80, 40); button1.Text = "抖一抖"; this.AcceptButton = this.button1; } private void Form1_douyidou(object sender, EventArgs e) { for (int i = 0; i < 2; i++) { //①往右 this.Location = new Point(this.Left + 10, this.Top); Thread.Sleep(20);//線程控制20毫秒 //②往下 this.Location = new Point(this.Left, this.Top + 10); Thread.Sleep(20); //③往左 this.Location = new Point(this.Left - 10, this.Top); Thread.Sleep(20); //④往左 this.Location = new Point(this.Left - 10, this.Top); Thread.Sleep(20); //⑤往上 this.Location = new Point(this.Left, this.Top - 10); Thread.Sleep(20); //⑥往上 this.Location = new Point(this.Left, this.Top - 10); Thread.Sleep(20); //⑦往右 this.Location = new Point(this.Left + 10, this.Top); Thread.Sleep(20); //⑧往右 this.Location = new Point(this.Left + 10, this.Top); Thread.Sleep(20); //⑨往下 this.Location = new Point(this.Left, this.Top + 10); Thread.Sleep(20); //十一往左 this.Location = new Point(this.Left - 10, this.Top); Thread.Sleep(20); } } } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c#獲取字符串寬度的示例代碼(字節(jié)數(shù)方法)
本篇文章主要介紹了c#獲取字符串寬度的示例代碼(字節(jié)數(shù)方法)。需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01C#調(diào)用OutLokk實現(xiàn)發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了如何利用C#調(diào)用OutLokk實現(xiàn)發(fā)送郵件的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12C#使用Socket發(fā)送和接收TCP數(shù)據(jù)實例
這篇文章主要介紹了C#使用Socket發(fā)送和接收TCP數(shù)據(jù)的實現(xiàn)方法,以實例的形式詳細(xì)講述了C#實現(xiàn)socket通信的完整實現(xiàn)過程,非常具有實用價值,需要的朋友可以參考下2014-10-10