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

📄 sshowcenter.cpp

📁 此代码使用bmp图作为主要界面
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// SshowCenter.cpp : implementation file
//

#include "stdafx.h"
#include "SuperViseSystem.h"
#include "SshowCenter.h"
#include "HikVisionSdk.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

COLORREF gBackgroundColor = RGB(10, 10, 10);
/////////////////////////////////////////////////////////////////////////////


CSshowCenter::CSshowCenter()
{
	m_bDisplayTimer = FALSE;

	m_choosplay = true;
	m_bClicbutton = true;

	m_bFirst= FALSE;
	m_bSecond = FALSE;
	m_bThird= FALSE;
	m_bFouth=FALSE ;
	m_bFifth=FALSE;

	m_bDisplay = true;
    m_bDisplay1=FALSE;
    m_bDisplay2=FALSE;
	m_bDisplay3=FALSE;

	m_ballvedio = false;
	m_bLclick = false;
	
	m_nOpenChannelCount = 1;
}

CSshowCenter::~CSshowCenter()
{

}


BEGIN_MESSAGE_MAP(CSshowCenter, CWnd)
	//{{AFX_MSG_MAP(CSshowCenter)
	ON_WM_CREATE()
	ON_WM_PAINT()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CSshowCenter message handlers
#define VIDEO_MULTI_CHANNEL 0
#define VIDEO_SINGLE_CHANNEL 1
#define VIDEO_PLAYBACK 2
#define MAX_CHANNELS 64

CString  strArray1[16];
RECT rectList[MAX_CHANNELS +1];
HANDLE ChannelHandle[MAX_CHANNELS];
HANDLE hChannelHandle[MAX_CHANNELS];
int iLastSelect = 0;
int iOldSelect =-1;
int DisplayMode = 0; // 0: normal video preview
// 1: single video channel preview
// 2: playback mode
extern BOOL bDdrawMode;

extern BOOL bOverlayMode;
extern BOOL bAudioPre;
extern void CALLBACK DrawFun(long nport, HDC hDc,LONG nUser);


static BOOL bFirstPreview = TRUE;
static CBrush tempBrush(gBackgroundColor);

int CSshowCenter::m_InumberCount = 0;
//////////////////////////////////////////////////////////////////////////////////
BOOL CSshowCenter::Create(DWORD dwStyle, CRect rect, CWnd* pParent, UINT id) 
{
	BOOL result ;
	result = CWnd::CreateEx(NULL , 
		NULL, NULL, dwStyle, 
		rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,
		pParent->GetSafeHwnd(), (HMENU)id) ;
	
    if( !result )
		AfxMessageBox("Error creating window");
	
	m_ctlRect = rect ;
	pParent->ClientToScreen(m_ctlRect) ;
	ScreenToClient(m_ctlRect) ;
	//---绿色线条框架的坐标的初始化
	m_rcWnd.top = 0;
	m_rcWnd.left = 0;
	m_rcWnd.bottom = m_rcWnd.top + rect.Height();
	m_rcWnd.right = m_rcWnd.left + rect.Width();
	
	InitParam();//初始化屏幕的为几行几列。
	
	return result;
}


int CSshowCenter::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
    //初始化一开始为几个屏幕
	nSplitCount = 1;//----nSplitCount为Center控件分为4个小屏幕
	
    CDC *pDC = GetDC();
	m_MemDC1.CreateCompatibleDC(pDC);
	m_bitmap1 = (HBITMAP)LoadImage(AfxGetInstanceHandle(),"res\\未标题-2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
	
	return 0;
}


void CSshowCenter::InitParam()
{	
	//初始化一开始为几个屏幕
	m_iCols = 1;
	m_iRows = 1;
	
	CBitmap bitmap;
	
	if(m_MenDC !=NULL)   
		m_MenDC.DeleteDC();
	m_MenDC.CreateCompatibleDC(GetDC());
	bitmap.CreateCompatibleBitmap(GetDC(),m_rcWnd.Width(),m_rcWnd.Height());///建立与显示设备兼容的位图
	m_MenDC.SelectObject(&bitmap);		    //将位图选入内存场境
	bitmap.DeleteObject();
	
	
	if(m_BackgroundDC !=NULL)   
		m_BackgroundDC.DeleteDC();
	m_BackgroundDC.CreateCompatibleDC(GetDC());
	bitmap.CreateCompatibleBitmap(GetDC(),m_rcWnd.Width(),m_rcWnd.Height());///建立与显示设备兼容的位图
	m_BackgroundDC.SelectObject(&bitmap);		    //将位图选入内存场境
	bitmap.DeleteObject();
	
	if(m_SelDC!=NULL)   
		m_SelDC.DeleteDC();
	m_SelDC.CreateCompatibleDC(GetDC());
	bitmap.CreateCompatibleBitmap(GetDC(),m_rcWnd.Width(),m_rcWnd.Height());///建立与显示设备兼容的位图
	m_SelDC.SelectObject(&bitmap);		    //将位图选入内存场境
	bitmap.DeleteObject();
	CRect rect1(10,30,260,100);
	
}

