仿qq聊天软件myqq源代码教学

合集下载

仿QQ聊天软件MyQQ源代码教学(北大青鸟完整版)

仿QQ聊天软件MyQQ源代码教学(北大青鸟完整版)

需求分析——功能分析
主要功能:
注册与登录 好友管理 消息管理 个人设置
需求分析——界面分析
需要的界面:
注册界面 登录界面 登录后的主界面 查找/添加好友界面 聊天界面 系统消息界面 个人设置界面
头像列表界面
需求分析——辅助类分析
需要添加的辅助类:
DBHelper类 UserHelper 类
小组分工
4
4 4 4 4
软件开发流程
比尔盖子是一名建筑工人 起初只干一些比较简单的 建筑工作 凭个人技术和经验,不需要特 别设计,可以顺利完成
如同编写早期比较小的程序
软件开发流程
新任务:建造一间非常美 丽而完整的房间 工作变得复杂许多
像不断发展的软件,功能 越来越多,越来越复杂
软件开发流程
软件复杂性
图形用户界面 客户/服务器结构 分布式应用 数据通信 超大型关系型数据库
// 判断 ListView 中是否有选中的项 if (lvFaces.SelectedItems.Count == 0) { // … } // 获得选中的头像的索引 int faceId = lvFaces.SelectedItems[0].ImageIndex;
第四次集中编码:A任务
个人信息修改功能
第一次集中编码:难点分析
好友列表——第三方控件 SideBar
SbGroup 类型 Items 属性 Groups 属性 SbItem 类型
第一次集中编码:难点分析
SideBar
// 命名空间 using Aptech.UI; // 添加组 sbFriends.AddGroup("我的好友"); sbFriends.AddGroup("陌生人"); 显示的文字 // 添加项 SbItem item = new SbItem((string)dataReader["NickName"], (int)dataReader["FaceId"]); sbFriends.Groups[0].Items.Add(item); 显示的图像索引

java课程设计仿qq

java课程设计仿qq

java课程设计仿qq一、教学目标本节课的教学目标是让学生掌握Java语言基础,学会使用Java编写简单的程序,通过仿QQ的项目实践,培养学生的编程能力和团队合作精神。

知识目标:使学生掌握Java语言的基本语法、数据类型、控制结构、类与对象等基础知识。

技能目标:使学生能够使用Java语言编写简单的程序,具备一定的编程能力;学会使用团队协作工具进行项目开发。

情感态度价值观目标:培养学生对编程的兴趣,增强其自主学习意识和团队协作精神,提高其面对挑战的信心。

二、教学内容本节课的教学内容主要包括Java语言基础和项目实践两部分。

1.Java语言基础:包括基本语法、数据类型、控制结构、类与对象等知识,以教材为基础,结合实例进行讲解。

2.项目实践:以仿QQ项目为例,让学生分组进行实践,培养学生的编程能力和团队合作精神。

三、教学方法本节课采用讲授法、案例分析法和实验法等多种教学方法。

1.讲授法:用于讲解Java语言基础知识,使学生掌握基本概念和语法。

2.案例分析法:通过分析实际案例,让学生理解Java语言的应用场景,提高其编程能力。

3.实验法:让学生分组进行项目实践,培养其团队合作精神和动手能力。

四、教学资源本节课的教学资源包括教材、多媒体资料和实验设备。

1.教材:用于引导学生学习Java语言基础知识,提供丰富的实例和练习题。

2.多媒体资料:用于辅助讲解和展示Java语言的应用场景,增强学生的学习兴趣。

3.实验设备:包括计算机、网络等,用于支持学生进行项目实践,培养其编程能力和团队合作精神。

五、教学评估本节课的评估方式包括平时表现、作业和考试三个部分,以保证评估的客观性和公正性。

1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,了解其对知识的掌握程度。

2.作业:布置与课程内容相关的编程作业,让学生巩固所学知识,评估其编程能力。

3.考试:进行期中和期末考试,全面测试学生对Java语言基础知识的掌握程度及其应用能力。

qq源代码

qq源代码

