📄 ptphelpdlg.cpp
字号:
#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 + -