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

📄 ptphelpdlg.cpp

📁 VC++6开发指南的源代码第24章-第25章
💻 CPP
📖 第 1 页 / 共 2 页
字号:

#include "stdafx.h"
#include "PTPHelp.h"
#include "PTPHelpDlg.h"
#include "Resource.h"
#include "reatReport.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CPTPHelpApp theApp ;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()










/////////////////////////////////////////////////////////////////////////////
// CPTPHelpDlg dialog




// Global varialbes...
int count=0;
unsigned char cdata[10000];
int cbuffer_size=10000;
unsigned char rgbdata[80000];
int buffersize=80000;




// Callback function gets invoked during compression...
// It returns the compressed data byte by byte...
void OwnWriteFunction(int byte)
{
	if(count<cbuffer_size)
	cdata[count]=(unsigned char)byte;	
	count++;

}



CPTPHelpDlg::CPTPHelpDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPTPHelpDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPTPHelpDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CPTPHelpDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPTPHelpDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}





BEGIN_MESSAGE_MAP(CPTPHelpDlg, CDialog)
	//{{AFX_MSG_MAP(CPTPHelpDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	
	// Conference menu handlers
	ON_COMMAND(CONF_CONNECT,OnConnectRemote)
	ON_COMMAND(CONF_QUESTCONNECT,OnQuestRemote)
	ON_COMMAND(CONF_DISCONNECT,OnDisconnect)
	ON_COMMAND(CONF_EXIT,OnCancel)
	
	// View menu handlers
	ON_COMMAND(VIEW_LOCAL,OnViewLocal)
	ON_COMMAND(VIEW_REMOTE,OnViewRemote)
	
	// Audio menu handlers
	ON_COMMAND(AUDIO_CONTROL,OnVolumeControl)
	ON_COMMAND(AUDIO_SEND,OnAudioSend)
	ON_COMMAND(AUDIO_RECEIVE,OnAudioReceive)
	

	// Video menu handlers
	ON_COMMAND(VIDEO_SEND,OnVideoSend)
	ON_COMMAND(VIDEO_RECEIVE,OnVideoReceive)
	

	// Help menu handlers
	ON_COMMAND(HELP_ABOUT,OnAbout)
	//skin
	ON_COMMAND(ID_MENU_SKIN_LOAD, OnMenuSkinLoad)
	ON_COMMAND(ID_MENU_SKIN_NO, OnMenuSkinNo)

	//button
	ON_COMMAND(IDC_BUTTON1,OnSendMesg)
	ON_COMMAND(IDC_SNAP,OnSnap)
	ON_COMMAND(IDC_PICSAVE,OnPicSave)
	ON_COMMAND(IDC_STOPSNAP,OnStopSnap)
	ON_COMMAND(IDC_FILEFIND,OnQuerrySource)
	ON_COMMAND(IDC_BOOK,OnAdvice)
	ON_COMMAND(IDC_FILESEND,OnSendFile)
	ON_COMMAND(IDC_RESULT,OnResult)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()