UserHelper..cs类代码using System;using System.Collections.Generic;using System.Text;namespace MyQQ{//记录登录的用户Idclass UserHelper{public static int loginId; //登录的用户Id}}using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Data.SqlClient;namespace MyQQ{///<summary>///聊天窗体///</summary>public partial class ChatForm : Form{public int friendId; // 当前聊天的好友号码public string nickName; // 当前聊天的好友昵称public int faceId; // 当前聊天的好友头像Idpublic ChatForm(){InitializeComponent();}// 窗体加载时的动作private void ChatForm_Load(object sender, EventArgs e){// 设置窗体标题this.Text = string.Format("与{0}聊天中",nickName);// 设置窗体顶部显示的好友信息picFace.Image = ilFaces.Images[faceId];lblFriend.Text = string.Format("{0}({1})",nickName,friendId);// 读取所有的未读消息,显示在窗体中ShowMessage();}// 关闭窗体private void btnClose_Click(object sender, EventArgs e){this.Close();}// 发送消息private void btnSend_Click(object sender, EventArgs e){if (txtChat.Text.Trim() == "") // 不能发送空消息{MessageBox.Show("不能发送空消息!", "提示", MessageBoxButtons.OK, rmation);return;}else if (txtChat.Text.Trim().Length > 50){MessageBox.Show("消息内容过长,请分为几条发送!", "提示", MessageBoxButtons.OK, rmation);return;}else// 发送消息,写入数据库{// MessageTypeId:1-表示聊天消息,为简化操作没有读取数据表,到S2可以用常量或者枚举实现// MessageState:0-表示消息状态是未读int result = -1; // 表示操作数据库的结果string sql = string.Format("INSERT INTO Messages (FromUserId, ToUserId, Message, MessageTypeId,MessageState) VALUES ({0},{1},'{2}',{3},{4})",UserHelper.loginId, friendId, txtChat.Text.Trim(), 1, 0);try{// 执行命令SqlCommand command = new SqlCommand(sql, DBHelper.connection);DBHelper.connection.Open();result = command.ExecuteNonQuery();}catch (Exception ex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}if (result != 1){MessageBox.Show("服务器出现意外错误!", "抱歉", MessageBoxButtons.OK, MessageBoxIcon.Error);}txtChat.Text = ""; // 输入消息清空this.Close();}}///<summary>///读取所有的未读消息,显示在窗体中///</summary>private void ShowMessage(){string messageIdsString = ""; // 消息的Id组成的字符串string message; // 消息内容string messageTime; // 消息发出的时间// 读取消息的SQL语句string sql = string.Format("SELECT Id, Message,MessageTime From Messages WHERE FromUserId={0} AND ToUserId={1} AND MessageTypeId=1 AND MessageState=0",friendId,UserHelper.loginId);try{SqlCommand command = new SqlCommand(sql, DBHelper.connection);DBHelper.connection.Open();SqlDataReader reader = command.ExecuteReader();// 循环将消息添加到窗体上while (reader.Read()){messageIdsString += Convert.ToString(reader["Id"]) + "_";message = Convert.ToString(reader["Message"]);messageTime = Convert.ToDateTime(reader["MessageTime"]).ToString(); // 转换为日期类型,告诉学员lblMessages.Text += string.Format("\n{0} {1}\n{2}",nickName,messageTime,message);}reader.Close();}catch (Exception ex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}// 把显示出的消息置为已读if (messageIdsString.Length > 1){messageIdsString.Remove(messageIdsString.Length - 1);SetMessageRead(messageIdsString, '_');}}///<summary>///把显示出的消息置为已读///</summary>private void SetMessageRead(string messageIdsString, char separator){string[] messageIds = messageIdsString.Split(separator); // 分割出每个消息Idstring sql = "Update Messages SET MessageState=1 WHERE Id="; // 更新状态的SQL语句的固定部分string updateSql; // 执行的SQL语句try{SqlCommand command = new SqlCommand(); // 创建Command对象command.Connection = DBHelper.connection; // 指定数据库连接DBHelper.connection.Open(); // 打开数据库连接foreach (string id in messageIds){if (id != ""){updateSql = sql + id; // 补充完整的SQL语句 mandText = updateSql; // 指定要执行的SQL语句int result = command.ExecuteNonQuery(); // 执行命令}}}catch (Exception ex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}}ChatForm.cs代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Data.SqlClient;namespace MyQQ{///<summary>///聊天窗体///</summary>public partial class ChatForm : Form{public int friendId; // 当前聊天的好友号码public string nickName; // 当前聊天的好友昵称public int faceId; // 当前聊天的好友头像Idpublic ChatForm(){InitializeComponent();}// 窗体加载时的动作private void ChatForm_Load(object sender, EventArgs e){// 设置窗体标题this.Text = string.Format("与{0}聊天中",nickName);// 设置窗体顶部显示的好友信息picFace.Image = ilFaces.Images[faceId];lblFriend.Text = string.Format("{0}({1})",nickName,friendId);// 读取所有的未读消息,显示在窗体中ShowMessage();}// 关闭窗体private void btnClose_Click(object sender, EventArgs e){this.Close();}// 发送消息private void btnSend_Click(object sender, EventArgs e){if (txtChat.Text.Trim() == "") // 不能发送空消息{MessageBox.Show("不能发送空消息!", "提示", MessageBoxButtons.OK, rmation);return;}else if (txtChat.Text.Trim().Length > 50){MessageBox.Show("消息内容过长,请分为几条发送!", "提示", MessageBoxButtons.OK, rmation);return;}else// 发送消息,写入数据库{// MessageTypeId:1-表示聊天消息,为简化操作没有读取数据表,到S2可以用常量或者枚举实现// MessageState:0-表示消息状态是未读int result = -1; // 表示操作数据库的结果string sql = string.Format("INSERT INTO Messages (FromUserId, ToUserId, Message, MessageTypeId, MessageState) VALUES ({0},{1},'{2}',{3},{4})",UserHelper.loginId, friendId, txtChat.Text.Trim(), 1, 0);try{// 执行命令SqlCommand command = new SqlCommand(sql, DBHelper.connection);DBHelper.connection.Open();result = command.ExecuteNonQuery();}catch (Exception ex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}if (result != 1){MessageBox.Show("服务器出现意外错误!", "抱歉", MessageBoxButtons.OK, MessageBoxIcon.Error);}txtChat.Text = ""; // 输入消息清空this.Close();}}///<summary>///读取所有的未读消息,显示在窗体中///</summary>private void ShowMessage(){string messageIdsString = ""; // 消息的Id组成的字符串string message; // 消息内容string messageTime; // 消息发出的时间// 读取消息的SQL语句string sql = string.Format("SELECT Id, Message,MessageTime From Messages WHERE FromUserId={0} AND ToUserId={1} AND MessageTypeId=1 AND MessageState=0",friendId,UserHelper.loginId);try{SqlCommand command = new SqlCommand(sql, DBHelper.connection);DBHelper.connection.Open();SqlDataReader reader = command.ExecuteReader();// 循环将消息添加到窗体上while (reader.Read()){messageIdsString += Convert.ToString(reader["Id"]) + "_";message = Convert.ToString(reader["Message"]);messageTime = Convert.ToDateTime(reader["MessageTime"]).ToString(); // 转换为日期类型,告诉学员lblMessages.Text += string.Format("\n{0} {1}\n{2}",nickName,messageTime,message);}reader.Close();}catch (Exception ex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}// 把显示出的消息置为已读if (messageIdsString.Length > 1){messageIdsString.Remove(messageIdsString.Length - 1);SetMessageRead(messageIdsString, '_');}}///<summary>///把显示出的消息置为已读///</summary>private void SetMessageRead(string messageIdsString, char separator){string[] messageIds = messageIdsString.Split(separator); // 分割出每个消息Idstring sql = "Update Messages SET MessageState=1 WHERE Id="; // 更新状态的SQL语句的固定部分string updateSql; // 执行的SQL语句try{SqlCommand command = new SqlCommand(); // 创建Command对象command.Connection = DBHelper.connection; // 指定数据库连接DBHelper.connection.Open(); // 打开数据库连接foreach (string id in messageIds){if (id != ""){updateSql = sql + id; // 补充完整的SQL语句 mandText = updateSql; // 指定要执行的SQL语句int result = command.ExecuteNonQuery(); // 执行命令}}}catch (Exception ex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}}private void lblMessages_Click(object sender, EventArgs e){}}}DBHelper.cs类代码using System;using System.Collections.Generic;using System.Text;using System.Data.SqlClient;namespace MyQQ{// 数据库帮助类,维护数据库连接字符串和数据库连接对象class DBHelper{private static string connString = "Data Source=.;database=MyQQ;integrated security=sspi";public static SqlConnection connection = new SqlConnection(connString);}}using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace MyQQ{///<summary>///头像选择窗体///</summary>public partial class FacesForm : Form{public PersonalInfoForm personalInfoForm; // 个人信息窗体public FacesForm(){InitializeComponent();}1.FacesForm.cs代码private void FacesForm_Load(object sender, EventArgs e){for (int i = 0; i < ilFaces.Images.Count; i++){lvFaces.Items.Add(i.ToString());lvFaces.Items[i].ImageIndex = i;}}// 确定选择头像private void btnOK_Click(object sender, EventArgs e){if (lvFaces.SelectedItems.Count == 0){MessageBox.Show("请选择一个头像!", "提示", MessageBoxButtons.OK, rmation);}else{int faceId = lvFaces.SelectedItems[0].ImageIndex; // 获得当前选中的头像的索引personalInfoForm.ShowFace(faceId); // 设置个人信息窗体中显示的头像this.Close();}}// 双击时选择头像private void lvIcons_MouseDoubleClick(object sender, MouseEventArgs e){int faceId = lvFaces.SelectedItems[0].ImageIndex; // 获得当前选中的头像的索引 personalInfoForm.ShowFace(faceId); // 设置个人信息窗体中显示的头像this.Close();}// 关闭窗体private void btnCancel_Click(object sender, EventArgs e){this.Close();}}}LoginForm.csusing System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Data.SqlClient;namespace MyQQ{///<summary>///登录窗体///</summary>public partial class LoginForm : Form{public LoginForm(){InitializeComponent();}// 取消按钮的事件处理private void btnCancel_Click(object sender, EventArgs e){Application.Exit();}// 打开申请号码界面private void llbl_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {RegisterForm registerForm = new RegisterForm();registerForm.Show();}// 登录按钮事件处理private void btnLogin_Click(object sender, EventArgs e){bool error = false; // 标志在执行数据库操作的过程中是否出错// 如果输入验证成功,就验证身份,并转到相应的窗体if (ValidateInput()){int num = 0; // 数据库操作结果try{// 查询用的sql语句string sql = string.Format("SELECT COUNT(*) FROM Users WHERE Id={0} AND LoginPwd = '{1}'",int.Parse(txtLoginId.Text.Trim()), txtLoginPwd.Text.Trim());// 创建Command 对象SqlCommand command = new SqlCommand(sql, DBHelper.connection);DBHelper.connection.Open(); // 打开数据库连接num = Convert.ToInt32(command.ExecuteScalar());}catch (Exception ex){error = true;Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close(); // 关闭数据库连接}if (!error && (num == 1)) // 验证通过{// 设置登录的用户号码UserHelper.loginId = int.Parse(txtLoginId.Text.Trim());// 创建主窗体MainForm mainForm = new MainForm();mainForm.Show(); // 显示窗体this.Visible = false; // 当前窗体不可见}else{MessageBox.Show("输入的用户名或密码有误!", "登录提示", MessageBoxButtons.OK, MessageBoxIcon.Error);}}}// 忘记密码标签private void llblFogetPwd_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {MessageBox.Show("该功能尚未开通!","提示",MessageBoxButtons.OK,rmation);}// 用户输入验证private bool ValidateInput(){// 验证用户输入if (txtLoginId.Text.Trim() == ""){MessageBox.Show("请输入登录的号码", "登录提示", MessageBoxButtons.OK, rmation);txtLoginId.Focus();return false;}else if (txtLoginPwd.Text.Trim() == ""){MessageBox.Show("请输入密码", "登录提示", MessageBoxButtons.OK, rmation);txtLoginPwd.Focus();return false;}return true;}}}MainForm.csusing System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Aptech.UI;using System.Data.SqlClient;using System.Media;namespace MyQQ{///<summary>///登录后的主窗体///</summary>public partial class MainForm : Form{int fromUserId; // 消息的发起者int friendFaceId; // 发消息的好友的头像Idint messageImageIndex = 0; // 工具栏中的消息图标的索引public MainForm(){InitializeComponent();}// 窗体加载时发生private void MainForm_Load(object sender, EventArgs e) {// 工具栏的消息图标tsbtnMessageReading.Image = ilMessage.Images[0];// 显示个人的信息ShowSelfInfo();// 添加SideBar 的两个组sbFriends.AddGroup("我的好友");sbFriends.AddGroup("陌生人");// 向我的好友组中添加我的好友列表ShowFriendList();}// 窗体关闭后,退出应用程序private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {Application.Exit();}// 显示个人信息窗体private void tsbtnPersonalInfo_Click(object sender, EventArgs e){PersonalInfoForm personalInfoForm = new PersonalInfoForm();personalInfoForm.mainForm = this; // 将当前窗体本身传给个人信息窗体 personalInfoForm.Show();}// 显示查找好友窗体private void tsbtnSearchFriend_Click(object sender, EventArgs e){SearchFriendForm searchFriendForm = new SearchFriendForm();searchFriendForm.Show();}// 双击一项,弹出聊天窗体private void sbFriends_ItemDoubleClick(SbItemEventArgs e){// 消息timer停止运行if (tmrChatRequest.Enabled == true){tmrChatRequest.Stop();e.Item.ImageIndex = this.friendFaceId;}// 显示聊天窗体ChatForm chatForm = new ChatForm();chatForm.friendId = Convert.ToInt32(e.Item.Tag); // 号码chatForm.nickName = e.Item.Text; // 昵称chatForm.faceId = e.Item.ImageIndex; // 头像chatForm.Show();}// 点击刷新好友列表private void tsbtnUpdateFriendList_Click(object sender, EventArgs e){ShowFriendList();}// 定时扫描数据库,找到未读消息private void tmrMessage_Tick(object sender, EventArgs e){ShowFriendList(); // 刷新好友列表int messageTypeId = 1; // 消息类型int messageState = 1; // 消息状态// 找出未读消息对应的好友Idstring sql = string.Format("SELECT Top 1 FromUserId, MessageTypeId, MessageState FROM Messages WHERE ToUserId={0} AND MessageState=0", UserHelper.loginId);SqlCommand command;// 消息有两种类型:聊天消息、添加好友消息try{command = new SqlCommand(sql, DBHelper.connection);DBHelper.connection.Open();SqlDataReader dataReader = command.ExecuteReader();// 循环读出一个未读消息if (dataReader.Read()){this.fromUserId = (int)dataReader["FromUserId"];messageTypeId = (int)dataReader["MessageTypeId"];messageState = (int)dataReader["MessageState"];}dataReader.Close();}catch (Exception ex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}// 判断消息类型,如果是添加好友消息,就启动喇叭timer,让小喇叭闪烁if (messageTypeId == 2 && messageState == 0){SoundPlayer player = new SoundPlayer("system.wav");player.Play();tmrAddFriend.Start();}// 如果是聊天消息,就启动聊天timer,让好友头像闪烁else if (messageTypeId == 1 && messageState == 0){// 获得发消息的人的头像Idsql = "SELECT FaceId FROM Users WHERE Id=" + this.fromUserId;try{command = new SqlCommand(sql, DBHelper.connection);DBHelper.connection.Open();this.friendFaceId = Convert.ToInt32(command.ExecuteScalar()); // 设置发消息的好友的头像索引}catch (Exception ex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}// 如果发消息的人没有在列表中就添加到陌生人列表中if (!HasShowUser(fromUserId)){UpdateStranger(fromUserId);}SoundPlayer player = new SoundPlayer("msg.wav");player.Play();tmrChatRequest.Start(); // 启动闪烁头像定时器}}// 控制喇叭闪烁private void tmrAddFriend_Tick(object sender, EventArgs e){// 反复修改它的图像messageImageIndex = messageImageIndex == 0 ? 1:0;tsbtnMessageReading.Image = ilMessage.Images[messageImageIndex];}// 单击时显示请求好友消息窗体private void tsbtnMessageReading_Click(object sender, EventArgs e){tmrAddFriend.Stop(); // 消息timer停止运行// 图片恢复正常messageImageIndex = 0;tsbtnMessageReading.Image = ilMessage.Images[messageImageIndex];// 显示系统消息窗体RequestForm requestForm = new RequestForm();requestForm.Show();}// 让相应的好友头像闪烁private void tmrChatRequest_Tick(object sender, EventArgs e){// 循环好友列表两个组中的每个item,找到发消息的好友,让他的头像闪烁for (int i = 0; i < 2; i++){for (int j = 0; j < sbFriends.Groups[i].Items.Count; j++){if(Convert.ToInt32(sbFriends.Groups[i].Items[j].Tag) == this.fromUserId) {if (sbFriends.Groups[i].Items[j].ImageIndex < 100){sbFriends.Groups[i].Items[j].ImageIndex = 100;// 索引为的图片是一个空白图片}else{sbFriends.Groups[i].Items[j].ImageIndex = this.friendFaceId;}sbFriends.Invalidate(); // 重新绘制,只要告诉学生需要这句话才能正常闪烁头像就行}}}}// 显示右键菜单时,控制哪些菜单不可见private void cmsFriendList_Opening(object sender, CancelEventArgs e){// 如果没有选中的项if (sbFriends.SeletedItem == null){tsmiDelete.Visible = false;}else{tsmiDelete.Visible = true;}// 如果选中的是陌生人,显示加为好友菜单if (sbFriends.SeletedItem != null && sbFriends.SeletedItem.Parent == sbFriends.Groups[1]){tsmiAddFriend.Visible = true;}else{tsmiAddFriend.Visible = false;}}// 显示大、小头像视图切换private void tsmiView_Click(object sender, EventArgs e){if (sbFriends.View == rgeIcon){sbFriends.View = SbView.SmallIcon;tsmiView.Text = "显示大头像";}else if (sbFriends.View == SbView.SmallIcon){sbFriends.View = rgeIcon;tsmiView.Text = "显示小头像";}}// 删除好友private void tsmiDelete_Click(object sender, EventArgs e){DialogResult result; // 对话框结果int deleteResult = 0; // 操作结果if (sbFriends.SeletedItem != null){result = MessageBox.Show("确实要删除该好友吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);if (result == DialogResult.Yes) // 确认删除{if (sbFriends.VisibleGroup == sbFriends.Groups[0]){string sql = string.Format("DELETE FROM Friends WHERE HostId={0} AND FriendId={1}",UserHelper.loginId, Convert.ToInt32(sbFriends.SeletedItem.Tag));try{SqlCommand command = new SqlCommand(sql, DBHelper.connection);DBHelper.connection.Open();deleteResult = command.ExecuteNonQuery();}catch (Exception ex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}if (deleteResult == 1){MessageBox.Show("好友已删除", "提示", MessageBoxButtons.OK, rmation);sbFriends.SeletedItem.Parent.Items.Remove(sbFriends.SeletedItem);}}else{MessageBox.Show("好友已删除", "提示", MessageBoxButtons.OK, rmation);sbFriends.SeletedItem.Parent.Items.Remove(sbFriends.SeletedItem);}}}}// 将选中的人加为好友private void tsmiAddFriend_Click(object sender, EventArgs e){int result = 0; // 操作结果string sql = string.Format("INSERT INTO Friends (HostId, FriendId) VALUES({0},{1})",UserHelper.loginId, Convert.ToInt32(sbFriends.SeletedItem.Tag));try{SqlCommand command = new SqlCommand(sql, DBHelper.connection);DBHelper.connection.Open();result = command.ExecuteNonQuery();}catch (Exception ex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}if (result == 1){MessageBox.Show("添加成功!", "提示", MessageBoxButtons.OK, rmation);sbFriends.SeletedItem.Parent.Items.Remove(sbFriends.SeletedItem);ShowFriendList(); // 更新好友列表}else{MessageBox.Show("添加失败,请稍候再试!", "提示", MessageBoxButtons.OK, rmation);}}// 退出private void tsbtnExit_Click(object sender, EventArgs e){DialogResult result = MessageBox.Show("确实要退出吗?", "操作确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question);if (result == DialogResult.Yes){Application.Exit();}}// 可见组发生变化时,发出声音private void sbFriends_VisibleGroupChanged(SbGroupEventArgs e){SoundPlayer player = new SoundPlayer("folder.wav");player.Play();}///<summary>///登录后显示个人的信息///</summary>public void ShowSelfInfo(){string nickName = ""; // 昵称int faceId = 0; // 头像索引bool error = false; // 标识是否出现错误// 取得当前用户的昵称、头像string sql = string.Format("SELECT NickName, FaceId FROM Users WHERE Id={0}",UserHelper.loginId);try{// 查询SqlCommand command = new SqlCommand(sql, DBHelper.connection);DBHelper.connection.Open();SqlDataReader dataReader = command.ExecuteReader();if (dataReader.Read()){if (!(dataReader["NickName"] is DBNull)) // 判断数据库类型是否为空 {nickName = Convert.ToString(dataReader["NickName"]);}faceId = Convert.ToInt32(dataReader["FaceId"]);}dataReader.Close();}catch (Exception ex){error = true;Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}// 根据操作数据库结果进行不同的操作if (error){MessageBox.Show("服务器请求失败!请重新登录!", "意外错误", MessageBoxButtons.OK, MessageBoxIcon.Error);Application.Exit();}else{// 在窗体标题显示登录的昵称、号码this.Text = UserHelper.loginId.ToString();this.picFace.Image = ilFaces.Images[faceId];this.lblLoginId.Text = string.Format("{0}({1})", nickName,UserHelper.loginId.ToString());}}///<summary>///向我的好友组中添加我的好友列表///</summary>private void ShowFriendList(){// 清空原来的列表sbFriends.Groups[0].Items.Clear();bool error = false; // 标识数据库是否出错// 查找有哪些好友string sql = string.Format("SELECT FriendId,NickName,FaceId FROM Users,Friends WHERE Friends.HostId={0} AND Users.Id=Friends.FriendId",UserHelper.loginId);try{// 执行查询SqlCommand command = new SqlCommand(sql, DBHelper.connection);DBHelper.connection.Open();SqlDataReader dataReader = command.ExecuteReader();// 循环添加好友列表while (dataReader.Read()){// 创建一个SideBar项SbItem item = new SbItem((string)dataReader["NickName"], (int)dataReader["FaceId"]);item.Tag = (int)dataReader["FriendId"]; // 将号码放在Tag属性中// SideBar中的组可以通过数组的方式访问,按照添加的顺序索引从开始// Groups[0]表示SideBar中的第一个组,也就是“我的好友”组sbFriends.Groups[0].Items.Add(item); // 向SideBar的“我的好友”组中添加项 }dataReader.Close();}catch (Exception ex){error = true;Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}// 出错了if (error){MessageBox.Show("服务器发生意外错误!请尝试重新登录", "抱歉", MessageBoxButtons.OK, MessageBoxIcon.Error);Application.Exit();}}///<summary>///判断发消息的人是否在列表中///</summary>private bool HasShowUser(int loginId){bool find = false; // 表示是否在当前显示出的用户列表中找到了该用户// 循环SideBar 中的个组,寻找发消息的人是否在列表中for (int i = 0; i < 2; i++){for (int j = 0; j < sbFriends.Groups[i].Items.Count; j++){if (Convert.ToInt32(sbFriends.Groups[i].Items[j].Tag) == loginId){find = true;}}}return find;}///<summary>///更新陌生人列表///</summary>private void UpdateStranger(int loginId){// 选出这个人的基本信息string sql = "SELECT NickName, FaceId FROM Users WHERE Id=" + loginId;bool error = false; // 用来标识是否出现错误try{SqlCommand command = new SqlCommand(sql, DBHelper.connection);DBHelper.connection.Open();SqlDataReader dataReader = command.ExecuteReader(); // 查询if (dataReader.Read()){SbItem item = new SbItem((string)dataReader["NickName"],(int)dataReader["FaceId"]);item.Tag = this.fromUserId; // 将Id记录在Tag属性中sbFriends.Groups[1].Items.Add(item); // 向陌生人组中添加项}sbFriends.VisibleGroup = sbFriends.Groups[1]; // 设定陌生人组为可见组 }catch (Exception ex){error = true;Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}// 出错了if (error){MessageBox.Show("服务器出现意外错误!", "抱歉", MessageBoxButtons.OK, MessageBoxIcon.Error);}}}}(资料素材和资料部分来自网络,供参考。

myqq9项目代码

myqq9项目代码

SqlDataReader rd = cmd.ExecuteReader();
while (rd.Read())
{
cbo_xing.Items.Add(rd[0].ToString());
SqlDataReader r = cm.ExecuteReader();
while (r.Read())
{
cbo_xue.Items.Add(r[0].ToString());
}
r.Close();
DBHelper.connection.Close();
}
private void btn_zhu_Click(object sender, EventArgs e)
{
string sex;
{
if (DBHelper.connection.State != ConnectionState.Open)
{
DBHelper.connection.Open();
}
SqlCommand cmd = new SqlCommand(string.Format("select Id from BloodType where BloodType='{0}'", xue), DBHelper.connection);
return;
}
if (cbo_xue.Text == " <请选择你的血型>")
{
MessageBox.Show("请选择血型!", "温馨提示", MessageBoxButtons.OK, rmation);
SqlDataReader rd = dd.ExecuteReader();

用C语言写聊天工具,类似于QQ

用C语言写聊天工具,类似于QQ

C 语言究竟能干什么序言鉴于现在已经大三了,很多同学很迷茫,自己学的东西到底能做什么,将来自己到底能干什么?我不想看着同学迷茫的面孔,特别是几个好兄弟,有几个想学习编程,但又苦苦找不到门路的兄弟,所以想写点东西,希望对大家又点略微的帮助,以尽兄弟我的微薄之力。

很多同学学了C语言之后,可能难免会有所感叹:这就是C语言!总是感觉C语言竟然能写出Windows、Linux?为了解除同学们的疑惑,也愿为同学们指点编程之道吧。

我写的这些东西采用C语言,计划通过编程实例来讲解C编程的一些知识,让大家对C能又更深一层的理解和认识。

当然,大家不要指望看了这些之后会写出一个操作系统来,但是我想,如果你认真看了的话,写一个类似与QQ的聊天程序应该不难。

本来书是假期里照顾妈妈时写的,原想是1、不让自己的水平停滞不前,温故知新(两个月的假期是很长的)2. 帮助一些同学,解决编程上的困惑3.希望妈妈快点康复4.让母亲和家里人知道自己一直都很努力,我是好样的但现在母亲已经能够不在了,所以第三点,就改为原母亲在天之灵得到慰藉,早日放下烦恼,不用惦记我们。

C语言的基本语法我是不打算再提了,很多C语言编程的书,就是将一些基本的数据类型、数据结构、语法,然后就是一些数值计算的实例,大多数都是雷同的,难免有抄袭之嫌,而且页没有多少实用价值。

本书以实用实例作为编程指导,指引大家编写真正实用的程序。

了解到大家对黑客程序、病毒、窗口类程序比较感兴趣,因此我就拿这些实例进行讲解。

基于大家基本都用Windows XP SP3,我也就在这个系统上把程序调试成功后再给大家讲解。

编程环境,我还是喜欢Visual C++ 6.0本书计划从四个大的方面来讲,这四个方面是:窗口类、文件操作类、网络类、数据库类。

都是时下流行的编程必备技术,也是软件开发者,必须掌握的技术。

中间以实例讲解,逐步学习,相信大家看完后会有很大的提高的。

第一章窗口类程序的编写这一章就先来讲解下窗口类程序的编写。

模仿QQ MFC 源码

模仿QQ MFC 源码

登陆框.h#pragma once#include"afxcmn.h"#include"afxwin.h"// CLoginDlg 对话框class CLoginDlg : public CDialog{DECLARE_DYNAMIC(CLoginDlg)public:CLoginDlg(CWnd* pParent = NULL); // 标准构造函数virtual ~CLoginDlg();// 对话框数据enum { IDD = IDD_DIALOG_LOGIN };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持DECLARE_MESSAGE_MAP()public:afx_msg void OnBnClickedOk();CString m_strUsername;CString m_strPassord;afx_msg void OnBnClickedButtonClose();afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);private:BOOL m_bMoving;CPoint m_ptPreMove;public:CLinkCtrl m_cLinkRegister;CLinkCtrl m_cLinkFindpwd;static DWORD m_nIconID;//用于存放登录后托盘显示的图标afx_msg void OnNMClickSyslinkRegister(NMHDR *pNMHDR, LRESULT *pResult);afx_msg void OnNMClickSyslinkFindpwd(NMHDR *pNMHDR, LRESULT *pResult);virtual BOOL OnInitDialog();afx_msg void OnBnClickedButtonList();CButton m_btnList;afx_msg void OnPaint();afx_msg void OnOnlin();afx_msg void OnQme();afx_msg void OnLeave();afx_msg void OnBusy();afx_msg void OnDarao();afx_msg void OnYinshen();afx_msg LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);void ToTray(BOOL Show);CButton m_btnJianPan;CButton m_btnConfig;CToolTipCtrl toolTipCtrl[3];NOTIFYICONDATA m_nid;virtual BOOL PreTranslateMessage(MSG* pMsg);afx_msg void Onshowwindow();afx_msg void OnOpenmainpanel();afx_msg void OnHideWindows();afx_msg void OnButtonClose();afx_msg void OnBnClickedButtonMin();afx_msg void OnBnClickedButtonJianpan();afx_msg void OnCbnSelchangeComboUsername();BOOL m_isRemPassword;afx_msg void OnBnClickedCheckSavepwd();BOOL m_isAutoLogin;afx_msg void OnBnClickedCheckAutologin();afx_msg void OnTimer(UINT_PTR nIDEvent);BOOL m_isFirstLoginAccount;//hj};登陆框.cpp// LoginDlg.cpp : 实现文件//#include"stdafx.h"#include"QQDemo.h"#include"LoginDlg.h"#include"RegisterDlg.h"#include"SeekDlg.h"#define WM_SHOWTASK WM_USER+1// CLoginDlg 对话框IMPLEMENT_DYNAMIC(CLoginDlg, CDialog)DWORD CLoginDlg::m_nIconID = IDI_IMONLINE;CLoginDlg::CLoginDlg(CWnd* pParent/*=NULL*/): CDialog(CLoginDlg::IDD, pParent), m_strUsername(_T("")), m_strPassord(_T("")), m_bMoving(FALSE), m_isRemPassword(TRUE), m_isAutoLogin(FALSE), m_isFirstLoginAccount(TRUE){}CLoginDlg::~CLoginDlg(){Shell_NotifyIcon(NIM_DELETE,&m_nid);//从托盘中删除}void CLoginDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);DDX_CBString(pDX, IDC_COMBO_USERNAME, m_strUsername);DDX_Text(pDX, IDC_EDIT_PASSWORD, m_strPassord);DDX_Control(pDX, IDC_SYSLINK_REGISTER, m_cLinkRegister);DDX_Control(pDX, IDC_SYSLINK_FINDPWD, m_cLinkFindpwd);DDX_Control(pDX, IDC_BUTTON_LIST, m_btnList);DDX_Control(pDX, IDC_BUTTON_JIANPAN, m_btnJianPan);DDX_Control(pDX, IDC_BUTTON_CONFIG, m_btnConfig);DDX_Check(pDX, IDC_CHECK_SA VEPWD, m_isRemPassword);DDX_Check(pDX, IDC_CHECK_AUTOLOGIN, m_isAutoLogin);}BEGIN_MESSAGE_MAP(CLoginDlg, CDialog)ON_BN_CLICKED(IDOK, &CLoginDlg::OnBnClickedOk)ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CLoginDlg::OnBnClickedButtonClose)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_MESSAGE(WM_SHOWTASK, &CLoginDlg::OnShowTask)ON_NOTIFY(NM_CLICK, IDC_SYSLINK_REGISTER, &CLoginDlg::OnNMClickSyslinkRegister) ON_NOTIFY(NM_CLICK, IDC_SYSLINK_FINDPWD, &CLoginDlg::OnNMClickSyslinkFindpwd) ON_BN_CLICKED(IDC_BUTTON_LIST, &CLoginDlg::OnBnClickedButtonList)ON_WM_PAINT()ON_COMMAND(IDM_ONLIN, &CLoginDlg::OnOnlin)ON_COMMAND(IDM_QME, &CLoginDlg::OnQme)ON_COMMAND(IDM_LEA VE, &CLoginDlg::OnLeave)ON_COMMAND(IDM_BUSY, &CLoginDlg::OnBusy)ON_COMMAND(IDM_DARAO, &CLoginDlg::OnDarao)ON_COMMAND(IDM_YINSHEN, &CLoginDlg::OnYinshen)ON_COMMAND(ID_showWindow, &CLoginDlg::Onshowwindow)ON_COMMAND(IDC_BUTTON_CLOSE, &CLoginDlg::OnButtonClose)ON_COMMAND(1200,OnOpenmainpanel)ON_COMMAND(1201,OnHideWindows)ON_BN_CLICKED(IDC_BUTTON_MIN, &CLoginDlg::OnBnClickedButtonMin)ON_BN_CLICKED(IDC_BUTTON_JIANPAN, &CLoginDlg::OnBnClickedButtonJianpan)ON_CBN_SELCHANGE(IDC_COMBO_USERNAME, &CLoginDlg::OnCbnSelchangeComboUsername) ON_BN_CLICKED(IDC_CHECK_SA VEPWD, &CLoginDlg::OnBnClickedCheckSavepwd)ON_BN_CLICKED(IDC_CHECK_AUTOLOGIN, &CLoginDlg::OnBnClickedCheckAutologin)ON_WM_TIMER()END_MESSAGE_MAP()// CLoginDlg 消息处理程序void CLoginDlg::ToTray(BOOL Show){if(Show){UpdateData(TRUE);Shell_NotifyIcon(NIM_ADD,&m_nid); //放入托盘中ShowWindow(SW_HIDE); //隐藏主窗口}else{Shell_NotifyIcon(NIM_DELETE,&m_nid);//从托盘中删除}}//处理托盘的回调函数(也就是对托盘的一些消息响应如单击,右击,双击)LRESULT CLoginDlg::OnShowTask(WPARAM wParam, LPARAM lParam){switch(lParam){case WM_RBUTTONDOWN:{CRect rect;CPoint p;GetCursorPos(&p);CMenu menu;if(this->IsWindowVisible()){menu.CreatePopupMenu();menu.AppendMenu(MF_STRING,1201,_T("隐藏主面板"));menu.AppendMenu(MF_STRING,WM_DESTROY,_T("关闭"));menu.TrackPopupMenu(TPM_LEFTALIGN,p.x,p.y,this);}else{menu.CreatePopupMenu();menu.AppendMenu(MF_STRING,1200,_T("打开主面板"));menu.AppendMenu(MF_STRING,WM_DESTROY,_T("关闭"));menu.TrackPopupMenu(TPM_LEFTALIGN,p.x,p.y,this);}}break;case WM_LBUTTONDOWN:ShowWindow(SW_SHOW);break;}return 0;}void CLoginDlg::OnBnClickedOk(){UpdateData();BOOL isFind = FALSE;//判断是否已经找到密码CString temp;//存储格式化字符串if(m_strUsername == _T("")){MessageBox(_T("帐号不能为空!请重新输入!"));return;}if(m_strPassord == _T("")){MessageBox(_T("密码不能为空!请输入密码!"));return;}//判断该帐号是否已经注册(在qqData.ini文件中)//int nInqqdata;CString strAccountInqqData;CString strPasswordInqqData;int nCount=::GetPrivateProfileInt(_T("FileCount"),_T("Count"),0,_T(".\\qqData.ini"));for(int i = 0;i < nCount;i++){temp.Format(_T("%d"),i + 1);::GetPrivateProfileString(_T("admin") + temp,_T("Account") + temp,m_strUsername, strAccountInqqData.GetBuffer(MAX_PA TH),MAX_PA TH,_T(".\\qqData.ini"));::GetPrivateProfileString(_T("admin") + temp,_T("Password") + temp,_T(""), strPasswordInqqData.GetBuffer(MAX_PA TH),MAX_PA TH,_T(".\\qqData.ini"));//如果账号,密码与配置文件中的数据一致则登录成功if (strAccountInqqData == m_strUsername){if(m_strPassord == strPasswordInqqData){isFind = TRUE;break;}}}if(!isFind){MessageBox(_T("账号或密码有错误,请确认后重新登录!"));return;}int bCount = ::GetPrivateProfileInt(_T("FileCount"),_T("Count"),0,_T(".\\qq.ini"));CString strAccount;//存储本地读取文件中的账号CString strPassword;//存储本地文件中的密码CString strRemPassword;//存储配置文件中的记住密码状态CString strAutoLogin;//存储配置文件自动登录状态CString strLastLogin;//存储配置文件是否为上次登录状态BOOL isExistInqq=FALSE;//是否存在于本地的配置文件int nIndex;//帐号在配置文件中下标if (m_isRemPassword){strRemPassword = _T("1");}strRemPassword = _T("0");if (m_isAutoLogin){strAutoLogin = _T("1");}elsestrAutoLogin = _T("0");bCount++;//判断是否本地配置文件中已经存在该帐号的信息for (int i= 0;i < bCount;i++){nIndex=i + 1;temp.Format(_T("%d"),nIndex);::GetPrivateProfileString(_T("admin") + temp,_T("Account") + temp,_T(""), strAccount.GetBuffer(MAX_PA TH),MAX_PATH,_T(".\\qq.ini"));if(strAccount==m_strUsername){isExistInqq=TRUE;break;}}if (!isExistInqq){temp.Format(_T("%d"),bCount);::WritePrivateProfileString(_T("admin") +temp,_T("Account") + temp,m_strUsername,_T(".\\qq.ini"));//写入密码,当记住密码时为账户密码,否则密码为空if(m_isRemPassword){::WritePrivateProfileString(_T("admin") + temp,_T("Password") + temp,m_strPassord,_T(".\\qq.ini"));}else::WritePrivateProfileString(_T("admin") + temp,_T("Password") + temp,_T(""),_T(".\\qq.ini"));::WritePrivateProfileString(_T("admin") +temp,_T("isRemPassword") + temp,strRemPassword,_T(".\\qq.ini"));::WritePrivateProfileString(_T("admin") +temp,_T("isAutoLogin") + temp,strAutoLogin,_T(".\\qq.ini"));::WritePrivateProfileString(_T("FileCount"),_T("Count"),temp,_T(".\\qq.ini"));else{temp.Format(_T("%d"),nIndex);if(m_isRemPassword){::WritePrivateProfileString(_T("admin") + temp,_T("Password") + temp,m_strPassord,_T(".\\qq.ini"));}else::WritePrivateProfileString(_T("admin") + temp,_T("Password") + temp,_T(""),_T(".\\qq.ini"));::WritePrivateProfileString(_T("admin") + temp,_T("isRemPassword") + temp,strRemPassword,_T(".\\qq.ini"));::WritePrivateProfileString(_T("admin") + temp,_T("isAutoLogin") + temp,strAutoLogin,_T(".\\qq.ini"));}Shell_NotifyIcon(NIM_DELETE,&m_nid);//获得此时本地文件存在的帐号数目bCount = ::GetPrivateProfileInt(_T("FileCount"),_T("Count"),0,_T(".\\qq.ini"));for(int i = 0;i < bCount;i++){temp.Format(_T("%d"),i + 1);::WritePrivateProfileString(_T("admin") + temp,_T("isLastLogin") + temp,_T("0"),_T(".\\qq.ini"));}//为现在这个帐号设置isLastLogin的值if (isExistInqq){temp.Format(_T("%d"),nIndex);::WritePrivateProfileString(_T("admin") + temp,_T("isLastLogin") + temp,_T("1"),_T(".\\qq.ini"));}else{temp.Format(_T("%d"),bCount);::WritePrivateProfileString(_T("admin") + temp,_T("isLastLogin") + temp,_T("1"),_T(".\\qq.ini"));}//对当前帐号的排名计数器设为,并写入本地配置文件中::WritePrivateProfileString(_T("admin") + temp,_T("Rank") + temp,_T("0"),_T(".\\qq.ini"));//遍历本地配置文件,除了本次登录的帐号外,其他帐号的排名计数都加for (int i = 0;i < bCount;i++){temp.Format(_T("%d"),i + 1);::GetPrivateProfileString(_T("admin") + temp,_T("isLastLogin") + temp,_T(""),strLastLogin.GetBuffer(MAX_PA TH),MAX_PA TH,_T(".\\qq.ini"));if (strLastLogin != _T("1")){int rank = GetPrivateProfileInt(_T("admin") + temp,_T("Rank") + temp,0,_T(".\\qq.ini"));rank++;CString strRank;strRank.Format(_T("%d"),rank);::WritePrivateProfileString(_T("admin") + temp,_T("Rank") + temp,strRank,_T(".\\qq.ini"));}}OnOK();}void CLoginDlg::OnLButtonDown(UINT nFlags, CPoint point){if (point.y <= 50){m_bMoving = TRUE;m_ptPreMove = point;ClientToScreen(&m_ptPreMove);//GetCapture();}CDialog::OnLButtonDown(nFlags, point);}void CLoginDlg::OnLButtonUp(UINT nFlags, CPoint point){m_bMoving = FALSE;CDialog::OnLButtonUp(nFlags, point);}void CLoginDlg::OnMouseMove(UINT nFlags, CPoint point){if (m_bMoving){CPoint ptTemp = point;ClientToScreen(&ptTemp);CPoint ptOffset = ptTemp - m_ptPreMove;m_ptPreMove = ptTemp;CRect rectWindow;GetWindowRect(&rectWindow);rectWindow += ptOffset;MoveWindow(&rectWindow);}CDialog::OnMouseMove(nFlags, point);}void CLoginDlg::OnNMClickSyslinkRegister(NMHDR *pNMHDR, LRESULT *pResult){// TODO: 在此添加控件通知处理程序代码//PNMLINK pNMLink = (PNMLINK)pNMHDR;//::ShellExecute(m_hWnd, _T("open"), pNMLink->item.szUrl, NULL, NULL, SW_SHOWNORMAL);CRegisterDlg dlg;if(IDOK != dlg.DoModal())return;//把注册信息存入qqData注册表UpdateData();int nCount = ::GetPrivateProfileInt(_T("FileCount"),_T("Count"),0,_T(".\\qqData.ini"));nCount++;CString temp;temp.Format(_T("%d"),nCount);::WritePrivateProfileString(_T("admin") + temp,_T("Account") + temp,dlg.m_Reg_strAccount,_T(".\\qqData.ini"));::WritePrivateProfileString(_T("admin") + temp,_T("Password") + temp,dlg.m_Reg_strPassword,_T(".\\qqData.ini"));::WritePrivateProfileString(_T("FileCount"),_T("Count"),temp,_T(".\\qqData.ini"));*pResult = 0;}void CLoginDlg::OnNMClickSyslinkFindpwd(NMHDR *pNMHDR, LRESULT *pResult){// TODO: 在此添加控件通知处理程序代码//PNMLINK pNMLink = (PNMLINK)pNMHDR;//::ShellExecute(m_hWnd, _T("open"), pNMLink->item.szUrl, NULL, NULL, SW_SHOWNORMAL);CSeekDlg dlg;dlg.DoModal();*pResult = 0;}BOOL CLoginDlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: 在此添加额外的初始化ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);CBitmap map1, map2, map3;map1.LoadBitmap(IDB_BITMAP1);m_btnList.SetBitmap(map1);map2.LoadBitmap(IDB_BITMAP9);m_btnJianPan.SetBitmap(map2);map3.LoadBitmap(IDB_BITMAP10);m_btnConfig.SetBitmap(map3);for (int i=0; i<3; ++i){toolTipCtrl[i].Create(this);}toolTipCtrl[0].AddTool(GetDlgItem(IDC_BUTTON_CONFIG), _T("设置"));toolTipCtrl[1].AddTool(GetDlgItem(IDC_BUTTON_MIN), _T("最小化"));toolTipCtrl[2].AddTool(GetDlgItem(IDC_BUTTON_CLOSE), _T("关闭"));m_nid.cbSize = (DWORD) sizeof(NOTIFYICONDATA);m_nid.hWnd = m_hWnd;m_nid.uID = IDI_OFFLINE;//IDR_MAINFRAME;m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_OFFLINE));m_nid.uFlags = NIF_ICON | NIF_MESSAGE|NIF_TIP;m_nid.uCallbackMessage = WM_SHOWTASK;wcscpy_s(m_nid.szTip,_T("QQ"));//实现任务栏无图标ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW,SWP_FRAMECHANGED);Shell_NotifyIcon(NIM_ADD, &m_nid);m_cLinkRegister.SetWindowText(_T("<ahref=\"/chs/index.html?from=client&ptlang=2052&regkey=&ADUIN=0&ADSESSION=0&ADT AG=CLIENT.QQ.4855_NewAccount_Btn.0&ADPUBNO=26095\">注册账号</a>"));m_cLinkFindpwd.SetWindowText(_T("<ahref=\"https:///cn2/findpsw/pc/pc_find_pwd_input_account?source_id=1003&ptlang=2052&aquin=105 8072426\">忘记密码</a>"));//获得本地配置文件中已经保存的账号数目int nCount = ::GetPrivateProfileInt(_T("FileCount"),_T("Count"),0,_T(".\\qq.ini"));CString strAccount;//保存读取配置文件后的账号CString strPassword;//保存读取配置文件后的账号的密码CString temp;//保存格式化字符串int nShow;//显示帐号的个数//如果本地文件帐号数目小于四个,则把显示的数目设为帐号数目,否则显示四个if (nCount <= 4){nShow = nCount;}elsenShow = 4;//动态构造一个数组,存储每个帐号的登录排名计数(当前登录排名为,其他排名在之前基础上加)int *a = new int [nCount + 1];memset(a,0,nCount + 1);//把每个帐号的排名计数赋值给对应的数组元素for (int i = 0;i < nCount;i++){temp.Format(_T("%d"),i + 1);a[i] = ::GetPrivateProfileInt(_T("admin") + temp,_T("Rank") + temp,0,_T(".\\qq.ini"));}//对排名计数进行排序int i;int j;int k;for(i = 0;i < nCount;i++)for(j = i + 1;j < nCount;j++)if(a[i] > a[j]){k = a[i];a[i] = a[j];a[j] = k;}//把排名计数前指定位数增加到组合框for(int n= 0;n < nShow;n++){for (j = 0;j < nCount;j++){temp.Format(_T("%d"),j+1);if (a[n] == ::GetPrivateProfileInt(_T("admin") + temp,_T("Rank") + temp,0,_T(".\\qq.ini"))){::GetPrivateProfileString(_T("admin") + temp,_T("Account") + temp,_T(""), strAccount.GetBuffer(MAX_PA TH),MAX_PA TH,_T(".\\qq.ini"));((CComboBox*)GetDlgItem(IDC_COMBO_USERNAME))->InsertString(n,strAccount);break;}}}//把上次登录的帐号显示到组合框中CString isLastLogin;////保存配置文件中的是否为上次登录的账号int nIndex = 0;//存储上次登录账号的下标CString strRemPassword;//保存配置文件中的记住密码选择状态CString strAutoLogin;//保存配置文件中的自动登录选择状态for(int i = 0;i < nCount;i++){temp.Format(_T("%d"),i + 1);::GetPrivateProfileString(_T("admin") + temp,_T("isLastLogin") + temp,_T(""),isLastLogin.GetBuffer(MAX_PA TH),MAX_PA TH,_T(".\\qq.ini"));if (isLastLogin == _T("1")){nIndex = i + 1;break;}}//获得上一次登录的帐号,密码,记住密码状态,自动登陆状态temp.Format(_T("%d"),nIndex);::GetPrivateProfileString(_T("admin") + temp,_T("Account") + temp,_T(""), strAccount.GetBuffer(MAX_PA TH),MAX_PA TH,_T(".\\qq.ini"));::GetPrivateProfileString(_T("admin") + temp,_T("Password") + temp,_T(""), strPassword.GetBuffer(MAX_PA TH),MAX_PA TH,_T(".\\qq.ini"));::GetPrivateProfileString(_T("admin") + temp,_T("isRemPassword") + temp,_T(""), strRemPassword.GetBuffer(MAX_PA TH),MAX_PA TH,_T(".\\qq.ini"));::GetPrivateProfileString(_T("admin") + temp,_T("isAutoLogin") + temp,_T(""), strAutoLogin.GetBuffer(MAX_PATH),MAX_PA TH,_T(".\\qq.ini"));if (strRemPassword == _T("1")){m_isRemPassword = TRUE;}elsem_isRemPassword = FALSE;if (strAutoLogin == _T("1")){m_isAutoLogin = TRUE;m_isRemPassword = TRUE;}elsem_isAutoLogin = FALSE;m_strPassord = strPassword;UpdateData(FALSE);SetDlgItemText(IDC_COMBO_USERNAME,strAccount);SetTimer(1,5000,NULL);//设置定时器,用于自动登录//释放内存delete []a;return TRUE; // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回FALSE}void CLoginDlg::OnBnClickedButtonList(){// TODO: 在此添加控件通知处理程序代码CMenu menu, *pMenu;menu.LoadMenu(IDR_MENU1);pMenu = menu.GetSubMenu(0);CBitmap bitmap0,bitmap1,bitmap2,bitmap3,bitmap4,bitmap5,bitmap6,bitmap7;bitmap0.LoadBitmap(IDB_BITMAP1);bitmap1.LoadBitmap(IDB_BITMAP2);bitmap2.LoadBitmap(IDB_BITMAP3);bitmap3.LoadBitmap(IDB_BITMAP4);bitmap4.LoadBitmap(IDB_BITMAP5);bitmap5.LoadBitmap(IDB_BITMAP6);/*bitmap6.LoadBitmap(IDB_BITMAP7);bitmap7.LoadBitmap(IDB_BITMAP8);*/pMenu->SetMenuItemBitmaps(0, MF_BYPOSITION, &bitmap0, &bitmap0);pMenu->SetMenuItemBitmaps(1, MF_BYPOSITION, &bitmap1, &bitmap1);pMenu->SetMenuItemBitmaps(3, MF_BYPOSITION, &bitmap2, &bitmap2);pMenu->SetMenuItemBitmaps(4, MF_BYPOSITION, &bitmap3, &bitmap3);pMenu->SetMenuItemBitmaps(5, MF_BYPOSITION, &bitmap4, &bitmap4);pMenu->SetMenuItemBitmaps(7, MF_BYPOSITION, &bitmap5, &bitmap5);/*pMenu->SetMenuItemBitmaps(6, MF_BYPOSITION, &bitmap0, &bitmap0);pMenu->SetMenuItemBitmaps(7, MF_BYPOSITION, &bitmap0, &bitmap0);*/CRect rect;GetDlgItem(IDC_BUTTON_LIST)->GetWindowRect(&rect);pMenu->TrackPopupMenu(TPM_LEFTBUTTON,rect.right-rect.Width(), rect.bottom, this, 0);}void CLoginDlg::OnPaint(){CPaintDC dc(this); // device context for paintingCBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP12);CRect rect;GetClientRect(&rect);CDC demo;demo.CreateCompatibleDC(&dc);demo.SelectObject(&bitmap);//dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &demo, 0, 0, bitMap.bmWidth, bitMap.bmHeight, SRCCOPY);dc.BitBlt(0, 0, rect.Width(), rect.Height(), &demo, 0, 0, SRCCOPY);// 不为绘图消息调用CDialog::OnPaint()}void CLoginDlg::OnOnlin(){// TODO: 在此添加命令处理程序代码CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);m_btnList.SetBitmap(bitmap);m_nIconID = IDI_IMONLINE;}void CLoginDlg::OnQme(){CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP2);m_btnList.SetBitmap(bitmap);m_nIconID = IDI_QME;// TODO: 在此添加命令处理程序代码}void CLoginDlg::OnLeave(){// TODO: 在此添加命令处理程序代码CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP3);m_btnList.SetBitmap(bitmap);m_nIconID = IDI_AWAY;}void CLoginDlg::OnBusy(){// TODO: 在此添加命令处理程序代码CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP4);m_btnList.SetBitmap(bitmap);m_nIconID = IDI_BUSY;}void CLoginDlg::OnDarao(){// TODO: 在此添加命令处理程序代码CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP5);m_btnList.SetBitmap(bitmap);m_nIconID = IDI_MUTE;}void CLoginDlg::OnYinshen(){// TODO: 在此添加命令处理程序代码CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP6);m_btnList.SetBitmap(bitmap);m_nIconID = IDI_INVISIBLE;}BOOL CLoginDlg::PreTranslateMessage(MSG* pMsg){// TODO: 在此添加专用代码和/或调用基类if (pMsg->message== WM_LBUTTONDOWN ||pMsg->message== WM_LBUTTONUP ||pMsg->message== WM_MOUSEMOVE)for (int i=0; i<3; ++i){toolTipCtrl[i].RelayEvent(pMsg);}return CDialog::PreTranslateMessage(pMsg);}void CLoginDlg::Onshowwindow(){// TODO: 在此添加命令处理程序代码ShowWindow(SW_SHOW);}void CLoginDlg::OnButtonClose(){// TODO: 在此添加命令处理程序代码PostMessage(WM_QUIT);ToTray(TRUE);}void CLoginDlg::OnBnClickedButtonClose(){static CRect rectLarge;static CRect rectSmall;if (rectLarge.IsRectNull()){CRect rectSeparator;GetWindowRect(&rectLarge);//获得变小前的对话框面积GetDlgItem(IDC_STATIC)->GetWindowRect(&rectSeparator);rectSmall.left = rectLarge.left;rectSmall.top = rectLarge.top;rectSmall.right = rectLarge.right;rectSmall.bottom = rectSeparator.bottom;}for (int i = rectSmall.Height(); i>=0; i--){SetWindowPos(NULL, 0, 0, rectSmall.Width(), i, SWP_NOMOVE | SWP_NOZORDER);Sleep(5);}//OnOK();PostMessage(WM_QUIT);ToTray(TRUE);}void CLoginDlg::OnBnClickedButtonMin(){// TODO: 在此添加控件通知处理程序代码ShowWindow(SW_HIDE);ToTray(TRUE);}void CLoginDlg::OnBnClickedButtonJianpan(){// TODO: 在此添加控件通知处理程序代码}void CLoginDlg::OnCbnSelchangeComboUsername(){m_isFirstLoginAccount=FALSE;//表示不是第一次登录的账号//获取当前选择的行,并显示到列表框中int nIndex = ((CComboBox*)GetDlgItem(IDC_COMBO_USERNAME))->GetCurSel();int nCount = ::GetPrivateProfileInt(_T("FileCount"),_T("Count"),0,_T(".\\qq.ini"));((CComboBox*)GetDlgItem(IDC_COMBO_USERNAME))->GetLBText(nIndex,m_strUsername);int n=0;//保存账号在配置文件中的下标CString temp;//保存格式化的字符串CString strAccount;//保存在配置文件中的读取到的账号CString strPassword;//保存在配置文件中的读取到的账号的密码CString strRemPassword;//保存最近一次账号登录的记住密码状态CString strAutoLogin;//保存最近一次账号登录的自动登录状态//遍历配置文件,判断上次保存的密码记住状态!for(int i = 0;i < nCount;i++){temp.Format(_T("%d"),i + 1);::GetPrivateProfileString(_T("admin")+temp,_T("Account")+temp,_T(""),strAccount.GetBuffer(MAX_PA TH),MAX_PA TH,_T(".\\qq.ini"));if (m_strUsername == strAccount){n=i+1;::GetPrivateProfileString(_T("admin")+temp,_T("isRemPassword")+temp,_T(""),strRemPassword.GetBuffe r(MAX_PA TH),MAX_PA TH,_T(".\\qq.ini"));if (strRemPassword==_T("1")){m_isRemPassword=TRUE;}elsem_isRemPassword=FALSE;break;}}//再考虑自动登录框的选择状态::GetPrivateProfileString(_T("admin")+temp,_T("isAutoLogin")+temp,_T(""),strAutoLogin.GetBuffer(MAX_PATH),MAX_PA TH,_T(".\\qq.ini"));//如果是自动登录,那要记住密码if(strAutoLogin == _T("1")){m_isRemPassword = TRUE;m_isAutoLogin = TRUE;}elsem_isAutoLogin = FALSE;temp.Format(_T("%d"),n);::GetPrivateProfileString(_T("admin") + temp,_T("Password") + temp,_T(""), strPassword.GetBuffer(MAX_PA TH),MAX_PA TH,_T(".\\qq.ini"));m_strPassord = strPassword;SetDlgItemText(IDC_EDIT_PASSWORD,m_strPassord);CButton *ptn = (CButton*)GetDlgItem(IDC_CHECK_SA VEPWD); //获得CheckBox的指针ptn->SetCheck(m_isRemPassword);//设置记住密码框选择状态CButton *qtn = (CButton*)GetDlgItem(IDC_CHECK_AUTOLOGIN); //获得CheckBox的指针qtn->SetCheck(m_isAutoLogin);//设置自动登录框选择状态}void CLoginDlg::OnBnClickedCheckSavepwd(){//如果记住密码状态没有选,则自动登录也不能选CButton *pRemPassWord = (CButton*)GetDlgItem(IDC_CHECK_SA VEPWD);CButton *pBtnAutoLogin = (CButton*)GetDlgItem(IDC_CHECK_AUTOLOGIN);if (pRemPassWord->GetCheck() == 0){pBtnAutoLogin->SetCheck(0);}}void CLoginDlg::OnBnClickedCheckAutologin(){// TODO: 在此添加控件通知处理程序代码//如果当前不是自动登录状态,则单击后,为自动登录状态,否则取消自动登录状态if (!m_isAutoLogin){m_isAutoLogin = TRUE;m_isRemPassword = TRUE; //如果为自动登录状态,则应该记住密码CButton *q = (CButton*)GetDlgItem(IDC_CHECK_SA VEPWD);q->SetCheck(m_isRemPassword);}else{m_isAutoLogin = FALSE;}CButton *p = (CButton*)GetDlgItem(IDC_CHECK_AUTOLOGIN); //获得CheckBox的指针p->SetCheck(m_isAutoLogin);//设置选择状态}void CLoginDlg::OnTimer(UINT_PTR nIDEvent){// 如果是不是上一次登录的账号,则返回if(!m_isFirstLoginAccount)return;UpdateData();int nCount=::GetPrivateProfileInt(_T("FileCount"),_T("Count"),0,_T(".\\qq.ini"));CString temp;//存储格式化字符串CString strAccount;//存储读取文件中的账号CString strPassword;//存储读取文件中的密码CString strAutoLogin;//存储读取文件中的自动登录状态//遍历配置文件,找到当前输入的账号密码,取得该账号的自动登录的选择状态for(int i = 0;i < nCount;i++){temp.Format(_T("%d"),i + 1);::GetPrivateProfileString(_T("admin")+temp,_T("Account")+temp,m_strUsername, strAccount.GetBuffer(MAX_PA TH),MAX_PA TH,_T(".\\qq.ini"));::GetPrivateProfileString(_T("admin")+temp,_T("Password")+temp,_T(""), strPassword.GetBuffer(MAX_PA TH),MAX_PA TH,_T(".\\qq.ini"));if ((m_strUsername == strAccount)&&(m_strPassord == strPassword)){::GetPrivateProfileString(_T("admin")+temp,_T("isAutoLogin")+temp,_T(""), strAutoLogin.GetBuffer(MAX_PATH),MAX_PA TH,_T(".\\qq.ini"));//如果为自动登录状态,则调用OnOk,关闭定时器if (strAutoLogin == _T("1")){OnOK();KillTimer(1);break;}}}CDialog::OnTimer(nIDEvent);}void CLoginDlg::OnOpenmainpanel(){//托盘右键菜单实现,隐藏主面板ShowWindow(SW_SHOW);}void CLoginDlg::OnHideWindows(){//托盘右键菜单实现,打开主面板ShowWindow(SW_HIDE);}主界面.h// QQDemoDlg.h : 头文件//#pragma once#include"Linkname.h"#include"RoomDlg.h"#include"GroupDlg.h"#include"SessionDlg.h"#include"Twitter.h"#include"afxwin.h"#include"EditDlg.h"// CQQDemoDlg 对话框class CQQDemoDlg : public CDialog{// 构造public:CQQDemoDlg(CWnd* pParent = NULL); // 标准构造函数~CQQDemoDlg();// 对话框数据enum { IDD = IDD_QQDEMO_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现public:void ToTray(DWORD dwMessage,HICON hIcon);//用于托盘的增加,修改,删除操作protected://修正移动时窗口的大小void FixMoving(UINT fwSide, LPRECT pRect);//修正改改变窗口大小时窗口的大小void FixSizing(UINT fwSide, LPRECT pRect);//从收缩状态显示窗口void DoShow();//从显示状态收缩窗口void DoHide();//重载函数,只是为了方便调用BOOL SetWindowPos(const CWnd* pWndInsertAfter,LPCRECT pCRect, UINT nFlags = SWP_SHOWWINDOW);afx_msg void OnTimer(UINT nIDEvent);afx_msg void OnSizing(UINT fwSide, LPRECT pRect);afx_msg int OnCreate(LPCREA TESTRUCT lpCreateStruct);afx_msg void OnMoving(UINT fwSide, LPRECT pRect);。

(完整)基于MFC仿QQ聊天程序设计完整实例教程

(完整)基于MFC仿QQ聊天程序设计完整实例教程

本系统基于客户端/服务器基本原理,程序即是服务端,也是客户端,通过IP就可以相互添加好友,并且实现点到点通信,有聊天记录(未实现根据用户发送的消息而改变字体颜色,只能在客户端改),字体颜色设置(一改全改~),包含主界面MaindBord和聊天Talk两大功能模块。

(1) MaindBord模块A、登录模块登陆模块的实现过程有下面几个步骤:(1)初始化列表信息,获取用户名,服务器的IP地址,使按键失效(2)确认登陆后创建套接字,绑定,监听(3)初始化成功后,激活添加好友和隐藏功能B、好友模块添加好友的实现过程有下面几个步骤:(1)弹出对话框(2)获取对话框中的IP(3)检查对方是否在线,建立连接(4)发送请求验证C、好友列表模块(1)客户接收请求,将服务端加入列表,发送客户端信息(2)服务端得到客户端信息,加入列表(3)双击好友列表,弹出发送信息对话框D、隐藏模块(1)隐藏与显示(2)响应鼠标,弹出控制菜单(2)聊天Talk模块A、发送信息模块聊天模块中,发送信息模块的实现过程有下面几个步骤:(1)通过列表双击一个好友为聊天对象,弹出聊天窗口;(2)用户按下发送按钮后,检测对方是否在线,检测对方是否在线(3)将聊天内容发送出去(4)在本地即时聊天内容显示的编辑框中添加发送的内容并写入聊天记录。

B、接收信息模块聊天模块中,接收信息模块的实现过程有下面几个步骤:(1)由主界面判断接收到信息的类型,是否为好友发来信息,如果是,则打开聊天窗口(2)读取消息,并写入聊天记录,(3)载入字体颜色信息。

(4) 显示聊天记录C、聊天记录管理模块聊天记录管理模块的实现过程有下面几个步骤:(1)将发送内容和接收内容写入文本文件;(2)显示聊天记录;(3)删除聊天记录。

D、字体颜色模块实现字体颜色模块的过程有下面几个步骤:(1)调用系统字体,获取字体,写入存档(2) 调用系统字体颜色,获取颜色,写入存档(3)读取、更新字体颜色。

QQ模拟聊天软件程序设计(编码)

QQ模拟聊天软件程序设计(编码)

QQ模拟聊天软件程序设计(编码)版本:V1.0文档名称:QQ模拟聊天软件程序设计(编码)项目名称:QQ模拟聊天软件项目负责人:XX评审日期: 2012年12月5日目录1、前言 (3)1. 背景 (3)2. 规范实施建议 (3)3. 定义和约定 (3)2、格式规范 (3)1. 缩进 (3)2. 行长度 (3)3. 声明 (4)a) 声明变量、常量 (4)b) 声明类 (4)4. 语句 (4)3、命名规范 (5)1. 通用规则 (5)2. 项目规则 (5)3. 附加说明 (6)4、组织规范 (6)1. web工程目录规范 (6)2. 引入包规范 (6)5、注释规范 (6)1. 通用注释规则 (6)a) 说明 (6)b)javadoc注释标签语法定义说明 (6)2. 类的注释 (7)3. 方法的注释 (7)4. 失效代码块的注释 (7)5. 分支语句的注释 (8)6. 变量、常量的注释 (8)6、异常处理规范 (9)7、补充规范 (9)一、前言1. 背景在项目开发维护中,编码规范作为开发规范的一个组成部分,是十分重要和必须的,它不仅仅是为了提高开发效率,也有利于降低后期维护开发的成本。