void CSshowCenter::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	m_MemDC1.SelectObject(m_bitmap1);	
	dc.BitBlt(0,0,752,602,&m_MemDC1,0,0,SRCCOPY);
	
    if(m_bDisplay)
	{
		for(int sc = 0; sc < GetTotalDSPs(); sc++)
		{
			::StopVideoPreview(ChannelHandle[sc]);
			::ChannelClose(ChannelHandle[sc]);
		}			
		for(int open = 0; open < GetTotalDSPs(); open++)
		{	
			::ChannelOpen(open);
		}
		StartVideo(&dc);
	}
	else
		if(m_bDisplay1)
		{
			VideoDrow(&dc, m_InumberCount);
		}
		
}
//---单击某一区域,并且让这一区域周边变为红色
void CSshowCenter::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CDC *pDC = GetDC();
	//调用GetSelect,判断坐标点是在哪一块小屏幕之内。
	SelectRect(GetSelect(point), pDC);
	
	this->ScreenToClient(&point);
//------点击一个区域 ,并且使这个区域的周边变为红色	
	m_SelDC.BitBlt(0, 0, m_rcWnd.Width(), m_rcWnd.Height(), &m_BackgroundDC , 0, 0, SRCCOPY);
	
	CPen pen,*pOldPen;	//PS_SOLID为实线类型,公有7个类型。2为笔的粗细。
	pen.CreatePen(PS_SOLID, 2, RGB(255,0,0));
	pOldPen = m_SelDC.SelectObject(&pen);
	
	CBrush* oldbrush;
	oldbrush=(CBrush *)m_SelDC.SelectStockObject(NULL_BRUSH);
	CRect rc,Rect,DisRect;

	if(m_choosplay)
	{  
		//调用GetSelIndex来确定当前作坐标点是在哪一个通道里
		m_iSelIndex = GetSelIndex(point.x, point.y);
		//获得当前通道的坐标点
		rc = GetSelRect(m_iSelIndex);
		rc.left	= rc.left + 4;
		rc.top = rc.top + 4;
		
		m_iChangeCount = m_iSelIndex;
	}

	else
	{
		if(m_bFirst)
		{ 
			for(int i= 0; i< 7 ; i++)
			{
//--直接把获取到的通道大大小坐标给了RC,在这里红色线条的大小是随着
//--通道屏幕的大小一起变化的!这样不好!	
				Rect = anomalyrect[i];
				DisRect = rectlist[i];
			
				if (((DisRect.left < point.x) && (point.x< DisRect.right)) && (DisRect.top < point.y) && (point.y < DisRect.bottom))
				{
					rc = Rect;
					rc.left	= rc.left + 4;
					rc.top	= rc.top + 4;
					rc.bottom = rc.bottom - 2;
					rc.right = rc.right - 2;
					m_iChangeCount = i;
				}
			}
		}
		
		if(m_bSecond)
		{ 
			for(int j= 0; j< 10 ; j++)
			{
				Rect = anomalyrect[j];
				if (((Rect.left < point.x) && (point.x< Rect.right)) && (Rect.top < point.y) && (point.y < Rect.bottom))
				{
					rc = anomalyrect[j];
					rc.left	= rc.left + 4;
					rc.top	= rc.top + 4;
					rc.bottom = rc.bottom - 2;
					rc.right = rc.right - 2;

					m_iChangeCount =j;
				}
			}
		}
		if(m_bThird)
		{ 
			for(int k= 0; k< 8 ; k++)
			{
				Rect = anomalyrect[k];
				if (((Rect.left < point.x) && (point.x< Rect.right)) && (Rect.top < point.y) && (point.y < Rect.bottom))
				{
					rc = anomalyrect[k];
					rc.left	= rc.left + 4;
					rc.top	= rc.top + 4;
					rc.bottom = rc.bottom - 2;
					rc.right = rc.right - 2;

					m_iChangeCount =k;
				}
			}
		}
		if(m_bFouth)
		{ 
			for(int l= 0; l< 6 ; l++)
			{
				Rect = anomalyrect[l];
				if (((Rect.left < point.x) && (point.x< Rect.right)) && (Rect.top < point.y) && (point.y < Rect.bottom))
				{
					rc = anomalyrect[l];
					rc.left	= rc.left + 4;
					rc.top = rc.top + 4;
					rc.bottom = rc.bottom - 2;
					rc.right = rc.right - 2;

					m_iChangeCount =l;
				}
			}
		}
		if(m_bFifth)
		{ 
			for(int m= 0; m< 13 ; m++)
			{
				Rect = anomalyrect[m];
				if (((Rect.left < point.x) && (point.x< Rect.right)) && (Rect.top < point.y) && (point.y < Rect.bottom))
				{
					rc = anomalyrect[m];
					rc.left		= rc.left + 4;
					rc.top		= rc.top + 4;
					rc.bottom = rc.bottom - 2;
					rc.right = rc.right - 2;

					m_iChangeCount =m;
				}
			}
		}
	}	
	m_SelDC.Rectangle(rc);
	m_SelDC.SelectObject(oldbrush);
	GetDC()->BitBlt(0, 0, m_rcWnd.Width(), m_rcWnd.Height(), &m_SelDC , 0, 0, SRCCOPY);
	
	CWnd::OnLButtonDown(nFlags, point);
}
//---双击一个区域,并且使这个区域变为全屏!
void CSshowCenter::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	int s;
	
	if(m_bClicbutton)  //1规则图形 0不规则图形
	{
		if((DisplayMode == VIDEO_MULTI_CHANNEL) && ((s = GetSelect(point)) != -1))
		{
			for(int count = 0; count< GetTotalDSPs(); count++)
			{
				::StopVideoPreview(ChannelHandle[count]);
			}
			m_bDisplayTimer = TRUE;	
	
			RECT previewWnd;
			GetClientRect(&previewWnd);
			
			TRACE("clear client area\n");
			CDC *dc = GetDC(); // device context for painting
			
		    CBrush tempBrush(gBackgroundColor);
			CBrush *oldBrush = dc->SelectObject(&tempBrush);

			dc->Rectangle(&previewWnd);
			dc->SelectObject(oldBrush);

		  /*  if( previewWnd.bottom -previewWnd.top >=400 && previewWnd.right -previewWnd.left >=400)
			{
				CString title;
				title.Format( strArray1[s]);
				dc->SetTextColor(RGB(255,0,0));
				dc->SetBkMode(TRANSPARENT);
				dc->TextOut(30,30,title);
			}*/
			CShowComPlete(dc,s,previewWnd);//调用此函数实现全显
			ReleaseDC(dc);	
			DisplayMode = VIDEO_SINGLE_CHANNEL;
			m_ballvedio = true;
		}
		else 		
			if(DisplayMode == VIDEO_SINGLE_CHANNEL)			
			{	
				if(m_ballvedio)
				{
					m_iCols = aheadCols;//把改变的值复原
					m_iRows = aheadrows;				
					Invalidate();
					m_ballvedio = false;
				}
				m_bDisplayTimer = FALSE;	
				CDC *pDC = GetDC();	
				ReleaseDC(pDC);				
				DisplayMode = VIDEO_MULTI_CHANNEL;	
			}
	}
