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

📄 viewstatic.cpp

📁 MPEG4网络视频服务器客户端图象监控软件
💻 CPP
字号:
// ViewStatic.cpp : implementation file
//

#include "stdafx.h"
#include "DvsUser.h"
#include "ViewStatic.h"

#include "DvsUserDlg.h"

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

#define	SAFE_DELETE(p)	{if(p)	{delete (p);	(p)=NULL;	}}
#define	SAFE_RELEASE(p)	{if(p)	{(p)->Release();(p)=NULL;	}}

#define	SCREEN_WIDTH	384;
#define	SCREEN_HEIGHT	256;
#define	SCREEN_BPP		16;



/////////////////////////////////////////////////////////////////////////////
// CViewStatic
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
CViewStatic::CViewStatic()
{
	m_hBitmap		= NULL;
	m_bSizeFlag		= 0;
//	m_rcFullScreen	= CRect(43,14,757,631);
	m_rcFullScreen	= CRect(0,0,1024,768);
	m_rcPaint		= CRect(0,0,352,288);

	ZeroMemory(&m_bi, sizeof(BITMAPINFOHEADER));
	m_bi.biSize		= sizeof(BITMAPINFOHEADER);
	m_bi.biBitCount	= 16;
	m_bi.biWidth	= 352;
	m_bi.biHeight	= 288;
	m_bi.biPlanes	= 1;
	m_bi.biSizeImage= 352*288*2;

	m_hDD = ::DrawDibOpen();
	m_hDC = NULL;
	m_bPlay = 0;

	m_pDisplay		= NULL;
	m_pOffSurface	= NULL;
}
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
CViewStatic::~CViewStatic()
{
	if(m_hDD)
	{
		::DrawDibClose(m_hDD);
		m_hDD = NULL;
	}

	if(m_hDC)
	{
		::ReleaseDC(this->m_hWnd, m_hDC);
		m_hDC = NULL;
	}
}
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
BEGIN_MESSAGE_MAP(CViewStatic, CStatic)
	//{{AFX_MSG_MAP(CViewStatic)
	ON_WM_PAINT()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_RBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CViewStatic message handlers
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
VOID CViewStatic::ShowFlagBmp(HBITMAP hBmp)
{
	m_hBitmap	= hBmp;
	Invalidate();
}
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
void CViewStatic::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	if(m_hBitmap)
	{
		HDC	dcMem;
		dcMem = ::CreateCompatibleDC(dc.m_hDC);
		
		HBITMAP hOld;
		hOld  = (HBITMAP)::SelectObject(dcMem, m_hBitmap);
		::StretchBlt(	dc.m_hDC, 0, 0, 
						m_rcPaint.right-m_rcPaint.left,
						m_rcPaint.bottom-m_rcPaint.top,
						dcMem, 0, 0, 352, 288, SRCCOPY);
		::SelectObject(dcMem, hOld);
		::DeleteDC(dcMem);
	}
	// Do not call CStatic::OnPaint() for painting messages
}
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
void CViewStatic::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
    POINT pt;
	if(!m_bSizeFlag)
	{
		pt.x = pt.y	= 0;
		ClientToScreen(&pt);
		GetClientRect(&m_rcNormal);
		OffsetRect(&m_rcNormal, pt.x, pt.y);
		
		MoveWindow(&m_rcFullScreen);
		Invalidate();
		((CDvsUserDlg*)GetParent())->ShowOneWindow(this->m_hWnd);
		CopyRect(&m_rcPaint, &m_rcFullScreen);
		m_bSizeFlag = 1;
	}
	CStatic::OnLButtonDblClk(nFlags, point);
}
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
void CViewStatic::OnRButtonDown(UINT nFlags, CPoint point) 
{
	if(m_bSizeFlag)
	{
		MoveWindow(&m_rcNormal);
		Invalidate();
		((CDvsUserDlg*)GetParent())->ShowAllWindow(this->m_hWnd);
		CopyRect(&m_rcPaint, &m_rcNormal);
		m_bSizeFlag = 0;

	}
	CStatic::OnRButtonDown(nFlags, point);
}
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
INT CViewStatic::InitDraw()
{
	if(!m_hDC)
		m_hDC	= ::GetDC(this->m_hWnd);
	return 1;
}
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
INT CViewStatic::InitDDraw()
{
	if(m_pDisplay == NULL)
	{
		m_pDisplay	= new CDisplay();
		m_pDisplay->CreateWindowedDisplay(this->m_hWnd, 352, 288);
		m_pDisplay->CreateSurface(&m_pOffSurface, 352, 288);
	}
	return 1;
}
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
INT CViewStatic::Draw(LPVOID lpBuf, int nLen)
{
  int nRet;
	nRet = DrawDibDraw(	m_hDD, m_hDC,
						0,0,m_rcPaint.right-m_rcPaint.left,m_rcPaint.bottom-m_rcPaint.top,
						&m_bi, lpBuf, 
						0, 0, 352, 288,
						DDF_BACKGROUNDPAL);
	return nRet;	
}
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
INT CViewStatic::DDraw(LPVOID lpBuf, int nLen)
{
	DDSURFACEDESC2	ddsd2;
	ZeroMemory(&ddsd2, sizeof(DDSURFACEDESC2));
	ddsd2.dwSize	= sizeof(DDSURFACEDESC2);
	
	HRESULT	r = (m_pOffSurface->GetDDrawSurface())->Lock(NULL, &ddsd2, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, NULL);
	if(SUCCEEDED(r))
	{
		WORD* wDest	= (WORD*)ddsd2.lpSurface;
		WORD* wPos  = (WORD*)lpBuf;
		for(int i=0; i<288; i++)
		{
			//ddsd2.lPitch = 288*2;   :>
			memcpy((char*)wDest+i*352*2, (char*)wPos+(288-1-i)*352*2, 352*2);
//			WORD *wPos = (WORD*)lpBuf + (287-i)*352;
//			for(int j=0; j<352; j++)
//			{
//				*wDest = *wPos;
//				wPos	++;
//				wDest	++;
//			}
		}
		(m_pOffSurface->GetDDrawSurface())->Unlock(NULL);

		POINT pt;
		pt.x = pt.y = 0;
		::ClientToScreen(this->m_hWnd, &pt);
		::GetClientRect(this->m_hWnd, &m_rcPaint);
		::OffsetRect(&m_rcPaint, pt.x, pt.y);

		DDBLTFX ddb;
		ZeroMemory(&ddb, sizeof(DDBLTFX));
		ddb.dwSize = sizeof(DDBLTFX);

		LPDIRECTDRAWSURFACE7 lpFront = m_pDisplay->GetFrontBuffer();
		lpFront->Blt(&m_rcPaint, m_pOffSurface->GetDDrawSurface(), NULL, DDBLT_WAIT, &ddb);
	}
	return 1;
}
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
INT CViewStatic::CloseDraw()
{
	if(m_hDC)
	{
		::ReleaseDC(this->m_hWnd, m_hDC);
		m_hDC = NULL;
	}
	return 1;
}
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------
INT CViewStatic::CloseDDraw()
{
    SAFE_DELETE( m_pOffSurface );
    SAFE_DELETE( m_pDisplay );	
	return 1;
}
//--------------------------------------------------------------
//
//
//
//--------------------------------------------------------------

⌨️ 快捷键说明

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