www.pudn.com > VideoCapture.rar > ChildFrm.cpp
// ChildFrm.cpp : implementation of the CChildFrame class
//
#include "stdafx.h"
#include "Multicard.h"
#include "ChildFrm.h"
#include "ShowStreamDlg.h"
#include "ConfigDlg.h"
#include "PropertyDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
typedef struct tagSTREAMNOTIFYPARAME
{
int iDlgCount;
CShowStreamDlg * pDlgArray;
} STREAMNOTIFYPARAME;
//数据流回调函数
void __stdcall StreamNotify(const BYTE* pDIBHead, const BYTE* pDIBits, LPVOID pParam)
{
STREAMNOTIFYPARAME * pSNP = (STREAMNOTIFYPARAME *) pParam;
if(!pSNP || !pDIBHead || !pDIBits)
return;
for(int i=0; iiDlgCount; i++)
pSNP->pDlgArray[i].ShowStream((BITMAPINFO*)pDIBHead, pDIBits);
}
/////////////////////////////////////////////////////////////////////////////
// CChildFrame
IMPLEMENT_DYNCREATE(CChildFrame, CMDIChildWnd)
BEGIN_MESSAGE_MAP(CChildFrame, CMDIChildWnd)
//{{AFX_MSG_MAP(CChildFrame)
ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
ON_WM_CREATE()
ON_COMMAND(ID_STARTSHOWSTREAM, OnStartShowStream)
ON_COMMAND(ID_NORMALSIZE, OnNormalSize)
ON_WM_SIZE()
ON_COMMAND(ID_CONFIGDIALOG, OnConfigDialog)
ON_COMMAND(ID_PROPERTYDIALOG, OnPropertyDialog)
ON_UPDATE_COMMAND_UI(ID_STARTSHOWSTREAM, OnUpdateStartshowstream)
//}}AFX_MSG_MAP
ON_MESSAGE(UM_VIDEO_ERROR_NOTIFY, OnVideoErrorNotify)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChildFrame construction/destruction
CChildFrame::CChildFrame()
{
// TODO: add member initialization code here
m_iCardID = -1;
m_bOverlay = FALSE;
}
CChildFrame::~CChildFrame()
{
//======== Add for ver5.2, begin =================
extern bool SaveParame(int);
//保存卡的当前属性,以备下次连接时重新设回
SaveParame(m_iCardID);
//======== Add for ver5.2, end ===================
//释放对卡的连接
DSStream_DisconnectDevice(m_iCardID);
}
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
if( !CMDIChildWnd::PreCreateWindow(cs) )
return FALSE;
//cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
//cs.lpszClass = AfxRegisterWndClass(0);
cs.style &= ~FWS_ADDTOTITLE;
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
cs.lpszClass = AfxRegisterWndClass(0);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CChildFrame diagnostics
#ifdef _DEBUG
void CChildFrame::AssertValid() const
{
CMDIChildWnd::AssertValid();
}
void CChildFrame::Dump(CDumpContext& dc) const
{
CMDIChildWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CChildFrame message handlers
void CChildFrame::OnFileClose()
{
// To close the frame, just send a WM_CLOSE, which is the equivalent
// choosing close from the system menu.
SendMessage(WM_CLOSE);
}
int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// create a view to occupy the client area of the frame
/* if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
{
TRACE0("Failed to create view window\n");
return -1;
}*/
for(int i=0; i<4; i++)
m_ShowStreamDlg[i].Create(IDD_SHOWSTREAM, this);
return 0;
}
//DEL void CChildFrame::OnSetFocus(CWnd* pOldWnd)
//DEL {
//DEL CMDIChildWnd::OnSetFocus(pOldWnd);
//DEL
//DEL m_wndView.SetFocus();
//DEL }
//DEL BOOL CChildFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
//DEL {
//DEL // let the view have first crack at the command
//DEL if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
//DEL return TRUE;
//DEL
//DEL // otherwise, do default handling
//DEL return CMDIChildWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
//DEL }
void CChildFrame::OnStartShowStream()
{
// TODO: Add your command handler code here
static STREAMNOTIFYPARAME snp;
snp.pDlgArray = m_ShowStreamDlg;
if( !IsWindow(m_ShowStreamDlg[0].m_hWnd) )
return;
if(Is4WayCard())
{
snp.iDlgCount = 4;
for(int i=0; i<4; i++)
{
m_ShowStreamDlg[i].ShowWindow(SW_SHOW);
m_ShowStreamDlg[i].SetShowWay(m_iCardID, true, i);
}
}
else
{
snp.iDlgCount = 1;
m_ShowStreamDlg[0].ShowWindow(SW_SHOW);
m_ShowStreamDlg[0].SetShowWay(m_iCardID, false, 0);
m_ShowStreamDlg[0].NewSize();
}
HRESULT hr = DSStream_GetVideoStream(m_iCardID, StreamNotify, &snp);
if(FAILED(hr))
{
MessageBox("开始数据流回调失败!");
return;
}
}
BOOL CChildFrame::Is4WayCard()
{
long source = 0;
DSStream_WhatInPinRouteToOutPin(m_iCardID, 0, &source);
return (source==4);
}
void CChildFrame::OnNormalSize()
{
// TODO: Add your command handler code here
VIDEOSTREAMINFO vsi;
HRESULT hr;
RECT rcFrame, rcView;
long w, h;
long width, height;
//如果窗口是最大化的,先还原它
DWORD style = GetWindowLong(m_hWnd, GWL_STYLE);
if(style & WS_MAXIMIZE)
ShowWindow(SW_RESTORE);
hr = DSStream_GetVideoInfo(m_iCardID, &vsi, PREVIEW);
if(FAILED(hr))
return;
GetWindowRect(&rcFrame);
GetClientRect(&rcView);
w = (rcFrame.right-rcFrame.left) - (rcView.right-rcView.left);
h = (rcFrame.bottom-rcFrame.top) - (rcView.bottom-rcView.top);
width = vsi.bmiHeader.biWidth + w;
height = vsi.bmiHeader.biHeight + h;
SetWindowPos(NULL,-1, -1, width, height,SWP_NOZORDER|SWP_NOMOVE);
}
void CChildFrame::OnSize(UINT nType, int cx, int cy)
{
CMDIChildWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
//设置视频窗口的位置
RECT rc;
GetClientRect(&rc);
DSStream_SetWindowPos(m_iCardID, rc);
}
//视频发生错误时的回调消息
void CChildFrame::OnVideoErrorNotify(WPARAM wparam, LPARAM lparam)
{
DSStreamError errorCode = (DSStreamError) (lparam & 0x0000FFFFL);
int iCardID = (lparam>>16) & 0x0000FFFFL;
char szErrorInfo[300];
switch(errorCode)
{
case Error_FirstNotifyMsg: //收到这个错误,必须调用 DSStream_ManageNotifyMessage()
DSStream_ManageNotifyMessage(iCardID);
break;
case Error_DiskFull:
sprintf(szErrorInfo, "%d号卡", iCardID);
MessageBox("磁盘已满,按“确定”停止录像", szErrorInfo);
// SendMessage(WM_COMMAND, ID_STOPCAPTURE);
break;
case Error_VideoSizeChange:
sprintf(szErrorInfo, "%d号卡:%d x %d", iCardID, LOWORD(wparam), HIWORD(wparam));
SetWindowText(szErrorInfo);
break;
case Error_StreamStatusChange:
//视频流状态改变。不过,无法获得“停止”状态 ^_^
break;
case Error_CaptureError:
sprintf(szErrorInfo, "%d号卡录像异常:0x%08X \n 按“确定”停止录像",
iCardID, wparam);
MessageBox(szErrorInfo);
// SendMessage(WM_COMMAND, ID_STOPCAPTURE);
break;
default:
break;
}
}
void CChildFrame::OnConfigDialog()
{
// TODO: Add your command handler code here
CConfigDlg dlg(m_iCardID, this);
dlg.DoModal();
//======== Add for ver5.2, begin =================
if( ::IsWindowVisible(m_ShowStreamDlg[0].m_hWnd) )
{
SendMessage(WM_COMMAND, ID_STOPSHOWSTREAM, NULL);
SendMessage(WM_COMMAND, ID_STARTSHOWSTREAM, NULL);
}
//======== Add for ver5.2, end ===================
}
void CChildFrame::OnPropertyDialog()
{
// TODO: Add your command handler code here
CPropertyDlg dlg(m_iCardID);
dlg.DoModal();
//======== Add for ver5.2, begin =================
if( ::IsWindowVisible(m_ShowStreamDlg[0].m_hWnd) )
{
SendMessage(WM_COMMAND, ID_STOPSHOWSTREAM, NULL);
SendMessage(WM_COMMAND, ID_STARTSHOWSTREAM, NULL);
}
//======== Add for ver5.2, end ===================
}
void CChildFrame::OnUpdateStartshowstream(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
//pCmdUI->Enable(FALSE);
}