//---------------以下是不规则画法-----------------------------------
	else
	{
		if((DisplayMode == VIDEO_MULTI_CHANNEL) && ((s = GetSelect(point)) != -1))
		{
			for(int count = 0; count< GetTotalDSPs(); count++)
			{
				::StopVideoPreview(ChannelHandle[count]);
			}

			RECT previewWnd1;
			GetClientRect(&previewWnd1);
			
			previewWnd1.left = previewWnd1.left;
			previewWnd1.top = previewWnd1.top;
			previewWnd1.right = previewWnd1.right;
			previewWnd1.bottom = previewWnd1.bottom + 12;
	
			TRACE("clear client area\n");
			CDC *dc1 = GetDC();

			CBrush tempBrush1(gBackgroundColor);
			CBrush *oldBrush1 = dc1->SelectObject(&tempBrush1);
			
			dc1->Rectangle(&previewWnd1);
			dc1->SelectObject(oldBrush1);

			/*if( previewWnd1.bottom -previewWnd1.top >=400 && previewWnd1.right -previewWnd1.left >=400)
			{
				CString title;
				title.Format( strArray1[s]);
				dc1->SetTextColor(RGB(255,0,0));
				dc1->SetBkMode(TRANSPARENT);
				dc1->TextOut(30,30,title);
			}*/
			ReleaseDC(dc1);	
			CShowComPlete(dc1,s,previewWnd1);//调用此函数实现全显
			m_choosplay =true;
			m_bFirst = false;
			DisplayMode = VIDEO_SINGLE_CHANNEL;		
		}
		else 			
			if(DisplayMode == VIDEO_SINGLE_CHANNEL)			
			{
				if(m_ballvedio)
				{
					m_choosplay =false;
					m_bFirst = true;
					Invalidate();
					m_ballvedio = false;
				}

⌨️ 快捷键说明

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