编码规范的根本目的就是要让不仅代码可以一目了然,也可以很容易的理解开发人员所编写的代码程的用途和意义。

由此,用来减少项目中因为开发维护人员的更替或由于长时间不维护造成的记忆模糊或混乱等情况带来的对代码所实现的真正功能的理解困难和歧义。

另外也提高了代码复查效率和效果。

2. 规范实施建议不是为了规范而规范,以提高软件开发质量和效率为目标,逐步改进编码规范化水平对于格式规范、注释规范等部分规范的要求,java代码可以通过使用eclipse自带的Format方法(快捷键:Ctrl+Shift+F)进行自动格式化,可以提高开发效率又符合编码规范。

3. 定义和约定第1个字符大写,其后每个单词的第1个字母大写第1个字符小写,其后每个单词的第1个字母大写二、格式规范1. 缩进使用Tab键缩进;不允许使用空格键进行缩进。

模拟qq聊天小程序课程设计

模拟qq聊天小程序课程设计

模拟qq聊天小程序课程设计一、课程目标知识目标:1. 学生能够理解并掌握QQ聊天小程序的基本原理和功能。

2. 学生能够了解并运用程序设计中的顺序、选择和循环结构。

3. 学生能够掌握在QQ聊天小程序中实现文字、表情发送和接收的基本方法。

