QQ项目之六聊天窗口

举报
tea_year 发表于 2021/12/29 23:29:38 2021/12/29
【摘要】 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Syste...

  
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Data.SqlClient;
  9. using System.Threading;
  10. using System.IO;
  11. namespace MYQQ
  12. {
  13.     /// <summary>
  14.     /// 聊天窗体:2015.12.23;       聊天窗体第一个图片;
  15.     /// </summary>
  16.     public partial class ChatForm : Form
  17.     {
  18.         //0 设置成员变量,4个
  19.         public int friendId;     // 当前聊天的好友号码
  20.         public string nickName;  // 当前聊天的好友昵称
  21.         public int faceId;       // 当前聊天的好友头像Id        
  22.         public string myName;    //自己的昵称;
  23.         //****************************以下构造函数不要动
  24.         public ChatForm()
  25.         {
  26.             InitializeComponent();
  27.         }
  28.         //**************************不要动
  29.         //第1步:窗体加载时的动作
  30.         private void ChatForm_Load(object sender, EventArgs e)
  31.         {
  32.             // 设置窗体标题
  33.             this.Text = string.Format("与{0}聊天中",nickName);
  34.             // 设置窗体顶部显示的好友信息
  35.             picFace.Image = ilFaces.Images[faceId];
  36.             lblFriend.Text = string.Format("{0}({1})",nickName,friendId);
  37.            
  38.             ShowMessage(); // 读取所有的未读消息,显示在窗体中
  39.         }
  40.         // 关闭窗体
  41.         private void btnClose_Click(object sender, EventArgs e)
  42.         {
  43.             this.Close();
  44.         }
  45.         /// <summary>
  46.         /// 将单引号'转换为双引号"
  47.         /// //Sql参数化实现,避免sql单引号问题,但是没有学,所以没有研究!
  48.         /// </summary>
  49.         /// <param name="str"></param>
  50.         /// <returns></returns>
  51.         private string CheckString(string str)
  52.         {
  53.             string returnStr = "";
  54.             if (str.IndexOf("'") != -1) //判断字符串是否含有单引号
  55.             {
  56.                 returnStr = str.Replace("'", "''");
  57.                 str = returnStr;
  58.             }
  59.             return str;
  60.         }
  61.         //4 发送消息
  62.         private void btnSend_Click(object sender, EventArgs e)
  63.         {
  64.             if (txtChat.Text.Trim() == "") // 不能发送空消息
  65.             {
  66.                 MessageBox.Show("不能发送空消息!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  67.                 return;
  68.             }
  69.             else if (txtChat.Text.Trim().Length > 50)
  70.             {
  71.                 MessageBox.Show("消息内容过长,请分为几条发送!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  72.                 return;
  73.             }
  74.             else  // 发送消息,写入数据库
  75.             {// MessageTypeId:1-表示聊天消息,为简化操作没有读取数据表,到S2可以用常量或者枚举实现                
  76.                 lblMessages.AppendText("\r\n"+myName+":\r\n\t"+txtChat.Text);                
  77.                 int result = -1; // 表示操作数据库的结果
  78.                 
  79.                 string sql = string.Format(
  80.                     @"INSERT  Messages(FromUserId, ToUserId, Message, MessageTypeId, MessageState) VALUES ({0},{1},'{2}',{3},{4})",
  81.                     UserHelper.loginId, friendId, CheckString(txtChat.Text.Trim()), 1, 0);
  82.                 try
  83.                 {
  84.                     // 执行命令
  85.                     SqlCommand command = new SqlCommand(sql, DBHelper.conn);
  86.                     DBHelper.conn.Open();
  87.                     result = command.ExecuteNonQuery();
  88.                 }
  89.                 catch (Exception ex)
  90.                 {
  91.                     MessageBox.Show(ex.Message);
  92.                 }
  93.                 finally
  94.                 {
  95.                     DBHelper.conn.Close();
  96.                 }
  97.                 if (result != 1)
  98.                 {
  99.                     MessageBox.Show("服务器出现意外错误!", "抱歉", MessageBoxButtons.OK, MessageBoxIcon.Error);
  100.                 }
  101.                 txtChat.Text = "";  // 输入消息清空               
  102.             }
  103.         }
  104.         //********************************************************************发送消息结束!!!!!!!!!!
  105.         /// <summary>
  106.         ///第2步:读取所有的未读消息,显示在窗体中
  107.         /// </summary>
  108.         private void ShowMessage()
  109.         {
  110.             string messageIdsString = "";  // 消息的Id组成的字符串;可以用ids代替这么长的变量;
  111.             string message;         // 消息内容
  112.             string messageTime;     // 消息发出的时间            
  113.             string sql = string.Format(
  114.                 "SELECT Id, Message,MessageTime From Messages WHERE FromUserId={0} AND ToUserId={1} AND MessageTypeId=1 AND MessageState=0",
  115.                 friendId, UserHelper.loginId);   // 读取消息的SQL语句;消息类型为 1:普通聊天消息;0:消息状态:未读
  116.             try
  117.             {
  118.                 SqlCommand command = new SqlCommand(sql, DBHelper.conn);
  119.                 DBHelper.conn.Open();
  120.                 SqlDataReader reader = command.ExecuteReader(); //读到一个临时表;
  121.                 while (reader.Read())       // 循环将消息添加到窗体上
  122.                 {
  123.                     messageIdsString += Convert.ToString(reader["Id"]) + ",";   //46,47,147,157,159,
  124.                     message = Convert.ToString(reader["Message"]);
  125.                     messageTime = Convert.ToDateTime(reader["MessageTime"]).ToString(); // 转换为日期类型,告诉学员
  126.                     //lblMessages:上面的文本框;消息太多了,需要回车换行
  127.                     lblMessages.Text += string.Format("\r\n{0}  {1}\r\n  {2}",nickName,messageTime,message);
  128.                 }
  129.                 reader.Close();                
  130.             }
  131.             catch (Exception ex)
  132.             {
  133.                 MessageBox.Show(ex.Message);
  134.             }
  135.             finally
  136.             {
  137.                 DBHelper.conn.Close();
  138.             }
  139.             //2.2 把显示出的消息置为已读;我登陆了,点过头像闪烁,就表示已读!
  140.             if (messageIdsString.Length > 1)
  141.             {                
  142.                 //SetMessageRead(messageIdsString, ','); //读过之后,需要设置状态为1
  143.                 SetMessageRead2(messageIdsString.Remove(messageIdsString.Length - 1)); //Remove():消除一个长度的逗号;去掉最后面的那个,
  144.             }            
  145.         }
  146.         /// <summary>
  147.         /// 使用新方法,来更新数据库,把获取的IdString作为参数;
  148.         /// </summary>
  149.         /// <param name="messageIdsString"></param>
  150.         private void SetMessageRead2(string messageIdsString) //46,47,147,157,159
  151.         {  
  152.             string sql = string.Format("Update Messages SET MessageState=1 WHERE Id in ({0})", messageIdsString); ; // 更新状态的SQL语句的固定部分            
  153.             try
  154.             {
  155.                 SqlCommand command = new SqlCommand();     // 创建Command对象
  156.                 command.Connection = DBHelper.conn;  // 指定数据库连接
  157.                 DBHelper.conn.Open();                // 打开数据库连接                
  158.                 command.CommandText = sql;   // 指定要执行的SQL语句
  159.                 int result = command.ExecuteNonQuery();  // 执行命令
  160.             }
  161.             catch (Exception ex)
  162.             {
  163.                 MessageBox.Show(ex.Message);
  164.             }
  165.             finally
  166.             {
  167.                 DBHelper.conn.Close();
  168.             }
  169.         }
  170.         //**************************************************************读取消息方法结束!
  171.         /// <summary>
  172.         ///3 把显示出的消息置为已读
  173.         /// </summary>        
  174.         private void SetMessageRead(string messageIdsString, char separator) //151,152,153,154; 分隔符,
  175.         {
  176.             string[] messageIds = messageIdsString.Split(separator);     // 分割出每个消息Id,Split,按照某个字符进行分割成数组151 152 153 154
  177.             string sql = "Update Messages SET MessageState=1 WHERE Id="; // 更新状态的SQL语句的固定部分
  178.             string updateSql;  // 执行的SQL语句
  179.             try
  180.             {
  181.                 SqlCommand command = new SqlCommand();     // 创建Command对象
  182.                 command.Connection = DBHelper.conn;  // 指定数据库连接
  183.                 DBHelper.conn.Open();                // 打开数据库连接
  184.                 foreach (string id in messageIds) //逐个从数组取数据151 152 153 154
  185.                 {
  186.                     if (id != "")
  187.                     {
  188.                         updateSql = sql + id;              // 补充完整的SQL语句
  189.                         command.CommandText = updateSql;   // 指定要执行的SQL语句
  190.                         int result = command.ExecuteNonQuery();  // 执行命令
  191.                     }
  192.                 }
  193.             }
  194.             catch (Exception ex)
  195.             {
  196.                 MessageBox.Show(ex.Message);
  197.             }
  198.             finally
  199.             {
  200.                 DBHelper.conn.Close();
  201.             }
  202.         }
  203.         //**********************************************************设置消息已读结束!!!!!
  204.         private void timer1_Tick(object sender, EventArgs e)
  205.         {
  206.             ShowMessage(); //每隔3秒读下消息!
  207.         }
  208.         private void toolStripButton3_Click(object sender, EventArgs e)
  209.         {
  210.             Vibration();

  
  1. //可以向数据库插入一个震动标志指令,对方收到这个指令,则本矿口震动!
  2.         }
  3.         //震动方法
  4.         private void Vibration()
  5.         {
  6.             Point pOld = this.Location;//原来的位置
  7.             int radius = 3;//半径
  8.             for (int n = 0; n < 3; n++) //旋转圈数
  9.             {
  10.                 //右半圆逆时针
  11.                 for (int i = -radius; i <= radius; i++)
  12.                 {
  13.                     int x = Convert.ToInt32(Math.Sqrt(radius * radius - i * i));
  14.                     int y = -i;
  15.                     this.Location = new Point(pOld.X + x, pOld.Y + y);
  16.                     Thread.Sleep(10);
  17.                 }
  18.                 //左半圆逆时针
  19.                 for (int j = radius; j >= -radius; j--)
  20.                 {
  21.                     int x = -Convert.ToInt32(Math.Sqrt(radius * radius - j * j));
  22.                     int y = -j;
  23.                     this.Location = new Point(pOld.X + x, pOld.Y + y);
  24.                     Thread.Sleep(10);
  25.                 }
  26.             }
  27.             //抖动完成,恢复原来位置
  28.             this.Location = pOld;
  29.         }
  30.         //字体代码
  31.         private void toolStripButton1_Click(object sender, EventArgs e)
  32.         {
  33.             fontDialog1.ShowDialog();
  34.             lblMessages.Font = fontDialog1.Font;
  35.         }
  36.         //颜色代码
  37.         private void toolStripDropDownButton2_Click(object sender, EventArgs e)
  38.         {
  39.             colorDialog1.ShowDialog();
  40.             lblMessages.ForeColor = colorDialog1.Color;
  41.         }
  42.         //发图片
  43.         private void toolStripButton4_Click(object sender, EventArgs e)
  44.         {
  45.             FileSend("PNG文件|*.png|GIF文件|*.gif|BMP文件|*.bmp|JPG文件|*.jpg|所有文件(*.*)|*.*");
  46.         }
  47.         public string Cuser = string.Empty;
  48.         public string CuserIP = string.Empty;
  49.         #region 文件传送,待完善
  50.         private void FileSend(string Filter)
  51.         {
  52.             try
  53.             {
  54.                 OpenFileDialog Dlg = new OpenFileDialog();
  55.                 FileInfo FI;
  56.                 Dlg.Filter = Filter;
  57.                 Dlg.CheckFileExists = true;
  58.                 Dlg.InitialDirectory = "C:\\Documents and Settings\\" + System.Environment.UserName + "\\桌面\\";
  59.                 if (Dlg.ShowDialog() == DialogResult.OK)
  60.                 {
  61.                     FI = new FileInfo(Dlg.FileName);
  62.                     string sendMsg = ":DATA:" + Cuser + "|" + System.Environment.UserName + "|" +
  63.                         CuserIP + "|" + Dlg.FileName + "|" + FI.Length + "|";
  64.                     byte[] buff = Encoding.Default.GetBytes(sendMsg);
  65.                     this.lblMessages.SelectionColor = Color.Red;
  66.                     this.lblMessages.AppendText("【发送文件】" + Dlg.FileName + "\r\n");
  67.                     this.lblMessages.ForeColor = Color.Black;
  68.                     this.lblMessages.ScrollToCaret();
  69.                 }
  70.             }
  71.             catch
  72.             {
  73.                 MessageBox.Show("文件发送失败!" + "\r\n");
  74.             }
  75.         }
  76.         #endregion
  77.         private void button1_Click(object sender, EventArgs e)
  78.         {
  79.             if (btnZd.Text.Equals(">>"))
  80.             {
  81.                 btnZd.Text = "<<";
  82.                 this.Width = 400;
  83.             }
  84.             else {
  85.                 btnZd.Text = ">>";
  86.                 this.Width = 610;
  87.             }
  88.         }
  89.         private void toolStripButton2_Click(object sender, EventArgs e)
  90.         {
  91.         }
  92.        
  93.       
  94.     }
  95. }

文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。

原文链接:aaaedu.blog.csdn.net/article/details/50486833

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。