⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptphelpdlg.cpp

📁 局域网视频聊天
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		menu->CheckMenuItem(AUDIO_SEND,MF_BYCOMMAND | MF_UNCHECKED);

	}
	else
	{
		//Start recording audio
		record->ResumeThread();
		//record->PostThreadMessage(WM_RECORDSOUND_STARTRECORDING,0,0);
		isAudioSend=TRUE;
		menu->CheckMenuItem(AUDIO_SEND,MF_BYCOMMAND | MF_CHECKED);
	}
}


/**
*	  Enables/Disables reception of audio
*     Invoked when user presses Audio -> Receive menu item
*/
void CPTPHelpDlg::OnAudioReceive()
{

	if(isAudioReceive)
	{
		isAudioReceive=FALSE;
		menu->CheckMenuItem(AUDIO_RECEIVE,MF_BYCOMMAND | MF_UNCHECKED);
	}
	else
	{
		isAudioReceive=TRUE;
		menu->CheckMenuItem(AUDIO_RECEIVE,MF_BYCOMMAND | MF_CHECKED);
	}
}
	

/**
*	  Enables/Disables transmission of video
*     Invoked when user presses Video-> Send menu item
*/
void CPTPHelpDlg::OnVideoSend()
{

	if(isVideoSend)
	{
		isVideoSend=FALSE;
		menu->CheckMenuItem(VIDEO_SEND,MF_BYCOMMAND | MF_UNCHECKED);	
	}
	else
	{
		isVideoSend=TRUE;
		menu->CheckMenuItem(VIDEO_SEND,MF_BYCOMMAND | MF_CHECKED);
	}

}




/**
*	  Enables/Disables reception of video
*     Invoked when user presses Video -> Receive menu item
*/
void CPTPHelpDlg::OnVideoReceive()
{

	if(isVideoReceive)
	{
		isVideoReceive=FALSE;
		menu->CheckMenuItem(VIDEO_RECEIVE,MF_BYCOMMAND | MF_UNCHECKED);
	}
	else
	{
		isVideoReceive=TRUE;
		menu->CheckMenuItem(VIDEO_RECEIVE,MF_BYCOMMAND | MF_CHECKED);
	}
}
	


/**
*	  Display the about dialog box
*/
void CPTPHelpDlg::OnAbout()
{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
}




/**
*	  Send the message to remote host
*/
void CPTPHelpDlg::OnSendMesg()
{
unsigned char data[500];

	GetDlgItemText(IDC_EDIT1,(char*)data,500);
	
	
	if(strlen((const char*)data)>0)
	{
	dtext.SendTextData(data,strlen((const char*)data));
	SetDlgItemText(IDC_EDIT1,"");
	}
		
}
void CPTPHelpDlg::OnSnap()
{
	GetDlgItem(IDC_SNAP)->EnableWindow(false);
	GetDlgItem(IDC_PICSAVE)->EnableWindow(true);
	GetDlgItem(IDC_STOPSNAP)->EnableWindow(true);
	
	isPicdata=true;
	isSnap=true;
}
void CPTPHelpDlg::OnPicSave()
{
	CString strFilter;
	CString m_FileName;
	strFilter="Bmp Files(*.bmp)|*.*||";
	CFileDialog dlg(FALSE, NULL, NULL, OFN_EXPLORER|OFN_HIDEREADONLY|
		OFN_ENABLESIZING|OFN_FILEMUSTEXIST,strFilter);
	//dlg.m_ofn.lStructSize = sizeof(OPENFILENAME);
	if(dlg.DoModal() == IDOK )
	{
		m_FileName=dlg.GetFileName();//GetPathName();
	
	CFile fp;
	fp.Open(m_FileName,CFile::modeCreate | CFile::modeWrite);
	BITMAPFILEHEADER bmfHdr; //定义文件头
	BITMAPINFOHEADER bmiHdr; //定义信息头
	//RGBQUAD rgbQuad[256];    //定义调色板
        //对信息头进行赋值
	 //bmiHdr=&m_bmpinfo->bmiHeader;
        //对调色板进行赋值
	//	for(i=0; i<256; i++)
	//	{
	//		rgbQuad[i].rgbBlue = (BYTE)i;
	//		rgbQuad[i].rgbGreen = (BYTE)i;
	//		rgbQuad[i].rgbRed = (BYTE)i;
	//		rgbQuad[i].rgbReserved = 0;
		//}
    //对文件头进行赋值
	bmfHdr.bfType = (WORD)0x4D42;//;((WORD)('M'<<8) | 'B')
	bmfHdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+IMAGE_WIDTH*IMAGE_HEIGHT*3);
	bmfHdr.bfReserved1 = 0;
	bmfHdr.bfReserved2 = 0;
	bmfHdr.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));

	fp.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER)); //写文件头
	fp.Write((LPSTR)&m_bmpinfo->bmiHeader,sizeof(BITMAPINFOHEADER)); //写信息头
	//fp.Write((LPSTR)rgbQuad,sizeof(RGBQUAD)*256); //写调色板
	//fp.Write(lpvBuffer2Bits,m_WidthOfModel*m_HeightOfModel);//写数据
	fp.Write(imagedata,IMAGE_WIDTH*IMAGE_HEIGHT*3);//写数据

	fp.Close();
	}
	
}
void CPTPHelpDlg::OnStopSnap()
{
	GetDlgItem(IDC_SNAP)->EnableWindow(true);
	GetDlgItem(IDC_PICSAVE)->EnableWindow(false);
	GetDlgItem(IDC_STOPSNAP)->EnableWindow(false);
	
	isPicdata=false;
	isSnap=false;
}