技能目标:1. 学生能够运用所学知识,设计并编写一个简单的模拟QQ聊天小程序。

2. 学生能够在编写程序过程中,熟练使用编程软件,掌握调试和修改程序的基本技巧。

3. 学生能够通过小组合作,提高沟通与协作能力,共同完成课程任务。

情感态度价值观目标:1. 学生培养对编程的兴趣和热情,树立编程改变生活的信念。

2. 学生在学习过程中,培养解决问题的能力和勇于尝试的精神。

3. 学生通过课程学习,认识到网络交流的重要性,提高网络素养,尊重网络道德规范。

本课程针对初中年级学生,结合教材内容,注重实用性,旨在让学生在掌握编程知识的同时,提高实际操作能力和团队协作能力。

课程目标具体、可衡量,便于学生和教师在教学过程中明确预期成果,为后续的教学设计和评估提供依据。

二、教学内容本章节教学内容主要包括以下三个方面:1. 程序设计基础知识:- 了解编程语言的基本概念,如变量、数据类型、运算符等。

- 学习程序设计的基本结构,包括顺序、选择和循环结构。

2. QQ聊天小程序功能实现:- 分析QQ聊天小程序的功能需求,明确文字、表情发送和接收的实现方法。

- 学习使用编程语言实现聊天界面设计、消息发送与接收等核心功能。

3. 实践与拓展:- 制定实践任务,分组进行模拟QQ聊天小程序的开发,培养学生的实际操作能力。

- 结合教材相关章节,拓展学习网络编程知识,了解实际应用场景。

教学内容安排和进度如下:1. 程序设计基础知识(2课时)2. QQ聊天小程序功能实现(3课时)3. 实践与拓展(2课时)本教学内容紧密结合课程目标,注重科学性和系统性,按照教学大纲逐步推进,确保学生能够学以致用,提高编程实践能力。

教学内容与教材章节紧密关联,为学生提供清晰的学习路径和丰富的学习资源。

仿qq软件课课程设计

仿qq软件课课程设计

仿qq软件课课程设计一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。

知识目标要求学生掌握QQ软件的基本功能,如即时通讯、文件传输、语音视频通话等。

技能目标要求学生能够熟练操作QQ软件,进行信息的发送和接收、文件的传输和共享、语音视频通话的建立和结束等。

情感态度价值观目标要求学生树立正确的网络交往观念,认识到网络交流的工具性,注重个人信息的保护,遵守网络道德规范,促进良好的网络环境的建设。

二、教学内容本课程的教学内容主要包括QQ软件的基本功能和使用方法。

首先,介绍QQ软件的下载和安装方法,以及账号的注册和登录过程。

