mainfrm.cpp

来自「ucOS 模拟环境」· C++ 代码 · 共 845 行 · 第 1/2 页

CPP
845
字号
// MainFrm.cpp : implementation of the CMainFrame class
//


#include "stdafx.h"
#include "viewer.h"
#include "MainFrm.h"
#include "typedef.h"
#include "keydef.h"


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

#define  BACKGROUND_COLOR   (RGB(196,196,196))

#define SCR_WIDTH 	112
#define SCR_HEIGHT	128

#define KEYBOARD_W	320
#define KEYBOARD_H	95

#define	ED_XDOTS	SCR_WIDTH
#define	ED_YDOTS	SCR_HEIGHT



static CMainFrame *g_pMainFrm = NULL;

typedef unsigned long KEYTYPE;
extern "C" unsigned char		DispMap[ DISP_BUF_SIZE +10];


static CKeyQueue PCKeyQueue(4);


extern "C" void ResumeTask(void)
{
	
	::ResumeThread(g_pMainFrm->m_pTheThread->m_hThread);
}


extern "C" void SuspendTask(void)
{
//	CMainFrame *pMainFrm = (CMainFrame *)::AfxGetMainWnd();
	::SuspendThread(g_pMainFrm->m_pTheThread->m_hThread);
}
//----------------------------------------------------------------------
extern "C" void TurnOffSCR(void)
{
	//	pViewWnd->TurnOffSCR();
}
//----------------------------------------------------------------------
extern "C" bool AddPCKey(uchar key)
{
   bool bReturn = (Bool)PCKeyQueue.AddValue(key);
   ResumeTask();
   return bReturn;
}
//----------------------------------------------------------------------
//----------------------------------------------------------------------
extern "C" Bool HasPCKey(void)
{
	return (bool)PCKeyQueue.HasValue();
}
//----------------------------------------------------------------------
extern "C" uchar GetPCKey(void)
{
	uchar key;
	key = PCKeyQueue.GetValue();
	return key;

}
//----------------------------------------------------------------------
extern "C" void ClearPCKey(void)
{
#ifdef PCVER
	PCKeyQueue.Clear();
#else

#endif
}
//----------------------------------------------------------------------
extern "C" uchar TestPCKey(void)
{
	return PCKeyQueue.TestValue();
}

CKeyQueue::CKeyQueue(int size)
{
	bufsize = size;
	if(bufsize<2) bufsize = 2;
	else if(bufsize>512) bufsize = 512;

	pQueueBuf = (uchar*)malloc(bufsize);

	head = tail = 0;

	synchronize = 0;
}
//----------------------------------------------------------------------
CKeyQueue::~CKeyQueue()
{
	free(pQueueBuf);
}
//----------------------------------------------------------------------
uchar CKeyQueue::GetValue(void)
{
	if(synchronize) return 0xff;

	synchronize = 1;

	if(tail != head)
	{
		++head;
		if(head>=bufsize) head = 0;

		synchronize = 0;

		return *(pQueueBuf+head);
	}
	else
	{
		synchronize = 0;

		return 0xff;
	}
}
//----------------------------------------------------------------------
void CKeyQueue::Clear(void)
{
	if(synchronize==0)
		head = tail = 0;
}
//----------------------------------------------------------------------
bool CKeyQueue::AddValue(uchar val)
{
	int temp;

	if(synchronize) return false;

	synchronize = 1;

	temp = tail + 1;
	if(temp>=bufsize) temp = 0;

	if( temp != head)
	{
		tail = temp;
		*(pQueueBuf+tail) = val;
	}

	synchronize = 0;

	return (temp != head);
}
//----------------------------------------------------------------------
bool CKeyQueue::HasValue(void)
{
	return(tail!=head);
}
//----------------------------------------------------------------------
unsigned char CKeyQueue::TestValue(void)
{
	int temp;
	if(tail==head) return 0xff;
	else
	{
		temp = head + 1;
		if(temp>=bufsize) temp = 0;

		return *(pQueueBuf+temp);
	}
}



struct TKeyBoardInfo
{
   ulong m_ulKey;
   CRect m_Rect;
   TKeyBoardInfo(ulong ulkey, CRect rect)
   {
	   m_ulKey = ulkey;
	   m_Rect = rect;
   }
};


TKeyBoardInfo KeyMapRect[]=
{
		TKeyBoardInfo(VK_UP/*KEY_DOWN_UP*/,	 CRect(87,  5,  155,  29)), //arrow up KEY_UP
		TKeyBoardInfo(VK_DOWN,	 CRect(87, 65,  154,  89)), //arrow right KEY_DOWN
		TKeyBoardInfo(VK_LEFT,		CRect(5, 34,  72,  59)), //arrow left KEY_LEFT
		TKeyBoardInfo(VK_RIGHT,		CRect(170, 34,  237,  58)), //arrow down KEY_RIGHT
		TKeyBoardInfo(VK_ESCAPE,	CRect(247, 34,  314,  58)), //esc KEY_ESC
		TKeyBoardInfo(VK_RETURN, CRect(87, 35,  154,  58)), //enter KEY_ENTER
		TKeyBoardInfo(0xffffffff,	CRect(0, 0,  0,  0)), 
};