void CPTPHelpDlg::OnQuerrySource()
{
	ShellExecute(GetParent()->GetSafeHwnd(), "open", "http://firenet.topcool.net", NULL, NULL, SW_SHOW);	
}

void CPTPHelpDlg::OnAdvice()
{
	ShellExecute(GetParent()->GetSafeHwnd(), "open", "http://firenet.topcool.net", NULL, NULL, SW_SHOW);	
}
void CPTPHelpDlg::OnSendFile()
{


}
void CPTPHelpDlg::OnResult()
{
	CreatReport report;
	report.DoModal();
}

/**
*	  Display mesg received from the remote host
*/
void CPTPHelpDlg::DisplayMesg(char *mesg)
{

	list->AddString(mesg);
	// Highlight the currently added string
	// This will scroll the window automatically
	list->SetCurSel(list->GetCount()-1);

	
}



/**
*	  Display frame got from remote host
*/
void CPTPHelpDlg::DisplayRemoteFrame(unsigned char *data,int size)
{
int retvalue;

	// If remote view disabled then return...
	if(!isViewRemoteVideo)
	return;

	// If video reception disabled..then return..
	if(!isVideoReceive)
	return;

	retvalue=DecompressFrame(data,size,rgbdata,buffersize);

	if(!retvalue)
	{
		log.WriteString("\n Decompression failed");
		return;
	}
	if(isButtonShow)
	{
		GetDlgItem(IDC_SNAP)->EnableWindow(true);
		isButtonShow=FALSE;
	}



	log.WriteString("\n Decompression succeeded");

	if(!isSnap)
	{
	::DrawDibDraw(hdib,
				  m_hdc,
				  remote_wnd_x,		// dest : left pos
				  remote_wnd_y,		// dest : top pos
				  IMAGE_WIDTH*1.5,//-1,				// don't stretch
				  IMAGE_HEIGHT*1.5,//-1,				// don't stretch
				  &m_bmpinfo->bmiHeader,			 // bmp header info
				  rgbdata,					 // bmp data
				  0,					 // src :left
				  0,					 // src :top
				  IMAGE_WIDTH,				 // src : width
				  IMAGE_HEIGHT,				 // src : height
				  DDF_SAME_DRAW			 // use prev params....
				  );
	}
	else
	{
		if(isPicdata)
		{
			imagedata=new unsigned char[80000];
			for(int k=0;k<80000;k++)
			{
				imagedata[k]=rgbdata[k];
			}
			isPicdata=false;
		}
		::DrawDibDraw(hdib,
				  m_hdc,
				  remote_wnd_x,		// dest : left pos
				  remote_wnd_y,		// dest : top pos
				  IMAGE_WIDTH*1.5,//-1,				// don't stretch
				  IMAGE_HEIGHT*1.5,//-1,				// don't stretch
				  &m_bmpinfo->bmiHeader,			 // bmp header info
				  imagedata,					 // bmp data
				  0,					 // src :left
				  0,					 // src :top
				  IMAGE_WIDTH,				 // src : width
				  IMAGE_HEIGHT,				 // src : height
				  DDF_SAME_DRAW			 // use prev params....
				  );
	}


}



