📄 viewstatic.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 + -