C#實現聊天窗體以及抖動

本文實例為大傢分享瞭C#實現聊天窗體以及抖動的具體代碼,供大傢參考,具體內容如下

一、聊天窗體案例

1、聊天窗體的要求?

(1)由兩個文本框組以及兩個按鈕組成(一個隻讀框,一個輸入框與取消按鈕,一個發送按鈕)

(2)隻讀框就是隻讀,並且沒有焦點,並且消息發送多瞭以後會自動往下滾動,並且有滾動條

(3)輸入框就是有焦點,可以輸入消息

(4)取消按鈕就是按下按鈕後輸入框中的內容消失

(5)發送按鈕就是點擊或者按下Enter鍵後發送輸入框中的內容

2、C#如何實現

(1)將窗體居中(2種方法)

①使用CenterToScreen()這個方法

this.CenterToScreen();//使窗體再當前顯示器中居中

②使用公式

要想使窗體居中,就必須計算窗體左邊緣與容器工作區左邊緣之間距離以及控件上邊緣與容器工作區上邊緣之間的距離

this.Left = Screen.PrimaryScreen.WorkingArea.Width / 2 - this.Width/2;
//控件左邊緣與容器工作區左邊緣之間的距離=顯示器工作區域的寬度/2-控件的寬度/2
this.Top = Screen.PrimaryScreen.WorkingArea.Height / 2 - this.Height/2;
//控件行編譯與容器工作區上邊緣之間的距離=顯示器工作區域的高度/2-控件的高度/21

(2)給窗體一個名字,以及大小,背景顏色

this.Text = "與吳京正在聊天中.....";
this.Size = new Size(680, 500);
this.BackColor = Color.PowderBlue;

(3)插入隻讀框textbox並設置大小,並且隻讀

那麼該如何設置大小呢,它的寬是可以拉動的,但是高不行,所以必須設置Multiline這個屬性才可以設置高度,然後,隻讀的話就是ReadOnly這個屬性。

textBox1.Multiline = true;//設置可以多行顯示
textBox1.Size = new Size(630, 250);
textBox1.ReadOnly = true;//設置控件中的文本內容隻讀

(4)插入輸入框textbox,並設置大小

textBox2.Multiline = true;//設置textbox2可以多行顯示
textBox2.Size = new Size(textBox1.Width, 100);

此時,我們發現一個問題,就是鼠標的焦點跑到瞭隻讀框中,所以此時就應該使用TabIndex這個屬性來將鼠標的默認焦點給輸入框,它的值是0就是打開

textBox2.TabIndex = 0;//獲取textbox2的默認焦點

(5)插入兩個按鈕,一個叫取消,一個叫發送,並且他們的大小都是一樣的,背景顏色和字體顏色也是一樣的

//buttom1的屬性
button1.Size = new Size(60, 30);//設置button1的寬為60像素高為30像素
button1.Text = "取消";//設置button1的文本內容
button1.ForeColor = Color.White;//設置字體顏色
button1.BackColor = Color.MediumSeaGren;//設置背景顏色
//button2的屬性
button2.Size = new Size(button1.Width, button1.Height);//設置button2的寬和高與button1一樣
button2.Text = "發送";
button2.ForeColor = Color.White;
button2.BackColor = Color.MediumSeaGreen;

(6)按下發送,輸入框中的內容發送給瞭隻讀框,並且輸入框中的內容消失,此時,鼠標的焦點還在輸入框中,但是按下空格發送或者直接發送,不能發送,並且鼠標焦點還在,而且是在輸入框最左邊的位置。

①這裡我們要用到if判斷它是不是空字符或者是空格,如果是就不發送,否則就發送,必須在發送按鈕下進行。

string.IsNullOrWhiteSpace 表示指示指定的字符串是null、空還是僅由空白字符組成。

Focus() 表示獲取輸入後的焦點。

實現發送功能實則就是把輸入框中的內容賦值給隻讀框。

然後發送完後輸入框中的內容消失,可以用空的字符串代替

if (string.IsNullOrWhiteSpace(textBox2.Text))//判斷textbox2中輸入的內容是否為空或者空格
        {

​            textBox2.Focus();//獲取輸入焦點
​            textBox2.Text = "";//假如輸入空格就將textbox2中的內容清空
​        }
​        else
​        {
​            textBox1.Text+= "挪威的森林 2024415986" + DateTime.Now + "\r\n" + "\r\n" + textBox2.Text + "\r\n" + "\r\n";
​            textBox2.Text = "";//內容發送給textbox1後清空textbox2中的內容
​        }
//+號表示鏈接上次發發送的內容,"\r\n"表示換行

(7)此時,我們發現一個問題,就是當隻讀框中的內容超出范圍後,它就不再顯示
那麼,該如何解決這個問題呢?這裡我們可以引入一個屬性和一個方法

①SelectionStart 表示獲取文本范圍的起始點 或者 Select來獲取文本范圍

②ScrollToCaret() 表示將控件內容滾動到當前插入符號位置

通過這兩行代碼就可以解決這個問題,必須在隻讀框中寫

textBox1.SelectionStart = textBox1.TextLength;//獲取textbox1中的文本范圍的起始點
textBox1.ScrollToCaret();//將控件內容滾動到插入符號位置

(8)按下發送後取消輸入框中的內容

這個就可以用空的字符串來代替,但是必須在取消按鈕的事件當中寫

//取消後觸發的事件
        private void button1_Click(object sender, EventArgs e)
        {
            textBox2.Text = "";
 }

(9)按下Enter鍵發送內容

這裡要使用到一個方法,AcceptButton這個屬性,但是這個屬性隻有在窗體中才能找到。

AcceptButton 表示獲取或設置當前用戶按Enter鍵時所單擊的窗體上的按鈕

this.AcceptButton = this.button2;//按下Enter鍵觸發button2中的事件

二、窗體抖動

1、窗體抖動的原理

實質就是:窗體位置的改變和快速移動。

第一步:

使窗體在顯示器中居中,並設置窗體的文本

this.CenterToScreen();//使窗體在當前顯示器中居中
this.Text = "抖一抖";

第二步:

插入按鈕,並設置按鈕的大小和文本內容

this.button1.Size = new Size(80, 40);
     button1.Text = "抖一抖";

第三步:

就是設置窗體的位置瞭,那麼它位置的改變就是從窗體居中後的位置左上角的位置開始順時針移動改變。

那麼它改變的規律是什麼?

是先從初始的位置(就是劇中後左上角的位置往右移動=》再往下=》往左=》往左=》往上=》往上=》往右=》往右=》往下=》往左。最終回到初始位置

要用到location這個屬性

但是,每次移動後都要讓他停留幾毫秒,所以,就要用到線程這個概念。

那麼,什麼是線程?

Thread線程是操作系統能夠進行運算調度的最小單位,它被包涵在進程之中,是行程中的實際運作單位。

Thread.Sleep(); 表示當前線程掛起指定的毫秒數

Thread.Sleep(20);//線程控制20毫秒

但是,位置改變一圈後回到初始位置不是抖動,所以,必須使用for循環讓他多次移動來實現抖動的效果

源碼如下:

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();//使窗體在當前顯示器中居中
​        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);
​        }

​    }
}

}

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: