实例介绍
【实例简介】
1、实现双向视频通话,VS2008工程,编译直接运行即可;
2、可执行程序在:client\bin\x86\Debug目录下;
3、自己部署服务器,直接运行:server\run.bat,在电脑右下角托盘区域会出现运行图标;
4、编解码部分用了第三方的库,效果不错,画面清晰,实时性非常好;
1、实现双向视频通话,VS2008工程,编译直接运行即可;
2、可执行程序在:client\bin\x86\Debug目录下;
3、自己部署服务器,直接运行:server\run.bat,在电脑右下角托盘区域会出现运行图标;
4、编解码部分用了第三方的库,效果不错,画面清晰,实时性非常好;
【实例截图】
【核心代码】
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;//DLLImport
using System.IO;
using ANYCHATAPI;
namespace AnyChatCSharpDemo
{
public partial class frmRoom : Form
{
#region 定义窗体委托
delegate void AsyncTransFileStatus(int m_UserID, int m_TaskID);
delegate void AsyncTransSetFileProgress(string m_Progress);
#endregion
#region 定义控件
//用户视频信息提示Label
Label lbl_user = new System.Windows.Forms.Label();
#endregion
#region 文件传输变量定义
int m_ReceiveUserID = -1;
int m_ReceiveTaskID = -1;
#endregion
#region 调用WIN的API
/// <summary>
/// 调节声音大小
/// </summary>
/// <param name="deviceID"></param>
/// <param name="Volume"></param>
/// <returns></returns>
[DllImport("winmm.dll", EntryPoint = "waveOutSetVolume", CharSet = CharSet.Auto)]
public static extern long waveOutSetVolume(long deviceID, long Volume);
#endregion
#region 窗体信息定义
/// <summary>
/// 字体名称
/// </summary>
public string[] m_AllFontSizeName ={ "8", "9", "10", "12", "14", "16", "18", "20", "22", "24", "26", "28", "36", "48", "72", "初号", "小初", "一号", "小一", "二号", "小二", "三号", "小三", "四号", "小四", "五号", "小五", "六号", "小六", "七号", "八号" };
/// <summary>
/// 字号
/// </summary>
public float[] m_AllFontSize ={ 8, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72, 42, 36, 26, 24, 22, 18, 16, 15, 14, 12, 10.5F, 9, 7.5F, 6.5F, 5.5F, 5 };
//1=160*120;2=176*144; 3=320*240; 4=352*288; 5=528*384; 6=640*480; 7=704*576
/// <summary>
/// 视频放大宽度
/// </summary>
private int m_VideoWidthMax = 480;
/// <summary>
/// 视频放大高度
/// </summary>
private int m_VideoHeightMax = 384;
/// <summary>
/// 本地视频状态,true为发送本地视频,false为不发送
/// </summary>
private bool m_LocalVideoStatue = true;
/// <summary>
/// 本地音频状态,true为发送本地音频,false为不发送
/// </summary>
private bool m_LocalAudioStatue = true;
#endregion
#region 房间信息定义
/// <summary>
/// 几列视频窗口(横着几个视频窗口)
/// </summary>
private int m_ColUserVideo = 3;
/// <summary>
/// 房间ID
/// </summary>
private int m_RoomID = 1;
/// <summary>
/// 用户ID(系统自动分配)
/// </summary>
private int m_myUserID = -1;
/// <summary>
/// 房间用户列表(不包括自己),开发包自带
/// </summary>
private List<int> m_others = new List<int>();
/// <summary>
/// 用户列表(包含用户结构属性)
/// </summary>
private List<clsMemberList.MemberItem> m_MemberItem=new List<clsMemberList.MemberItem>();
#endregion
#region 构造函数
public frmRoom()
{
InitializeComponent();
}
#endregion
#region 初始化房间
void InitChat()
{
string path = Application.StartupPath;
SystemSetting.Text_OnReceive = new TextReceivedHandler(Received_Text);//文本回调涵数
SystemSetting.TransBuffer_OnReceive = new TransBufferReceivedHandler(Received_TransBuffer);//透明通道传输回调
SystemSetting.TransFile_OnReceive = new TransFileReceivedHandler(Received_TransFile);//文件传输回调
AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_CORESDK_PATH, path, path.Length);
SystemSetting.Init(this.Handle);
////设置视频分辨率
//int m_Refw = AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_WIDTHCTRL, ref frmLogin.m_LocalVideoWidth, sizeof(int));
//int m_Refh = AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_HEIGHTCTRL, ref frmLogin.m_LocalVideoHeight, sizeof(int));
////应用本地视频编码参数,使得前述修改即时生效(参数为int型:1 使用新参数,0 使用默认参数)
//int m_AppLocal = 1;
//AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_APPLYPARAM, ref m_AppLocal, sizeof(int));
//StringBuilder m_ServerKey = new StringBuilder();
//m_ServerKey.Append("d");
//int retkey = AnyChatCoreSDK.SetServerAuthPass(m_ServerKey);
int ret = AnyChatCoreSDK.Connect(frmLogin.m_VideoServerIP, frmLogin.m_VideoTcpPort);
ret = AnyChatCoreSDK.Login(frmLogin.m_UserName, "", 0);
}
#endregion
#region 文件传输
#region 显示文件传输状态
private void Receive_GransFileStatus(int m_UserID, int m_TaskID)
{
m_ReceiveUserID = m_UserID;
m_ReceiveTaskID = m_TaskID;
//MessageBox.Show("U:" m_ReceiveUserID.ToString() "T:" m_ReceiveTaskID.ToString());
//txt_2.BeginInvoke(new AsyncTransSetFileProgress(SetTxtValue), m_ReceiveUserID.ToString() ":" m_ReceiveTaskID.ToString());
}
#endregion
#region 每秒更新文件进度
private void tmr_receivefile_Tick(object sender, EventArgs e)
{
//每秒更新视频码率
int m_AVInfoval = 0;
int avret = AnyChatCoreSDK.QueryUserState(-1, AnyChatCoreSDK.BRAC_USERSTATE_VIDEOBITRATE, ref m_AVInfoval, sizeof(int));
string m_AVSpeed = m_AVInfoval.ToString() "B/S";
if (m_AVInfoval > 1000)
{
try
{
double m_AVTemp = (double)m_AVInfoval / 1000.0;
m_AVSpeed = m_AVTemp.ToString();
m_AVSpeed = m_AVSpeed.Substring(0, m_AVSpeed.Length - 2) "KB/S";
}
catch { }
}
lbl_v_speed.BeginInvoke(new AsyncTransSetFileProgress(SetVideoSpeed), m_AVSpeed);
//每秒更新音频码率
avret = AnyChatCoreSDK.QueryUserState(-1, AnyChatCoreSDK.BRAC_USERSTATE_AUDIOBITRATE, ref m_AVInfoval, sizeof(int));
m_AVSpeed = m_AVInfoval.ToString() "B/S";
if (m_AVInfoval > 1000)
{
try
{
double m_AVTemp = (double)m_AVInfoval / 1000.0;
m_AVSpeed = m_AVTemp.ToString();
m_AVSpeed = m_AVSpeed.Substring(0, m_AVSpeed.Length - 2) "KB/S";
}
catch { }
}
lbl_a_speed.BeginInvoke(new AsyncTransSetFileProgress(SetAudioSpeed), m_AVSpeed);
//StringBuilder m_InfoVal = new StringBuilder(300);
//int ret = AnyChatCoreSDK.QueryTransTaskInfo(m_ReceiveUserID, m_ReceiveTaskID, 1, m_InfoVal, 300);
//double m_InfoVal = 0.0;
//int ret = AnyChatCoreSDK.QueryTransTaskInfo(m_ReceiveUserID, m_ReceiveTaskID, 1, ref m_InfoVal, 300);
//lbl_progress.BeginInvoke(new AsyncTransSetFileProgress(SetTransFileProgress), ret.ToString() ":" m_InfoVal.ToString());
//int m_InfoVal = 0;
double m_InfoVal = 0.0;
int ret = AnyChatCoreSDK.QueryTransTaskInfo(m_ReceiveUserID, m_ReceiveTaskID, 1, ref m_InfoVal, sizeof(double));
if(ret != 0)
return;
string m_BFB = m_InfoVal.ToString();
try
{
m_BFB = m_BFB.Substring(0, m_BFB.IndexOf(".") 3);
}
catch { }
m_BFB = "%";
lbl_progress.BeginInvoke(new AsyncTransSetFileProgress(SetTransFileProgress), "进度:" m_BFB);
int m_InfoValSpeed = 1;
int rett = AnyChatCoreSDK.QueryTransTaskInfo(m_ReceiveUserID, m_ReceiveTaskID, 2, ref m_InfoValSpeed, sizeof(int));
string m_VSpeed = "";
double m_Templv = 0.0;
m_VSpeed = m_InfoValSpeed.ToString() "B/S";
if (m_InfoValSpeed > 1000)
{
m_Templv = (double)m_InfoValSpeed / 1000.0;
m_VSpeed = m_Templv.ToString();
try
{
m_VSpeed = m_VSpeed.Substring(0, m_VSpeed.IndexOf(".") 2);
}
catch { }
m_VSpeed =m_VSpeed "KB/S";
}
if (m_InfoValSpeed > 1000000)
{
m_Templv = (double)m_InfoValSpeed / 1000000.0;
m_VSpeed = m_Templv.ToString();
try
{
m_VSpeed = m_VSpeed.Substring(0, m_VSpeed.IndexOf(".") 2);
}
catch { }
m_VSpeed = m_VSpeed "MB/S";
}
lbl_speed.BeginInvoke(new AsyncTransSetFileProgress(SetTransFileSpeed), "速率:" m_VSpeed);
}
#endregion
#region 异步设置文件进度
private void SetTransFileProgress(string m_Progress)
{
lbl_progress.Text = m_Progress;
}
private void SetTransFileSpeed(string m_Speed)
{
lbl_speed.Text = m_Speed;
}
#endregion
#region 异步设置文本框值
private void SetTxtValue(string m_Txt)
{
//txt_2.Text = m_Txt;
}
#endregion
#region 异步设置视频码率
private void SetVideoSpeed(string m_VSpeed)
{
lbl_v_speed.Text = "视频码率:" m_VSpeed;
}
#endregion
#region 异步设置音频码率
private void SetAudioSpeed(string m_ASpeed)
{
lbl_a_speed.Text = "音频码率:" m_ASpeed;
}
#endregion
#endregion
#region 显示文本
/// <summary>
/// 显示聊天文本
/// </summary>
/// <param name="fromUID"></param>
/// <param name="toUID"></param>
/// <param name="m_Text"></param>
/// <param name="isserect"></param>
void Received_Text(int fromUID, int toUID, string m_Text, bool isserect)
{
string m_FromName = GetUserNameByID(fromUID);
string m_ToName = GetUserNameByID(toUID);
if (toUID == -1) m_ToName = "大家";
string m_DispMsg = m_FromName " To " m_ToName " ";
ShowText(m_DispMsg, txt_Accept.TextLength, m_DispMsg.Length, Color.Green, new Font("黑体", 9, FontStyle.Bold));
ShowText(DateTime.Now.ToString(), txt_Accept.TextLength, DateTime.Now.ToString().Length, Color.Green, new Font("黑体", 9, FontStyle.Bold));
ShowText("\r\n", txt_Accept.TextLength, 4, Color.Blue, new Font("宋体", 12));
ShowText(" ", txt_Accept.TextLength, 4, Color.Blue, new Font("宋体", 12));
ShowText(m_Text, txt_Accept.TextLength, m_Text.Length, Color.Black, new Font("黑体", 9));
ShowText("\r\n\r\n", txt_Accept.TextLength, 8, Color.Blue, new Font("宋体", 12));
}
/// <summary>
/// 显示系统信息
/// </summary>
/// <param name="m_Msg"></param>
void Print(string m_Msg)
{
string m_SysInfo = "[系统信息] ";
m_Msg = "\r\n\r\n";
ShowText(m_SysInfo, txt_Accept.TextLength, m_SysInfo.Length, Color.Red, new Font("黑体", 9,FontStyle.Bold));
ShowText(m_Msg, txt_Accept.TextLength, m_Msg.Length, Color.Black, new Font("黑体", 9));
}
/// <summary>
/// 向RichTextBox添加文本
/// </summary>
/// <param name="sText"></param>
/// <param name="nStart"></param>
/// <param name="nLength"></param>
/// <param name="color"></param>
/// <param name="font"></param>
private void ShowText(string sText, int nStart, int nLength, Color color, Font font)
{
txt_Accept.AppendText(sText);
txt_Accept.Select(nStart, nLength); // 需要修改颜色的部分
txt_Accept.SelectionColor = color; // 颜色
txt_Accept.SelectionFont = font; // 字体
txt_Accept.ScrollToCaret();
txt_Accept.Select(txt_Accept.Text.Length, 0);
}
#endregion
#region 重载WndProc
protected override void WndProc(ref Message m)
{
if (m.Msg == AnyChatCoreSDK.WM_GV_CONNECT)
{
///连接
int succed = m.WParam.ToInt32();
if (succed == 1)
{
Print("连接成功!");
}
else
{
Print("连接失败,错误号:" m.LParam.ToInt32());
}
}
else if (m.Msg == AnyChatCoreSDK.WM_GV_LOGINSYSTEM)
{
///登录系统
int userid = m.WParam.ToInt32();
if (m.LParam.ToInt32() == 0)
{
//Print("登录服务器成功,自己的用户编号为:" userid.ToString());
Print("登录服务器成功,自己的用户账号为:" frmLogin.m_UserName);
m_myUserID = userid;
StringBuilder userName = new StringBuilder(30);
int ret = AnyChatCoreSDK.GetUserName(userid, userName, 30);
AnyChatCoreSDK.EnterRoom(m_RoomID, "", 0);
}
else
{
Print("登录服务器失败,代码出错为:" m.LParam.ToInt32());
}
}
else if (m.Msg == AnyChatCoreSDK.WM_GV_ENTERROOM)
{
///进入房间
if (m.LParam.ToInt32() == 0)
{
int roomid = m.WParam.ToInt32();
Print("进入房间成功,房间编号为:" roomid.ToString());
m_RoomID = roomid;
int ret = AnyChatCoreSDK.SetVideoPos(-1, pnl_local.Handle, 0, 0, pnl_local.Width, pnl_local.Height);
ret = AnyChatCoreSDK.UserCameraControl(-1, true);
ret = AnyChatCoreSDK.UserSpeakControl(-1, true);
}
else
{
Print("申请进入房间失败,出错代码为:" m.LParam.ToInt32());
}
}
else if (m.Msg == AnyChatCoreSDK.WM_GV_ONLINEUSER)
{
///目前在房间的用户列表
int usrcnt = m.WParam.ToInt32();
Print("在编号为:" m.LParam.ToInt32() " 的房间共有" usrcnt "位在线用户");
Print("当前时间:" DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
int cnt = 0;//在线用户数量
AnyChatCoreSDK.GetOnlineUser(null, ref cnt);//获取在线用户数量
int[] userArr = new int[cnt];//在线用户ID
AnyChatCoreSDK.GetOnlineUser(userArr, ref cnt);//获取在线用户ID数组
if (userArr.Length >= 1)
{
for (int i = 0; i < userArr.Length; i )
{
m_others.Add(userArr[i]);//存入在线用户列表中(开发包带的用户在线ID数组)
UpdateUserList(userArr[i], i);//添加到在线用户列表(自定义,带用户属性结构)
}
UpdateOnlineUser();
}
else
{
dgv_onlineuser.Rows.Clear();
DataGridViewRow dgvr = new DataGridViewRow();
dgv_onlineuser.Rows.Add(dgvr);
dgvr = dgv_onlineuser.Rows[dgv_onlineuser.Rows.Count - 1];
dgvr.Cells["gvc_username"].Value = "大家";
dgvr.Cells["gvc_audio"].Value = AnyChatCSharpDemo.Properties.Resources.深灰背景;
dgvr.Cells["gvc_video"].Value = AnyChatCSharpDemo.Properties.Resources.深灰背景;
dgvr.Cells["gvc_character"].Value = AnyChatCSharpDemo.Properties.Resources.深灰背景;
dgvr = new DataGridViewRow();
dgv_onlineuser.Rows.Add(dgvr);
dgvr = dgv_onlineuser.Rows[dgv_onlineuser.Rows.Count - 1];
dgvr.Cells["gvc_username"].Value = frmLogin.m_UserName; ;
dgvr.Cells["gvc_character"].Value = AnyChatCSharpDemo.Properties.Resources.主持人_浅灰;
dgvr.Cells["gvc_audio"].Value = AnyChatCSharpDemo.Properties.Resources.麦克;
dgvr.Cells["gvc_video"].Value = AnyChatCSharpDemo.Properties.Resources.摄像头;
}
}
else if (m.Msg == AnyChatCoreSDK.WM_GV_USERATROOM)
{
///新用户加入或退出房间
int userID = m.WParam.ToInt32();
int boEntered = m.LParam.ToInt32();
if (boEntered == 1)
{
m_others.Add(userID);
UpdateUserList(userID, m_others.Count - 1);
Print("用户:" GetUserNameByID(userID) " 进入房间");
}
else
{
m_others.Remove(userID);
for (int i = 0; i < m_MemberItem.Count; i )
{
if (m_MemberItem[i].m_UserID == userID)
{
m_MemberItem.RemoveAt(i);
break;
}
}
Print("用户:" GetUserNameByID(userID) " 离开房间");
}
UpdateOnlineUser();//更新用户列表
this.Invalidate();//重绘界面,防止界面假死
}
base.WndProc(ref m);
}
#endregion
#region 刷新用户列表
private void UpdateOnlineUser()
{
DataGridViewRow dgvr = new DataGridViewRow();
//保存原选择用户
string m_TempUserName = "";
int m_DGVSelectRow = -1;
if (dgv_onlineuser.SelectedRows.Count > 0)
{
dgvr = dgv_onlineuser.SelectedRows[0];
m_TempUserName = dgvr.Cells["gvc_username"].Value.ToString();
}
dgv_onlineuser.Rows.Clear();//清空用户列表
pnl_video.Controls.Clear();//清空所有视频窗口
//显示大家
dgvr = new DataGridViewRow();
dgv_onlineuser.Rows.Add(dgvr);
dgvr = dgv_onlineuser.Rows[dgv_onlineuser.Rows.Count - 1];
dgvr.Cells["gvc_username"].Value = "大家";
dgvr.Cells["gvc_audio"].Value = AnyChatCSharpDemo.Properties.Resources.深灰背景;
dgvr.Cells["gvc_video"].Value = AnyChatCSharpDemo.Properties.Resources.深灰背景;
dgvr.Cells["gvc_character"].Value = AnyChatCSharpDemo.Properties.Resources.深灰背景;
dgvr = new DataGridViewRow();
dgv_onlineuser.Rows.Add(dgvr);
dgvr = dgv_onlineuser.Rows[dgv_onlineuser.Rows.Count - 1];
dgvr.Cells["gvc_username"].Value = frmLogin.m_UserName; ;
dgvr.Cells["gvc_character"].Value = AnyChatCSharpDemo.Properties.Resources.主持人_浅灰;
dgvr.Cells["gvc_audio"].Value = AnyChatCSharpDemo.Properties.Resources.麦克;
dgvr.Cells["gvc_video"].Value = AnyChatCSharpDemo.Properties.Resources.摄像头;
//显示自己
for (int i = 0; i < m_MemberItem.Count; i )
{
dgvr = new DataGridViewRow();
dgv_onlineuser.Rows.Add(dgvr);
dgvr = dgv_onlineuser.Rows[dgv_onlineuser.Rows.Count - 1];
dgvr.Cells["gvc_username"].Value = m_MemberItem[i].m_UserName;
dgvr.Cells["gvc_audio"].Value = AnyChatCSharpDemo.Properties.Resources.麦克 ;
dgvr.Cells["gvc_video"].Value = AnyChatCSharpDemo.Properties.Resources.摄像头;
dgvr.Cells["gvc_character"].Value = AnyChatCSharpDemo.Properties.Resources.普通人_浅灰;
CreateUserVideo(m_MemberItem[i].m_UserID);
if (m_TempUserName == m_MemberItem[i].m_UserName)
{
m_DGVSelectRow = i 1;
}
}
if (m_TempUserName != "" && m_DGVSelectRow > -1)
{
dgv_onlineuser.Rows[m_DGVSelectRow].Selected = true;
}
else
{
dgv_onlineuser.Rows[0].Selected = true;
}
}
#endregion
#region 增加或减少用户
private void UpdateUserList(int m_UserID,int m_Index)
{
clsMemberList.MemberItem m_TempItem = new clsMemberList.MemberItem();//创建用户在线列表(自定义,包含用户属性)
StringBuilder m_TempName = new StringBuilder(30);
int ret = AnyChatCoreSDK.GetUserName(m_UserID, m_TempName, 30);//获取用户账号
m_TempItem.m_UserName = m_TempName.ToString();
m_TempItem.m_UserID = m_UserID;
m_TempItem.m_Index = m_Index;
m_TempItem.m_Permission = new int[] { 0, 0, 0 };//用户权限
m_MemberItem.Add(m_TempItem);//添加到在线用户列表
}
/// <summary>
/// 通过用户ID获得用户账号
/// </summary>
/// <param name="m_UserID"></param>
/// <returns></returns>
private string GetUserNameByID(int m_UserID)
{
StringBuilder m_TempName = new StringBuilder(30);
int ret = AnyChatCoreSDK.GetUserName(m_UserID, m_TempName, 30);//获取用户账号
return m_TempName.ToString();
}
/// <summary>
/// 通过用户账号获得用户ID
/// </summary>
/// <param name="m_UserNameTemp"></param>
/// <returns></returns>
private int GetUserIDByName(string m_UserNameTemp)
{
int m_TempUserID = -1;
for (int i = 0; i < m_MemberItem.Count; i )
{
if (m_MemberItem[i].m_UserName == m_UserNameTemp)
{
m_TempUserID = m_MemberItem[i].m_UserID;
break;
}
}
return m_TempUserID;
}
#endregion
#region 用户视频窗口操作
#region 创建用户视频窗口
private void CreateUserVideo(int m_UserID)
{
//用户视频横列显示规则
int userCount = GetUserCount();
if (userCount > 0 && userCount <= 1) m_ColUserVideo = 1;
else if (userCount > 1 && userCount <= 4) m_ColUserVideo = 2;
else if (userCount > 4) m_ColUserVideo = 3;
int m_PnlCount = pnl_video.Controls.Count;
Panel m_ShowWnd = new Panel();
m_ShowWnd.Name = m_UserID.ToString();
m_ShowWnd.Width = (pnl_video.Width) / m_ColUserVideo;
m_ShowWnd.Height = m_ShowWnd.Width * 4 / 5;
m_ShowWnd.Top = m_PnlCount / m_ColUserVideo * m_ShowWnd.Height m_PnlCount / m_ColUserVideo * 5;
m_ShowWnd.Left = m_PnlCount % m_ColUserVideo * m_ShowWnd.Width m_PnlCount % m_ColUserVideo * 5;
m_ShowWnd.BackColor = Color.Black;
m_ShowWnd.DoubleClick = new EventHandler(ShowWnd_DoubleClick);
m_ShowWnd.MouseEnter = new EventHandler(m_ShowWnd_MouseEnter);
m_ShowWnd.MouseLeave = new EventHandler(m_ShowWnd_MouseLeave);
pnl_video.Controls.Add(m_ShowWnd);
AnyChatCoreSDK.SetVideoPos(m_UserID, m_ShowWnd.Handle, 0, 0, m_ShowWnd.Width, m_ShowWnd.Height);
AnyChatCoreSDK.UserCameraControl(m_UserID, true);
AnyChatCoreSDK.UserSpeakControl(m_UserID, true);
}
/// <summary>
/// 获取在线用户数量(不包括自己)
/// </summary>
/// <returns>在线用户数量</returns>
private int GetUserCount()
{
int userCount = 0;
//int[] ids = new int[] { };
AnyChatCoreSDK.GetOnlineUser(null, ref userCount);
return userCount;
}
#endregion
#region 鼠标进入用户视频窗口
void m_ShowWnd_MouseEnter(object sender, EventArgs e)
{
Control ShowWnd = (Control)sender;
string userName = GetUserNameByID(Convert.ToInt32(ShowWnd.Name));
// lbl_user初始化
lbl_user.AutoSize = true;
lbl_user.BackColor = System.Drawing.Color.White;
lbl_user.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
lbl_user.Name = "lbl_user";
lbl_user.Location = new System.Drawing.Point(176, 503);
lbl_user.Size = new System.Drawing.Size(55, 14);
this.Controls.Add(lbl_user);
lbl_user.Text = userName;
lbl_user.Parent = pnl_video;
lbl_user.Left = ShowWnd.Left ShowWnd.Width - lbl_user.Width;
lbl_user.Top = ShowWnd.Top ShowWnd.Height - lbl_user.Height;
lbl_user.BringToFront();
lbl_user.Visible = true;
}
#endregion
#region 鼠标离开用户视频窗口
void m_ShowWnd_MouseLeave(object sender, EventArgs e)
{
lbl_user.Visible = false;
}
#endregion
#region 双击用户视频窗口
private void ShowWnd_DoubleClick(object sender, EventArgs e)
{
Control ShowWnd = (Control)sender;
if (ShowWnd.Width != m_VideoWidthMax)
{
foreach (Control C in pnl_video.Controls)
{
if (C.Name != ShowWnd.Name)
{
C.Visible = false;
}
}
ShowWnd.Top = (pnl_video.Height - m_VideoHeightMax) / 2;
ShowWnd.Left = (pnl_video.Width - m_VideoWidthMax) / 2; ;
ShowWnd.Width = m_VideoWidthMax;
ShowWnd.Height = m_VideoHeightMax;
}
else
{
foreach (Control C in pnl_video.Controls)
{
if (C.Name != ShowWnd.Name)
{
C.Visible = true;
}
}
int m_TempIndex = 0;
for (int i = 0; i < m_MemberItem.Count; i )
{
if (ShowWnd.Name == m_MemberItem[i].m_UserID.ToString())
{
m_TempIndex=m_MemberItem[i].m_Index;
break;
}
}
ShowWnd.Width = (pnl_video.Width) / m_ColUserVideo;
ShowWnd.Height = ShowWnd.Width * 4 / 5;
ShowWnd.Top = m_TempIndex / m_ColUserVideo * ShowWnd.Height m_TempIndex / m_ColUserVideo * 5;
ShowWnd.Left = m_TempIndex % m_ColUserVideo * ShowWnd.Width m_TempIndex % m_ColUserVideo * 5;
}
AnyChatCoreSDK.SetVideoPos(Convert.ToInt32(ShowWnd.Name), ShowWnd.Handle, 0, 0, ShowWnd.Width, ShowWnd.Height);
}
#endregion
#region 本地视频窗口双击事件
private void pnl_local_MouseDoubleClick(object sender, MouseEventArgs e)
{
Control ShowWnd = (Control)sender;
if (ShowWnd.Width != m_VideoWidthMax)
{
foreach (Control C in pnl_video.Controls)
{
if (C.Name != ShowWnd.Name)
{
C.Visible = false;
}
}
ShowWnd.Top = (pnl_video.Height - m_VideoHeightMax) / 2;
ShowWnd.Left = (pnl_video.Width - m_VideoWidthMax) / 2; ;
ShowWnd.Width = m_VideoWidthMax;
ShowWnd.Height = m_VideoHeightMax;
pnl_video.Controls.Add(ShowWnd);
}
else
{
foreach (Control C in pnl_video.Controls)
{
if (C.Name != ShowWnd.Name)
{
C.Visible = true;
}
}
ShowWnd.Width = 167;
ShowWnd.Height = 140;
ShowWnd.Top = 471;
ShowWnd.Left = 3;
this.Controls.Add(ShowWnd);
}
//AnyChatCoreSDK.SetVideoPos(Convert.ToInt32(ShowWnd.Name), ShowWnd.Handle, 0, 0, ShowWnd.Width, ShowWnd.Height);
int ret = AnyChatCoreSDK.SetVideoPos(-1, pnl_local.Handle, 0, 0, ShowWnd.Width, ShowWnd.Height);
}
#endregion
#endregion
#region 窗体加载关闭
#region 窗体加载
private void frmRoom_Load(object sender, EventArgs e)
{
InitChat();//初始化
//InitUserPanel();//初始化用户面版
//初始化发送按钮右建菜单
ment_item_ctrlenter.Image = null;
ment_item_enter.Image = AnyChatCSharpDemo.Properties.Resources.duihao;
//初始化字体字号
InitFont();
//m_VideoWidthMax = frmLogin.m_LocalVideoWidth;
//m_VideoHeightMax = frmLogin.m_LocalVideoHeight;
//m_VideoWidthMax = 640;
//m_VideoHeightMax = 480;
//音视频状态
chk_localvideo.Checked = m_LocalVideoStatue ;
chk_localaudio.Checked = m_LocalAudioStatue;
//cbox_video.SelectedIndex = 5;//视频最大化尺寸
#region 采集分辨率
//1=160*120;2=176*144; 3=320*240; 4=352*288; 5=528*384; 6=640*480; 7=704*576
//int m_SelectIndex=0;
//switch (frmLogin.m_LocalVideoWidth)
//{
// case 160 :
// m_SelectIndex=0;
// break;
// case 176 :
// m_SelectIndex=1;
// break;
// case 320 :
// m_SelectIndex=2;
// break;
// case 352:
// m_SelectIndex = 3;
// break;
// case 528:
// m_SelectIndex = 4;
// break;
// case 640:
// m_SelectIndex = 5;
// break;
// case 704:
// m_SelectIndex = 6;
// break;
//}
//cbox_caiji.SelectedIndex = m_SelectIndex;
#endregion
}
#endregion
#region 窗体关闭
private void frmRoom_FormClosing(object sender, FormClosingEventArgs e)
{
AnyChatCoreSDK.LeaveRoom(m_RoomID);
AnyChatCoreSDK.Logout();
System.Environment.Exit(0);
}
#endregion
#endregion
#region 文本发送
/// <summary>
/// 发送按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_sendtxt_Click(object sender, EventArgs e)
{
string m_Message = rtxt_sendtxt.Text;
if (m_Message.Length == 0)
{
MessageBox.Show("发送文本不能为空","提示");
return;
}
int length = UnicodeEncoding.Default.GetBytes(m_Message).Length;
int m_TempUserID = -1;
string m_TempUserName = "大家";
if (dgv_onlineuser.SelectedRows.Count != 0)
{
DataGridViewRow dgvr = dgv_onlineuser.SelectedRows[0];
m_TempUserName = dgvr.Cells["gvc_username"].Value.ToString();
for (int i = 0; i < m_MemberItem.Count; i )
{
if (m_MemberItem[i].m_UserName == m_TempUserName)
{
m_TempUserID = m_MemberItem[i].m_UserID;
break;
}
}
}
bool m_Secret = false;
if (m_TempUserID != -1) m_Secret = true;
int ret = AnyChatCoreSDK.SendTextMessage(m_TempUserID, m_Secret, m_Message, length);
//显示聊天内容
string m_DispMsg = "我 To " m_TempUserName " ";
ShowText(m_DispMsg, txt_Accept.TextLength, m_DispMsg.Length, Color.Green, new Font("黑体", 9, FontStyle.Bold));
ShowText(DateTime.Now.ToString(), txt_Accept.TextLength, DateTime.Now.ToString().Length, Color.Green, new Font("黑体", 9, FontStyle.Bold));
ShowText("\r\n", txt_Accept.TextLength, 4, Color.Blue, new Font("宋体", 12));
ShowText(" ", txt_Accept.TextLength, 4, Color.Blue, new Font("宋体", 12));
ShowText(m_Message, txt_Accept.TextLength, m_Message.Length, Color.Black, new Font("黑体", 9));
ShowText("\r\n\r\n", txt_Accept.TextLength, 8, Color.Blue, new Font("宋体", 12));
rtxt_sendtxt.Text = "";
}
/// <summary>
/// 键盘按下组合键
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void rtxt_sendtxt_KeyDown(object sender, KeyEventArgs e)
{
if (ment_item_ctrlenter.Image != null)//Ctrl Enter
{
if (e.Control == true && e.KeyCode == Keys.Enter)
{
btn_sendtxt_Click(null, null);
}
}
else//Enter
{
if (e.KeyCode == Keys.Enter)
{
btn_sendtxt_Click(null, null);
}
}
}
/// <summary>
/// 键盘释放组合键
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void rtxt_sendtxt_KeyUp(object sender, KeyEventArgs e)
{
if (ment_item_ctrlenter.Image != null)//Ctrl Enter
{
if (e.Control == true && e.KeyCode == Keys.Enter)
{
rtxt_sendtxt.Text = "";
}
}
else//Enter
{
if (e.KeyCode == Keys.Enter)
{
rtxt_sendtxt.Text = "";
}
}
}
/// <summary>
/// 发送按钮右建菜单(Ctrl Enter)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ment_item_ctrlenter_Click(object sender, EventArgs e)
{
ment_item_ctrlenter.Image = AnyChatCSharpDemo.Properties.Resources.duihao;
ment_item_enter.Image = null;
}
/// <summary>
/// 发送按钮右建菜单(Enter)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ment_item_enter_Click(object sender, EventArgs e)
{
ment_item_enter.Image = AnyChatCSharpDemo.Properties.Resources.duihao;
ment_item_ctrlenter.Image = null;
}
/// <summary>
/// 初始化字体,字号
/// </summary>
private void InitFont()
{
int m_SelectIndex = 0;
int m_Index = 0;
System.Drawing.Text.InstalledFontCollection m_ObjFont = new System.Drawing.Text.InstalledFontCollection();
foreach (System.Drawing.FontFamily m_Font in m_ObjFont.Families)
{
cmb_font.Items.Add(m_Font.Name.ToString());
if (m_Font.Name == "黑体")
m_SelectIndex = m_Index;
m_Index ;
}
cmb_font.SelectedIndex = m_SelectIndex;
foreach (string m_FontSize in m_AllFontSizeName)
{
cmb_fontsize.Items.Add(m_FontSize);
}
cmb_fontsize.SelectedItem = "小五";
}
#endregion
#region 初始化用户列表面版
private void InitUserPanel()
{
pnl_userlist.Width = 285;
pnl_userlist.Height = 400;
pnl_userlist.Top = (this.Height - 30 - pnl_userlist.Height) / 2;
pnl_userlist.Left = this.Width - 41;
}
/// <summary>
/// 显示与隐藏用户面版
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pic_userlistdisp_Click(object sender, EventArgs e)
{
if (pic_userlistdisp.BackColor == Color.Green)
{
pic_userlistdisp.BackColor = Color.Blue;
pnl_userlist.Left = this.Width - 291;
}
else
{
pic_userlistdisp.BackColor = Color.Green;
pnl_userlist.Left = this.Width - 41;
}
}
#endregion
#region 单击用户列表
private void dgv_onlineuser_Click(object sender, EventArgs e)
{
try
{
if (dgv_onlineuser.SelectedRows.Count == 0) return;
DataGridViewRow dgvr = dgv_onlineuser.SelectedRows[0];
string m_TempUserName = dgvr.Cells["gvc_username"].Value.ToString();
if (m_TempUserName == frmLogin.m_UserName) return;
lbl_touser.Text = "我 对 " m_TempUserName " 说:";
}
catch (Exception ex) { }
}
private void dgv_onlineuser_SelectionChanged(object sender, EventArgs e)
{
dgv_onlineuser_Click(null, null);
}
#endregion
#region 权限设置
#region 单击视频权限
/// <summary>
/// 单击视频权限
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void menu_item_video_Click(object sender, EventArgs e)
{
try
{
if (dgv_onlineuser.SelectedRows.Count == 0) return;
DataGridViewRow dgvr = dgv_onlineuser.SelectedRows[0];
string m_TempUserName = dgvr.Cells["gvc_username"].Value.ToString();
if (m_TempUserName == frmLogin.m_UserName || m_TempUserName=="大家") return;
int m_TempUserID = GetUserIDByName(m_TempUserName);
AnyChatCoreSDK.UserCameraControl(m_TempUserID, menu_item_video.Checked);
}
catch (Exception ex) { }
}
#endregion
#region 用户状态
private void menu_item_status_Click(object sender, EventArgs e)
{
try
{
//if (dgv_onlineuser.SelectedRows.Count == 0) return;
//DataGridViewRow dgvr = dgv_onlineuser.SelectedRows[0];
//string m_TempUserName = dgvr.Cells["gvc_username"].Value.ToString();
//if (m_TempUserName == frmLogin.m_UserName || m_TempUserName == "大家") return;
//int m_TempUserID = GetUserIDByName(m_TempUserName);
//int m_InfoName = Convert.ToInt32(txt_1.Text.Trim());
//MessageBox.Show(m_TempUserID.ToString());
//int m_Infoval = -1;
//int ret = AnyChatCoreSDK.QueryUserState(m_TempUserID, m_InfoName, ref m_Infoval, 1000);
//StringBuilder m_Infoval = new StringBuilder(100);
//IntPtr m_Infoval =(IntPtr)0;
//byte[] m_Infoval = new byte[100];
//int result = Init_com(ref m_Infoval.ToCharArray());
//int m_Infoval = 10;
//int ret = AnyChatCoreSDK.QueryUserState(m_TempUserID, m_InfoName, ref m_Infoval, sizeof(int));
//int len = 100;
//byte[] buff = new byte[len];
//Marshal.Copy(m_Infoval, buff, 0, len);
//string m_Command = Encoding.Default.GetString(buff);
//txt_2.Text = ret.ToString() ":" m_Infoval.ToString();
//txt_2.Text = ret.ToString();
}
catch (Exception ex)
{
//txt_2.Text = ex.Message;
}
}
#endregion
#endregion
#region 显示隐藏文本聊天区
private void pnl_visableword_MouseEnter(object sender, EventArgs e)
{
if (pnl_word.Left == 658)//显示文本区状态
{
pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.隐藏放上;
}
else
{
pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.取消隐藏放上;
}
}
private void pnl_visableword_MouseDown(object sender, MouseEventArgs e)
{
if (pnl_word.Left == 658)//显示文本区状态
{
pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.隐藏按下;
}
else
{
pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.取消隐藏按下;
}
}
private void pnl_visableword_MouseUp(object sender, MouseEventArgs e)
{
if (pnl_word.Left == 658)//显示文本区状态
{
pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.隐藏放上;
pnl_word.Left = this.Width - 17-6;
pnl_video.Width = 640;
}
else
{
pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.取消隐藏放上;
pnl_word.Left = 658;
pnl_video.Width = 480;
}
}
private void pnl_visableword_MouseLeave(object sender, EventArgs e)
{
if (pnl_word.Left == 658)//显示文本区状态
{
pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.隐藏发送面板;
}
else
{
pnl_visableword.BackgroundImage = AnyChatCSharpDemo.Properties.Resources.显示发送面板;
}
}
#endregion
#region 设置音视频状态
/// <summary>
/// 设置视频状态
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void chk_localvideo_CheckedChanged(object sender, EventArgs e)
{
int ret = AnyChatCoreSDK.UserCameraControl(-1, chk_localvideo.Checked);
}
/// <summary>
/// 设置音频状态
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void chk_localaudio_CheckedChanged(object sender, EventArgs e)
{
int ret = AnyChatCoreSDK.UserSpeakControl(-1, chk_localaudio.Checked);
}
#endregion
#region 视频最大化显示尺寸
#endregion
#region 重新设置视频分辨率
private void cbb_fbl_SelectedIndexChanged(object sender, EventArgs e)
{
if (cbb_fbl.SelectedIndex == 0)
{
int bUseAppParam = 0;
//应用本地视频编码参数,使得前述修改即时生效(参数为int型:1 使用新参数,0 使用默认参数)
AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_APPLYPARAM, ref bUseAppParam, sizeof(int));
}
else
{
int bitrate = 0; //0表示质量模式
//设置本地视频编码的码率
AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_BITRATECTRL, ref bitrate, sizeof(int));
int keyframe = 25;
//设置本地视频编码的关键帧间隔
AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_GOPCTRL, ref keyframe, sizeof(int));
int framerate = 25;
//设置本地视频编码的帧率
AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_FPSCTRL, ref framerate, sizeof(int));
int defaultParam = 3;
// 设置本地视频编码的预设参数
AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_PRESETCTRL, ref defaultParam, sizeof(int));
int bUseAppParam = 1;
//应用本地视频编码参数,使得前述修改即时生效(参数为int型:1 使用新参数,0 使用默认参数)
AnyChatCoreSDK.SetSDKOption(AnyChatCoreSDK.BRAC_SO_LOCALVIDEO_APPLYPARAM, ref bUseAppParam, sizeof(int));
}
}
#endregion
#region 调节声音
#region 调节滑块
#endregion
#endregion
#region 传输文件及透明通道演示
string sendPath; //发送文件地址
string receivePath; //接收文件地址
#region 接收文件
private void Received_TransFile(int userId, string fileName, string filePath, int fileLength, int wParam, int lParam, int taskId, int userValue)
{
//这里用1作为接收标记
if (wParam == 1)
{
FileInfo fi = new FileInfo(filePath);
fi.MoveTo(receivePath "\\" fi.Name);
Print(receivePath "\\" fi.Name "文件接收成功");
}
}
#endregion
#region 透明通道数据
private void Received_TransBuffer(int userId, IntPtr buf, int len, int userValue)
{
//过滤信息()
string m_Command = Marshal.PtrToStringAnsi(buf);
try
{
if (m_Command.Length > 3)
{
string[] m_Packet = m_Command.Split(":".ToCharArray());
//选择是否接收文件
if (m_Packet[0] == "003" && m_Packet[3] == "file")
{
int m_TempUserID = Convert.ToInt32(m_Packet[1]);
string m_pacName = GetUserNameByID(m_TempUserID);
DialogResult r = MessageBox.Show("文件名:" m_Packet[2].ToString() ",是否接收?", m_pacName "发送文件请求", MessageBoxButtons.YesNo);
if (r == System.Windows.Forms.DialogResult.Yes)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK)
{
receivePath = fbd.SelectedPath;
string m_Message = "003:" m_myUserID.ToString() ":" "fileisok:";
byte[] buffer = Encoding.Default.GetBytes(m_Message);
int rett = AnyChatCoreSDK.TransBuffer(m_TempUserID, buffer, buffer.Length);
}
}
else
{
string m_Message = "003:" m_myUserID.ToString() ":" "fileisno:" m_Packet[2].ToString();
byte[] buffer = Encoding.Default.GetBytes(m_Message);
int rett = AnyChatCoreSDK.TransBuffer(m_TempUserID, buffer, buffer.Length);
}
}
//发送文件
else if (m_Packet[0] == "003" && m_Packet[2] == "fileisok")
{
int taskId = 0;
int m_TempUserID = Convert.ToInt32(m_Packet[1]);
int flag = AnyChatCoreSDK.TransFile(m_TempUserID, sendPath, 1, 0, 0, ref taskId);
Print("成功发送" sendPath "文件");
}
else if (m_Packet[0] == "003" && m_Packet[2] == "fileisno")
{
string m_tempName = GetUserNameByID(Convert.ToInt32(m_Packet[1]));
Print(m_tempName "拒绝接收文件" m_Packet[3].ToString());
}
}
}
catch (Exception ex)
{
}
}
#endregion
#region 请求发送
private void btn_transfile_Click(object sender, EventArgs e)
{
if (dgv_onlineuser.SelectedRows.Count == 0)
{
Print("文件发送失败,请选择目标用户");
return;
}
else
{
DataGridViewRow dgvr = dgv_onlineuser.SelectedRows[0];
string m_TempUserName = dgvr.Cells["gvc_username"].Value.ToString();
if (m_TempUserName == frmLogin.m_UserName || m_TempUserName == "大家")
{
Print("文件发送失败,请选择目标用户");
return;
}
else
{
OpenFileDialog dlgopenFile = new OpenFileDialog();
dlgopenFile.Title = "选择需要发送的文件";
DialogResult dr = dlgopenFile.ShowDialog();
if (dr == DialogResult.OK)
{
if (File.Exists(dlgopenFile.FileName))
{
sendPath = dlgopenFile.FileName;
//int taskId = 0;
int m_TempUserID = GetUserIDByName(m_TempUserName);
//发送命令
FileInfo fi = new FileInfo(dlgopenFile.FileName);
string m_Message = "003:" m_myUserID.ToString() ":" fi.Name ":" "file";
byte[] buffer = Encoding.Default.GetBytes(m_Message);
int rett = AnyChatCoreSDK.TransBuffer(m_TempUserID, buffer, buffer.Length);
Print("向" m_TempUserName "发送文件,等待接收...");
}
}
dlgopenFile.Dispose();
dlgopenFile = null;
}
}
}
#endregion
#endregion
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论