C#实现聊天窗体以及抖动
作者:御弟謌謌 发布时间:2021-06-07 10:40:50
本文实例为大家分享了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);
}
}
}
}
来源:https://blog.csdn.net/abraham_ly/article/details/105604765


猜你喜欢
- 应用场景有些时候项目中会用到很多路径,并且很可能多个路径在同一个根目录下,那为了方便配置的修改,达到只修改根目录即可达到一改全改的效果,此时
- 获得redis所有的key-value运行结果:redis配置文件需要序列化@Bean public RedisT
- 我们再用支付宝支付的时候,会从底部弹上来一个对话框,让我们选择支付方式等等,今天我们就来慢慢实现这个功能效果图实现主界面很简单,就是一个按钮
- 在使用线程池的时候,发现除了execute()方法可以执行任务外,还发现有一个方法submit()可以执行任务。submit()有3个参数不
- 一、Application是什么?Application类在每一次开发当中是我们都会遇到的,每一个APP都会有一个Application实例
- 加密代码using System;using System.IO;using System.Security.Cryptography;pu
- 本文实例讲述了C#使用iTextSharp设置PDF所有页面背景图功能的方法。分享给大家供大家参考。具体如下:在生成PDF 的时候,虽然可以
- 通过Canvas的平移与旋转简化绘图逻辑是一个非常有用的技巧,下面的时钟view就是利用这个方法完成的,省去了使用三角函数计算坐标的麻烦。p
- 使用过Mybatis的同学,应该都知道,我们只需要编写mybatis对应的接口和mapper XML文件即可,并不需要手动编写mapper接
- Spring概述Spring就是为解决企业应用开发的复杂性而创建的,做为开源中间件,它使用基本的JavaBean来完成以前只可能有EJB(J
- 错误展示:Information:java: Errors occurred while compiling module 'emp
- /* - - - - - - - - - 
- 在定义一个Rest接口时通常会利用GET、POST、PUT、DELETE来实现数据的增删改查;这几种方式有的需要传递参数,后台开发人员必须对
- 本文实例讲述了Android双击返回键退出程序的实现方法,是Android程序开发中一个非常实用的功能,分享给大家供大家参考之用。具体方法如
- 前面我们讲到了Spring在进行事务逻辑织入的时候,无论是事务开始,提交或者回滚,都会触发相应的事务事件。本文首先会使用实例进行讲解Spri
- 一、校验分类数据的校验一般分为**前端校验、后端校验**二、前端校验前端校验是最为明显的,先说一下:① HTML非空校验 如 HTML5 新
- RenderScript 介绍在开始之前,先看下 RenderScript 的官方介绍:RenderScript is a framewor
- 分页实现的基本过程是这样的:1. 设置自己的分页器的基本参数(可以从配置文件中读取)■每页显示的记录条数■每次最多显示多少页2. 编写设置分
- 本文实例分析了C#中Convert.ToString和ToString的区别,对于初学者来说是很有必要加以熟练掌握的。具体分析如下:1.Co
- (1). 和反射+泛型有关的接口类型java.lang.reflect.Type:java语言中所有类型的公共父接口java.lang.re