📄 sshowcenter.cpp
字号:
// 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 + -