C#實(shí)現(xiàn)聊天窗體以及抖動(dòng)
本文實(shí)例為大家分享了C#實(shí)現(xiàn)聊天窗體以及抖動(dòng)的具體代碼,供大家參考,具體內(nèi)容如下
一、聊天窗體案例
1、聊天窗體的要求?
(1)由兩個(gè)文本框組以及兩個(gè)按鈕組成(一個(gè)只讀框,一個(gè)輸入框與取消按鈕,一個(gè)發(fā)送按鈕)
(2)只讀框就是只讀,并且沒有焦點(diǎn),并且消息發(fā)送多了以后會(huì)自動(dòng)往下滾動(dòng),并且有滾動(dòng)條
(3)輸入框就是有焦點(diǎn),可以輸入消息
(4)取消按鈕就是按下按鈕后輸入框中的內(nèi)容消失
(5)發(fā)送按鈕就是點(diǎn)擊或者按下Enter鍵后發(fā)送輸入框中的內(nèi)容
2、C#如何實(shí)現(xiàn)
(1)將窗體居中(2種方法)
①使用CenterToScreen()這個(gè)方法
this.CenterToScreen();//使窗體再當(dāng)前顯示器中居中
②使用公式
要想使窗體居中,就必須計(jì)算窗體左邊緣與容器工作區(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)給窗體一個(gè)名字,以及大小,背景顏色
this.Text = "與吳京正在聊天中....."; this.Size = new Size(680, 500); this.BackColor = Color.PowderBlue;
(3)插入只讀框textbox并設(shè)置大小,并且只讀
那么該如何設(shè)置大小呢,它的寬是可以拉動(dòng)的,但是高不行,所以必須設(shè)置Multiline這個(gè)屬性才可以設(shè)置高度,然后,只讀的話就是ReadOnly這個(gè)屬性。
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);
此時(shí),我們發(fā)現(xiàn)一個(gè)問題,就是鼠標(biāo)的焦點(diǎn)跑到了只讀框中,所以此時(shí)就應(yīng)該使用TabIndex這個(gè)屬性來將鼠標(biāo)的默認(rèn)焦點(diǎn)給輸入框,它的值是0就是打開
textBox2.TabIndex = 0;//獲取textbox2的默認(rèn)焦點(diǎn)
(5)插入兩個(gè)按鈕,一個(gè)叫取消,一個(gè)叫發(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)容消失,此時(shí),鼠標(biāo)的焦點(diǎn)還在輸入框中,但是按下空格發(fā)送或者直接發(fā)送,不能發(fā)送,并且鼠標(biāo)焦點(diǎn)還在,而且是在輸入框最左邊的位置。
①這里我們要用到if判斷它是不是空字符或者是空格,如果是就不發(fā)送,否則就發(fā)送,必須在發(fā)送按鈕下進(jìn)行。
string.IsNullOrWhiteSpace 表示指示指定的字符串是null、空還是僅由空白字符組成。
Focus() 表示獲取輸入后的焦點(diǎn)。
實(shí)現(xiàn)發(fā)送功能實(shí)則就是把輸入框中的內(nèi)容賦值給只讀框。
然后發(fā)送完后輸入框中的內(nèi)容消失,可以用空的字符串代替
if (string.IsNullOrWhiteSpace(textBox2.Text))//判斷textbox2中輸入的內(nèi)容是否為空或者空格
{
textBox2.Focus();//獲取輸入焦點(diǎn)
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)容
}
//+號(hào)表示鏈接上次發(fā)發(fā)送的內(nèi)容,"\r\n"表示換行
(7)此時(shí),我們發(fā)現(xiàn)一個(gè)問題,就是當(dāng)只讀框中的內(nèi)容超出范圍后,它就不再顯示
那么,該如何解決這個(gè)問題呢?這里我們可以引入一個(gè)屬性和一個(gè)方法
①SelectionStart 表示獲取文本范圍的起始點(diǎn) 或者 Select來獲取文本范圍
②ScrollToCaret() 表示將控件內(nèi)容滾動(dòng)到當(dāng)前插入符號(hào)位置
通過這兩行代碼就可以解決這個(gè)問題,必須在只讀框中寫
textBox1.SelectionStart = textBox1.TextLength;//獲取textbox1中的文本范圍的起始點(diǎn) textBox1.ScrollToCaret();//將控件內(nèi)容滾動(dòng)到插入符號(hào)位置
(8)按下發(fā)送后取消輸入框中的內(nèi)容
這個(gè)就可以用空的字符串來代替,但是必須在取消按鈕的事件當(dāng)中寫
//取消后觸發(fā)的事件
private void button1_Click(object sender, EventArgs e)
{
textBox2.Text = "";
}
(9)按下Enter鍵發(fā)送內(nèi)容
這里要使用到一個(gè)方法,AcceptButton這個(gè)屬性,但是這個(gè)屬性只有在窗體中才能找到。
AcceptButton 表示獲取或設(shè)置當(dāng)前用戶按Enter鍵時(shí)所單擊的窗體上的按鈕
this.AcceptButton = this.button2;//按下Enter鍵觸發(fā)button2中的事件
二、窗體抖動(dòng)
1、窗體抖動(dòng)的原理
實(shí)質(zhì)就是:窗體位置的改變和快速移動(dòng)。
第一步:
使窗體在顯示器中居中,并設(shè)置窗體的文本
this.CenterToScreen();//使窗體在當(dāng)前顯示器中居中 this.Text = "抖一抖";
第二步:
插入按鈕,并設(shè)置按鈕的大小和文本內(nèi)容
this.button1.Size = new Size(80, 40);
button1.Text = "抖一抖";
第三步:
就是設(shè)置窗體的位置了,那么它位置的改變就是從窗體居中后的位置左上角的位置開始順時(shí)針移動(dòng)改變。
那么它改變的規(guī)律是什么?
是先從初始的位置(就是劇中后左上角的位置往右移動(dòng)=》再往下=》往左=》往左=》往上=》往上=》往右=》往右=》往下=》往左。最終回到初始位置
要用到location這個(gè)屬性
但是,每次移動(dòng)后都要讓他停留幾毫秒,所以,就要用到線程這個(gè)概念。
那么,什么是線程?
Thread線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,它被包涵在進(jìn)程之中,是行程中的實(shí)際運(yùn)作單位。
Thread.Sleep(); 表示當(dāng)前線程掛起指定的毫秒數(shù)
Thread.Sleep(20);//線程控制20毫秒
但是,位置改變一圈后回到初始位置不是抖動(dòng),所以,必須使用for循環(huán)讓他多次移動(dòng)來實(shí)現(xiàn)抖動(dòng)的效果
源碼如下:
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 窗體抖動(dòng)
{
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);
}
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C#實(shí)現(xiàn)簡(jiǎn)單的聊天窗體
- 分享一個(gè)C#編寫簡(jiǎn)單的聊天程序(詳細(xì)介紹)
- C#制作簡(jiǎn)單的多人在線即時(shí)交流聊天室
- C#聊天程序服務(wù)端與客戶端完整實(shí)例代碼
- 基于c#用Socket做一個(gè)局域網(wǎng)聊天工具
- c#多線程網(wǎng)絡(luò)聊天程序代碼分享(服務(wù)器端和客戶端)
- C#實(shí)現(xiàn)簡(jiǎn)單聊天程序的方法
- C#使用Socket實(shí)現(xiàn)局域網(wǎng)聊天
- C#基于UDP實(shí)現(xiàn)的P2P語音聊天工具
- C#使用Socket實(shí)現(xiàn)服務(wù)器與多個(gè)客戶端通信(簡(jiǎn)單的聊天系統(tǒng))
相關(guān)文章
C#通過WIN32 API實(shí)現(xiàn)嵌入程序窗體
這篇文章主要介紹了C#通過WIN32 API實(shí)現(xiàn)嵌入程序窗體的方法,涉及WIN32 API的調(diào)用及窗體的設(shè)計(jì),具有很好的借鑒價(jià)值,需要的朋友可以參考下2014-09-09
C# 系統(tǒng)全局的異常處理實(shí)現(xiàn)
在C#應(yīng)用程序中,異??赡茉谌魏蔚胤桨l(fā)生,本文主要介紹了C# 系統(tǒng)全局的異常處理實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
如何用WindowsForm給窗口添加一些簡(jiǎn)單的動(dòng)畫效果
這篇文章主要介紹了如何用WindowsForm給窗口添加一些簡(jiǎn)單的動(dòng)畫效果,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
C#定時(shí)器實(shí)現(xiàn)自動(dòng)執(zhí)行的方法
這篇文章主要介紹了C#定時(shí)器實(shí)現(xiàn)自動(dòng)執(zhí)行的方法,實(shí)例分析了C#定時(shí)器參數(shù)的設(shè)置及方法的調(diào)用與實(shí)現(xiàn),需要的朋友可以參考下2015-01-01
c#異步讀取數(shù)據(jù)庫與異步更新ui的代碼實(shí)現(xiàn)
這篇文章主要介紹了c#從數(shù)據(jù)庫里取得數(shù)據(jù)并異步更新ui的方法,大家參考使用吧2013-12-12