然后,详细讲解QQ软件的界面结构和功能模块,如消息、联系人、群聊、文件传输等。

接着,通过实际操作演示,引导学生掌握QQ软件的使用方法,如发送和接收消息、发起语音视频通话、传输文件等。

最后,结合实例,介绍QQ软件的高级功能和技巧,如自定义QQ界面、设置消息提醒、使用QQ群功能等。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法。

首先,通过讲授法,向学生传授QQ软件的基本知识和使用方法。

其次,利用讨论法,学生进行小组讨论,分享彼此的操作经验和技巧。

然后,采用案例分析法,分析实际案例,让学生了解QQ软件在实际生活中的应用和价值。

最后,运用实验法,让学生亲自动手操作QQ软件,进行实践操作和练习。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备适当的教学资源。

教材方面,我们将使用《计算机应用基础》教材,该书详细介绍了QQ软件的使用方法和技巧。

参考书方面,我们将推荐《QQ使用技巧手册》等书籍,供学生课后阅读和参考。

多媒体资料方面,我们将制作PPT演示文稿,以图文并茂的形式展示QQ软件的操作过程和功能特点。

实验设备方面,我们将准备计算机实验室,确保每个学生都能有机会亲自操作QQ软件。

五、教学评估本课程的教学评估方式包括平时表现、作业和考试三个部分,以保证评估的客观性和公正性。