///////////////////////////////////////////////////////////////////////
void DrawBitmap(int x, int y, CDC *pDC, CBitmap *bitmap)
{
   CBitmap *pbmOld = NULL;
   CDC     dcMem;
   BITMAP  bmpinfo; 
 
   dcMem.CreateCompatibleDC(pDC);
   pbmOld = dcMem.SelectObject(bitmap);
   bitmap->GetBitmap(&bmpinfo);

   pDC->BitBlt(x, y, bmpinfo.bmWidth, bmpinfo.bmHeight, &dcMem, 0, 0, SRCCOPY);
 
   dcMem.SelectObject(pbmOld);
   dcMem.DeleteDC();
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_ERASEBKGND()
	ON_WM_DESTROY()
	ON_WM_CLOSE()
	ON_WM_KEYDOWN()
	ON_WM_PAINT()
	ON_WM_TIMER()
	ON_WM_MOUSEWHEEL()
	ON_WM_SYSKEYDOWN()
	ON_COMMAND(ID_ZOOM2, OnZoom2)
	ON_COMMAND(ID_ZOOM1, OnZoom1)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

extern "C" void UpdateScr()
{
	if(g_pMainFrm)
		g_pMainFrm->UpdateScr();
}

CMainFrame::CMainFrame()
{
	m_nZoomNum = 1;
#if 0
	m_mainWndRect.SetRect(0, 0,  640,720);
#else
	CViewerApp *pApp;
	pApp = (CViewerApp *)AfxGetApp();
	pApp->GetAppSetting();
	m_nZoomNum = pApp->m_setting.iZoom;
	m_mainWndRect.left = pApp->m_setting.iWindowLeft;
	m_mainWndRect.top = pApp->m_setting.iWindowTop;
	m_mainWndRect.right = pApp->m_setting.iWindowLeft + pApp->m_setting.iWindowWidth;
	m_mainWndRect.bottom = pApp->m_setting.iWindowTop + pApp->m_setting.iWindowHeight;
#endif
	m_pTheThread = NULL;
	memset( BitmapBuf, 0xff, sizeof( BitmapBuf ) );
	m_nTotalLines = 0;
}

CMainFrame::~CMainFrame()
{
//	KillTimer(IDT_1_S);
//	KillTimer(IDT_BLINK);
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	if( !keyboard.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
			CRect(0,0,0,0), this, AFX_IDW_PANE_FIRST, NULL ) )
	{
		return -1;
	}
//	int nCnt = (*AfxGetApp()->m_lpCmdLine ? sizeof(indicators) : sizeof(indicatorsLook)) / sizeof(UINT);
//	UINT *pinfo = (*AfxGetApp()->m_lpCmdLine ? indicators: indicatorsLook);

	keyboard.ShowWindow(SW_SHOW);

	_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

	if (m_mainWndRect.IsRectEmpty())
		GetWindowRect(&m_mainWndRect);

#ifdef _DEBUG
		 SetWindowPos(	&wndTop, 0, 0, 350, 330, SWP_SHOWWINDOW );
#else
	 	SetWindowPos(&wndTop,
		m_mainWndRect.left, m_mainWndRect.top, m_mainWndRect.Width(), m_mainWndRect.Height(),
		SWP_SHOWWINDOW);

#endif
	CString strTitle;
	strTitle.LoadString(IDR_MAINFRAME);
	strTitle += " (";
	strTitle += __DATE__;
	strTitle += "  ";
	strTitle += __TIME__;
	strTitle += ")";
	SetWindowText(strTitle);
	g_pMainFrm = this;
	
//	GetMenu()->CheckMenuRadioItem( ID_COPYSTYLECOLOR, ID_COPYASTEXT, ID_COPYSTYLECOLOR, MF_BYCOMMAND);

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
//	cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
	return CFrameWnd::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG

void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers

void CMainFrame::UpdateScr()
{
	CClientDC dc(this);
	OnDraw(&dc,TRUE);
}


BOOL CMainFrame::OnEraseBkgnd(CDC* pDC)
{
	// TODO: Add your message handler code here and/or call default
	CRect rect;
	CBrush bkBrush(BACKGROUND_COLOR),	*pOldBrush;
	GetClientRect( &rect );
	pOldBrush=pDC->SelectObject( &bkBrush );
	pDC->Rectangle( &rect );
	pDC->SelectObject( pOldBrush );
	return TRUE;
}

void CMainFrame::OnDestroy()
{
#ifndef _DEBUG
	CViewerApp *pApp;
	pApp = (CViewerApp *)AfxGetApp();
	pApp->WriteAppSetting ();
#endif
//	g_GetSeqKey.AddKey(KEY_EXIT_APP);
	ResumeThread( m_pTheThread->m_hThread );
	WaitForSingleObject( m_pTheThread->m_hThread, 2000);
	CFrameWnd::OnDestroy();
	PostNcDestroy();
	PostQuitMessage(0);
}

void CMainFrame::OnClose()
{
	PostMessage(WM_DESTROY);
	//CFrameWnd::OnClose();
}
void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	if (0)//IS_FM_RUN_SEQ)
	{
		CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
		return;
	}
	KEYTYPE key=-1;
    bool InVaild = false;
	switch( nChar )
	{
		case VK_PRIOR:	
		case VK_NEXT:
			InVaild = true;
			break;
		case VK_UP:		
			key = KEY_DOWN_UP;
			break;
		case VK_DOWN:
			key = KEY_DOWN_DOWN;
			break;
		case VK_LEFT:
			key = KEY_DOWN_LEFT;
			break;
		case VK_RIGHT:	
			key = KEY_DOWN_RIGHT;
			break;
		case VK_RETURN:	
			key = KEY_DOWN_ENT;
			break;
		case VK_ESCAPE:	
			key = KEY_DOWN_C;
			break;
		default:

⌨️ 快捷键说明

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