BOOL CPTPHelpDlg::OnInitDialog()
{

	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// initialize toolbar and status bar
	if (!m_wndToolBar.Create(this) ||
		!m_wndToolBar.LoadToolBar(IDR_TOOLBAR1))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}
	m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);
	// move toolbar and status bar over static controls
	CRect rect2;
	GetDlgItem(IDC_TOOLBAR_STATIC)->GetWindowRect(&rect2);
	ScreenToClient(&rect2);
	m_wndToolBar.MoveWindow(&rect2);

	// 创建日志文件
	log.Open("main.log",CFile::modeCreate | CFile::modeWrite);
	// 初始化时,相关的菜单命令无效
	menu=this->GetMenu();
	menu->EnableMenuItem(CONF_CONNECT,MF_ENABLED);
	menu->EnableMenuItem(CONF_QUESTCONNECT,MF_ENABLED);
	menu->EnableMenuItem(CONF_DISCONNECT,MF_DISABLED | MF_GRAYED);
	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);
	
	list=(CListBox*)GetDlgItem(IDC_LIST1);//消息列表框
	bsend=(CButton*)GetDlgItem(IDC_BUTTON1);//“发送”按钮
	bsend->EnableWindow(FALSE);//“发送”按钮初始无效
	GetDlgItem(IDC_SNAP)->EnableWindow(false);//“视频捕捉”按钮初始无效
	GetDlgItem(IDC_PICSAVE)->EnableWindow(false);//“保存图像”按钮初始无效
	GetDlgItem(IDC_STOPSNAP)->EnableWindow(false);//“停止捕捉”按钮初始无效	
	// 创建录音线程
	record=new RecordSound(this);
	record->CreateThread();
	// 创建放音线程
	play=new PlaySound1(this);
	play->CreateThread();
	//初始化视频捕捉窗口
	vidcap=new VideoCapture();
	vidcap->SetDialog(this);
	if(vidcap->Initialize()) //初始化成功
	{	
		this->m_bmpinfo=&vidcap->m_bmpinfo;	
		isVideo=TRUE;
		// 压缩器初始化
		    // 从RGB 转化为 YUV
			InitLookupTable();
			//初始化压缩器
			cparams.format = CPARAM_QCIF;
			InitH263Encoder(&cparams);  
			WriteByteFunction = OwnWriteFunction;
	}
	else
	{
		isVideo=FALSE;		
		// 创建bmpinfo 结构
		m_bmpinfo=new BITMAPINFO;
		m_bmpinfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
		m_bmpinfo->bmiHeader.biWidth=IMAGE_WIDTH;
		m_bmpinfo->bmiHeader.biHeight=IMAGE_HEIGHT;
		m_bmpinfo->bmiHeader.biPlanes=1;
		m_bmpinfo->bmiHeader.biBitCount=24;
		m_bmpinfo->bmiHeader.biCompression=0;
		m_bmpinfo->bmiHeader.biSizeImage=0;
		m_bmpinfo->bmiHeader.biXPelsPerMeter=0;
		m_bmpinfo->bmiHeader.biYPelsPerMeter=0;
		m_bmpinfo->bmiHeader.biClrUsed=0;
		m_bmpinfo->bmiHeader.biClrImportant=0;
		//相关的菜单命令项无效
		menu->EnableMenuItem(VIEW_LOCAL,MF_DISABLED | MF_GRAYED);
		menu->EnableMenuItem(VIDEO_SEND,MF_DISABLED | MF_GRAYED);
	}
	
	
	// 初始状态还没有进行视频捕捉,相关的标识赋值
	isCaptureStarted=FALSE;
	isViewLocalVideo=TRUE;
	isViewRemoteVideo=TRUE;
	isAudioSend=TRUE;
	isAudioReceive=TRUE;
	isVideoSend=TRUE;
	isVideoReceive=TRUE;
	isSnap=FALSE;
	isPicdata=FALSE;
	isButtonShow=TRUE;
	//初始化H263解压缩器
	InitH263Decoder();
	// Adjust display windows
	CWnd *wnd,*bwnd;
	CRect rect,brect;
	// 设置本地视频播放窗口信息
	wnd=this->GetDlgItem(IDC_LOCALVIDEO);//
   	bwnd=this->GetDlgItem(IDC_LOCALBORDER);//local frame
   	bwnd->GetWindowRect(brect);
	ScreenToClient(brect);
	local_wnd_x=brect.TopLeft().x+(brect.Width()-IMAGE_WIDTH*1.5)/2;
	local_wnd_y=brect.TopLeft().y+(brect.Height()-IMAGE_HEIGHT*1.5)/2;	
	// Centre the local video window
	wnd->SetWindowPos(&wndTop,local_wnd_x-4,local_wnd_y-4,IMAGE_WIDTH*1.5+9,IMAGE_HEIGHT*1.5+9,SWP_SHOWWINDOW | SWP_DRAWFRAME);

	// 设置接收的对端视频播放窗口信息
	wnd=this->GetDlgItem(IDC_REMOTEVIDEO);	// Video display window
   	bwnd=this->GetDlgItem(IDC_REMOTEBORDER); // Border window...
   	bwnd->GetWindowRect(brect);
	ScreenToClient(brect);
	remote_wnd_x=brect.TopLeft().x+(brect.Width()-IMAGE_WIDTH*1.5)/2;
	remote_wnd_y=brect.TopLeft().y+(brect.Height()-IMAGE_HEIGHT*1.5)/2;
	// Centre the remote video window
	wnd->SetWindowPos(&wndTop,remote_wnd_x-4,remote_wnd_y-4,IMAGE_WIDTH*1.5+9,IMAGE_HEIGHT*1.5+9,SWP_SHOWWINDOW | SWP_DRAWFRAME);
	// 获取对话框DC
	m_hdc=this->GetDC()->m_hDC;
	//初始化DIB
	hdib=::DrawDibOpen();
	if(hdib!=NULL)
	{
		::DrawDibBegin(hdib,
					   m_hdc,
					   IMAGE_WIDTH*1.5,				// 拉伸1.5倍
					   IMAGE_HEIGHT*1.5,				// 拉伸1.5倍
					   &m_bmpinfo->bmiHeader,
					   IMAGE_WIDTH,         // 图像宽度
					   IMAGE_HEIGHT,        // 图像高度
					   0				
					   );
	}
    

	//声明连接对话框对象
	connectdlg=new ConnectDlg(NULL);
	connectdlg->SetParent(this);
	//声明响应对话框对象
	requestdlg=new REQUESTCON(NULL);
	requestdlg->SetParent(this);
	
	// 设置SOCKET
	dcontrol.SetParent(this);
	daudio.SetParent(this);
	dvideo.SetParent(this);
	dtext.SetParent(this);
	drequest.SetParent(this);
	// Create  control datagram socket for handling messages
	dcontrol.CreateSocket(PORT_CONTROL,TYPE_CONTROL);//控制Socket
	drequest.CreateSocket(PORT_QUEST,TYPE_QUEST);//
	isStarted=FALSE;
	return TRUE; 

}






void CPTPHelpDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}






//  If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CPTPHelpDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}






HCURSOR CPTPHelpDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}





void CPTPHelpDlg::OnCancel() 
{
	
	// If conference is going on...then 
	// it must be destroyed...
	if(isStarted)
	DestroyConference();
	// Close the control session
	dcontrol.CloseSocket();
	drequest.CloseSocket();
	// End recording and player thread
	record->PostThreadMessage(WM_RECORDSOUND_ENDTHREAD,0,0);	
	play->PostThreadMessage(WM_PLAYSOUND_ENDTHREAD,0,0);
	// Close the video capture device
	vidcap->Destroy();		
	// Close graphics....
	if(hdib!=NULL)
	{
	::DrawDibEnd(hdib);
	::DrawDibClose(hdib);
	}	
	// Close the encoder
	if(isVideo)
	ExitH263Encoder(&cparams);
	// close decoder ......
	ExitH263Decoder();
	CDialog::OnCancel();
}




void CPTPHelpDlg::OnConnectRemote()//执行连接命令
{
	connectdlg->DoModal();//显示连接对话框
}

void CPTPHelpDlg::OnQuestRemote()//连接响应函数
{
	requestdlg->DoModal();//弹出响应连接对话框
}

void CPTPHelpDlg::OnDisconnect()//断开连接响应函数
{
	dcontrol.SendControlMessage(MESG_DISCONNECT,NULL);//发送断开连接命令
	DestroyConference();//结束连接会话
}


void CPTPHelpDlg::OnViewLocal()//显示、隐藏本地视频控制
{

	CMenu *menu=this->GetMenu();
	if(isViewLocalVideo)
	{
	isViewLocalVideo=FALSE;
	menu->CheckMenuItem(VIEW_LOCAL,MF_BYCOMMAND | MF_UNCHECKED);
	}
	else
	{
	isViewLocalVideo=TRUE;
	menu->CheckMenuItem(VIEW_LOCAL,MF_BYCOMMAND | MF_CHECKED);
	}
}

void CPTPHelpDlg::OnViewRemote()//显示、隐藏对方视频控制
{

	CMenu *menu=this->GetMenu();
	
	if(isViewRemoteVideo)
	{
	isViewRemoteVideo=FALSE;
	menu->CheckMenuItem(VIEW_REMOTE,MF_BYCOMMAND | MF_UNCHECKED);
	}
	else
	{
	isViewRemoteVideo=TRUE;
	menu->CheckMenuItem(VIEW_REMOTE,MF_BYCOMMAND | MF_CHECKED);
	}
}
	

void CPTPHelpDlg::OnVolumeControl()//显示音量控制对话框
{	
	Volume vol(IDD_DIALOG3);
	vol.DoModal();
}




/**
*	  Enables/Disables transmission of audio
*     Invoked when user presses Audio -> Send menu item
*/
void CPTPHelpDlg::OnAudioSend()
{

	if(isAudioSend)
	{
		// Stop recording audio
		record->SuspendThread();//
		//>PostThreadMessage(WM_RECORDSOUND_STOPRECORDING,0,0);
		isAudioSend=FALSE;

⌨️ 快捷键说明

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