(完整)基于MFC仿QQ聊天程序设计完整实例教程

(完整)基于MFC仿QQ聊天程序设计完整实例教程

本系统基于客户端/服务器基本原理,程序即是服务端,也是客户端,通过IP就可以相互添加好友,并且实现点到点通信,有聊天记录(未实现根据用户发送的消息而改变字体颜色,只能在客户端改),字体颜色设置(一改全改~),包含主界面MaindBord和聊天Talk两大功能模块。

(1) MaindBord模块A、登录模块登陆模块的实现过程有下面几个步骤:(1)初始化列表信息,获取用户名,服务器的IP地址,使按键失效(2)确认登陆后创建套接字,绑定,监听(3)初始化成功后,激活添加好友和隐藏功能B、好友模块添加好友的实现过程有下面几个步骤:(1)弹出对话框(2)获取对话框中的IP(3)检查对方是否在线,建立连接(4)发送请求验证C、好友列表模块(1)客户接收请求,将服务端加入列表,发送客户端信息(2)服务端得到客户端信息,加入列表(3)双击好友列表,弹出发送信息对话框D、隐藏模块(1)隐藏与显示(2)响应鼠标,弹出控制菜单(2)聊天Talk模块A、发送信息模块聊天模块中,发送信息模块的实现过程有下面几个步骤:(1)通过列表双击一个好友为聊天对象,弹出聊天窗口;(2)用户按下发送按钮后,检测对方是否在线,检测对方是否在线(3)将聊天内容发送出去(4)在本地即时聊天内容显示的编辑框中添加发送的内容并写入聊天记录。

