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); 
 
	 
}