/**
*
*	Send the video frame to the remote host...
*
*/
void CPTPHelpDlg::SendVideo(BYTE *data,int size)
{
CRect wndrect;
Bits bits;		// Various count about compression


	if(vidcap->isOver==TRUE)
	return;
	
	if(data==NULL)
	return;


	// Display the captured frame...
	if(isViewLocalVideo)
	{

	::DrawDibDraw(hdib,
				  m_hdc,
				  local_wnd_x,		// dest : left pos
				  local_wnd_y,		// dest : top pos
				  IMAGE_WIDTH*1.5,//-1,				// don't stretch
				  IMAGE_HEIGHT*1.5,//-1,				// don't stretch
				  &m_bmpinfo->bmiHeader,			 // bmp header info
				  data,					 // bmp data
				  0,					 // src :left
				  0,					 // src :top
				  IMAGE_WIDTH,				 // src : width
				  IMAGE_HEIGHT,				 // src : height
				  DDF_SAME_DRAW			 // use prev params....
				  );

	}

	
	if(isVideoSend)
	{

		//log.WriteString("\n Converting to YUV format..");
		
		//Convert the data from rgb format to YUV format	
		ConvertRGB2YUV(IMAGE_WIDTH,IMAGE_HEIGHT,data,yuv);


		// Reset the counter
		count=0;

		//Compress the data...to h263
		cparams.format=CPARAM_QCIF;
		cparams.inter = CPARAM_INTRA;  
		cparams.Q_intra = 8;
		cparams.data=yuv;		//  Data in YUV format...
		CompressFrame(&cparams, &bits);
		
		// Transmit the compressed frame
		//log.WriteString("Transmitting the frame");
		dvideo.SendVideoData(cdata,count);

	}

}


void CPTPHelpDlg::StartConference()//两端开始对话
{
	if(isStarted)
	return;
	//状态标志赋值
	isStarted=TRUE;
	isViewLocalVideo=TRUE;
	isViewRemoteVideo=TRUE;
	//相应的菜单项更改状态
	menu->EnableMenuItem(CONF_CONNECT,MF_DISABLED | MF_GRAYED);
	menu->EnableMenuItem(CONF_DISCONNECT,MF_ENABLED);	
	menu->EnableMenuItem(AUDIO_SEND,MF_ENABLED);
	menu->EnableMenuItem(AUDIO_RECEIVE,MF_ENABLED);	
	menu->EnableMenuItem(VIDEO_SEND,MF_ENABLED);
	menu->EnableMenuItem(VIDEO_RECEIVE,MF_ENABLED);
	menu->EnableMenuItem(VIEW_LOCAL,MF_ENABLED);
	menu->EnableMenuItem(VIEW_REMOTE,MF_ENABLED);
	menu->CheckMenuItem(VIEW_LOCAL,MF_BYCOMMAND | MF_CHECKED);
	menu->CheckMenuItem(VIEW_REMOTE,MF_BYCOMMAND | MF_CHECKED);
	dtext.CreateSocket(PORT_TEXT,TYPE_TEXT);// 创建文本消息Socket
	bsend->EnableWindow(TRUE);//"发送"按钮生效
	daudio.CreateSocket(PORT_AUDIO,TYPE_AUDIO);//创建音频Socket
	dvideo.CreateSocket(PORT_VIDEO,TYPE_VIDEO);//创建视频Socket
	record->PostThreadMessage(WM_RECORDSOUND_STARTRECORDING,0,0);//开始录音	
	play->PostThreadMessage(WM_PLAYSOUND_STARTPLAYING,0,0);//开始放音
	if(isVideo)	// 开始视频捕捉
	{
		if(vidcap->StartCapture()==FALSE)
		{
			MessageBox("不能开始视频捕捉!");
			isCaptureStarted=FALSE;
		}
		else
		{
		isCaptureStarted=TRUE;
		}
	}
}