B、接收信息模块聊天模块中,接收信息模块的实现过程有下面几个步骤:(1)由主界面判断接收到信息的类型,是否为好友发来信息,如果是,则打开聊天窗口(2)读取消息,并写入聊天记录,(3)载入字体颜色信息。

(4) 显示聊天记录C、聊天记录管理模块聊天记录管理模块的实现过程有下面几个步骤:(1)将发送内容和接收内容写入文本文件;(2)显示聊天记录;(3)删除聊天记录。

D、字体颜色模块实现字体颜色模块的过程有下面几个步骤:(1)调用系统字体,获取字体,写入存档(2) 调用系统字体颜色,获取颜色,写入存档(3)读取、更新字体颜色。

java课程设计仿qq

java课程设计仿qq

java课程设计仿qq一、教学目标本章节的教学目标旨在让学生掌握Java编程语言的基本知识,学会使用Java 编写简单的应用程序,并通过仿QQ的项目实践,培养学生解决实际问题的能力。

具体分为以下三个部分:1.知识目标:(1)了解Java语言的基本语法和结构;(2)掌握Java中的面向对象编程思想;(3)熟悉Java常用类库和API;(4)理解Java多线程编程的基本概念。

2.技能目标:(1)能够使用Java编写简单的控制台应用程序;(2)学会使用Java编写GUI应用程序;(3)掌握Java网络编程的基本方法;(4)能够独立完成一个仿QQ的简单项目。

3.情感态度价值观目标:(1)培养学生的编程兴趣,提高自主学习能力;(2)培养学生团队协作、交流分享的好习惯;(3)培养学生勇于面对困难,积极解决问题的精神。

二、教学内容本章节的教学内容主要包括以下几个部分:1.Java语言基本语法和结构;2.面向对象编程思想及其应用;3.Java常用类库和API;4.Java多线程编程;5.Java网络编程;6.仿QQ项目实践。

三、教学方法为了提高教学效果,本章节将采用以下教学方法:1.讲授法:讲解Java语言的基本语法、面向对象编程思想、常用类库和API等知识;2.案例分析法:分析典型实例,让学生更好地理解Java编程方法;3.实验法:让学生动手实践,完成仿QQ项目,提高实际编程能力;4.讨论法:分组讨论,培养学生的团队协作能力和解决问题的能力。

四、教学资源为了支持教学,我们将提供以下教学资源:1.教材:Java编程语言相关教材;2.参考书:提供Java编程相关参考书籍;3.多媒体资料:制作PPT、视频等教学课件;4.实验设备:提供计算机实验室,让学生进行编程实践。

五、教学评估本章节的教学评估将采用多元化的评估方式,以全面、客观、公正地评价学生的学习成果。

评估方式包括:1.平时表现:通过课堂参与、提问、讨论等方式评估学生的学习态度和积极性;2.作业:布置适量的作业,评估学生的编程能力和对知识的理解程度;3.考试:定期进行笔试和机试,评估学生的知识掌握情况和解决问题的能力;4.项目实践:评估学生在完成仿QQ项目过程中的表现,包括编程能力、团队协作和解决问题能力。

C语言制作简易类QQIM

C语言制作简易类QQIM

类QQ的简易IM制作曹玉坤2011-7-14目录1 概述 (3)2 功能 (3)2.1 功能需求 (3)2.2 功能分析 (4)3 架构 (5)3.1 服务器端 (5)3.2 客户端 (8)4 代码 (9)4.1 服务器端代码 (9)4.2 客户端代码 (15)4.3 运行结果 (17)5 常见问题 (18)图图表 1 服务器启动 (17)图表 2 客户端2启动 (18)图表 3 客户端1启动 (18)1概述我们对QQ之类的即时通讯软件(IM)不会感到陌生,除了QQ之外,我们还能见到如百度hi、UC、YY、ICQ、SKYPE和360的COCO(这得和腾讯有多大的仇啊)等等。

其功能都大同小异,就是不同客户端间相互传递信息,文件包括图像文件和声音文件等等,当然有的如QQ还包括远程控制功能等其他辅助的功能。

这里我们也来做一个类似功能的软件,包括服务器端和客户端。

我们不做那么多功能,本文只是实现最基本的文字信息交换功能。

本文从功能分析开始,详细的介绍IM应具有的功能点及其架构,并通过后面的实例来详细说明,供大家参考交流。

2功能本节主要分析IM应该具有的功能,从用户需求的角度讲解,让大家更清晰的了解IM的功能点。

2.1 功能需求大家可以回想一下,我们在用QQ等聊天工具跟别人聊天时,需要哪些功能。

首先我们得知道谁都在线上,就是说要显示可以聊天的对象信息。

其次我们要能把自己的信息发送出去;再次我们要能接收到聊天对方发来的信息。

其实我们在这里实现的功能就这三点,达到我们基本信息交流的要求。

我们把功能列出来就是:1.显示在线人员;2.发送信息;3.接收信息;以上是我们站在客户端的角度上需要的功能。

那么主机端需要什么功能?我们知道主机端是为客户端服务的,也就是它要提供条件来满足客户端的需求。

首先,我们看看显示在线人员。

显示在线人员,什么样算是在线人员呢?大家知道只有与主机连接的客户端算作在线,那么要将在线信息发送给客户端,就要登记每个连接在主机上客户端的信息,还要对已下线的客户端状态进行更改,以保证发送给各个客户端的信息都是最新的和正确的。

数据库仿QQ软件

数据库仿QQ软件

实验报告成 绩2014年5月 日 课程名称 《数据库技术》 学生姓名 学 号 专业班级 指导教师 张国富 杨仁志实验名称:仿QQ聊天软件设计1.实验目的(1)掌握Access、MySQL数据库编程。

(2)掌握Socket编程。

(3)注意:后台数据库采用Access的成绩为“及格”,采用MySQL的成绩为“良”,实现消息和文件同时传送的成绩在原基础上提高一个等级。

2.实验设备和条件硬件环境:PC机软件环境:操作系统:Windows 或者LinuxDBMS:Access 或者MySQL语言环境:Visual C++ 或者GCC辅助资料:请从/agent/useful links.html下载“综合实验辅助资料”。

3.实验要求(1)进入Access或者MySQL控制台,用SQL语言创建数据库“qq”,内建表格“Information”如下:(2)软件界面设计如下:(注意:创建的工程名必须是你的学号,其他形式一律0分)(3)完善“综合实验辅助资料”中的QQSever,利用测试客户端验证:服务器正确接收信息,并存入Information表格,同时显示在软件界面上!4.实验内容(1)数据库设计:写出创建所需数据库和表格的SQL语言,并对设计出的表格进行抓图。

(10分)SHOW DATABASES;CREATE DATABASE qq;USE qq;SHOWTABLES;CREATETABLEinformation(IPaddressVARCHAR(200),MessageVARCHAR(200));DESCRIBEinformatio;(2)写出关键代码实现将接收到的消息写到后台Information表格中,并对数据库中的表格进行抓图。

(30分)CString strSQL;strSQL.Format("insert into information(IPaddress,Message) values(\'%s\',\'%s\')",inet_ntoa(cliaddr.sin_addr),buffer);if(mysql_real_query(&mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){AfxMessageBox("信息存入失败");}写出关键代码实现Information表格中的所有数据显示在ListCtr上,并对软件界面进行抓图。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档