void CPTPHelpDlg::OnMenuSkinLoad() 
{
	//---------------------------------------
	//For AppFace
	CString str =theApp.m_pszHelpFilePath ;
	str = str.Left(str.ReverseFind(_T('\\'))) ;
	CFileDialog f(TRUE,_T("bmp"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_NOCHANGEDIR,
		   _T("UI Resource Files (*.urf)|*.urf|All Files (*.*)|*.*||"),
		                            this);
	f.m_ofn.lpstrInitialDir = (LPCTSTR)str ;
	if(IDOK == f.DoModal())
	{
		theApp.m_af.Start((LPTSTR)(LPCTSTR)f.GetPathName());
	}		
	//---------------------------------------
	
}

void CPTPHelpDlg::OnMenuSkinNo() 
{
	//---------------------------------------
	//For AppFace
	theApp.m_af.Start();
	//Do not call m_af.Remove() here !It will be released all the resource.
	//---------------------------------------	
}



/**
*	  Destroy the current conference
*/
void CPTPHelpDlg::DestroyConference()
{

	// If not started / already destroyed..then return;
	if(isStarted==FALSE)
	return;

	isStarted=FALSE;
	isViewLocalVideo=FALSE;
	isViewRemoteVideo=FALSE;


	// Enable/disable menu items
	menu->EnableMenuItem(CONF_CONNECT,MF_ENABLED);
	menu->EnableMenuItem(CONF_DISCONNECT,MF_DISABLED | MF_GRAYED);


	// Disable Text session
	dtext.CloseSocket();

	// Disable the send button...
	bsend->EnableWindow(FALSE);

	// Clear the contents of text chat windows
	SetDlgItemText(IDC_EDIT1,"");
	list->ResetContent();

		
	// If recording is going on ...then stop it
	if(isAudioSend)
	record->SuspendThread();

	record->PostThreadMessage(WM_RECORDSOUND_STOPRECORDING,0,0);	 

	// stop audio session
	daudio.CloseSocket();

	// stop playing audio
	play->PostThreadMessage(WM_PLAYSOUND_STOPPLAYING,0,0);


	// stop capturing video
	if(isVideo && isCaptureStarted)
	vidcap->StopCapture();	
	
	// stop video session
	dvideo.CloseSocket();

	// Update local and remote viewer..
	CWnd *wnd=(CWnd*)this->GetDlgItem(IDC_LOCALVIDEO);
    wnd->Invalidate(TRUE);

	wnd=(CWnd*)this->GetDlgItem(IDC_REMOTEVIDEO);
    wnd->Invalidate(TRUE);

	// Reset the status..
	record->ResumeThread();

	isAudioSend=TRUE;
	menu->CheckMenuItem(AUDIO_SEND,MF_BYCOMMAND | MF_CHECKED);

	isAudioReceive=TRUE;
	menu->CheckMenuItem(AUDIO_RECEIVE,MF_BYCOMMAND | MF_CHECKED);
	
	isVideoSend=TRUE;
	menu->CheckMenuItem(VIDEO_SEND,MF_BYCOMMAND | MF_CHECKED);

	isVideoReceive=TRUE;
	menu->CheckMenuItem(VIDEO_RECEIVE,MF_BYCOMMAND | MF_CHECKED);

	menu->EnableMenuItem(AUDIO_SEND,MF_GRAYED);
	menu->EnableMenuItem(AUDIO_RECEIVE,MF_GRAYED);
	
	menu->EnableMenuItem(VIDEO_SEND,MF_GRAYED);
	menu->EnableMenuItem(VIDEO_RECEIVE,MF_GRAYED);

	menu->EnableMenuItem(VIEW_LOCAL,MF_GRAYED);
	menu->EnableMenuItem(VIEW_REMOTE,MF_GRAYED);

	GetDlgItem(IDC_SNAP)->EnableWindow(false);
	GetDlgItem(IDC_PICSAVE)->EnableWindow(false);
	GetDlgItem(IDC_STOPSNAP)->EnableWindow(false);
	/*if (imagedata!=NULL)
	{
		delete [] imagedata;
	}*/



}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -