📄 graphicview.cpp
字号:
// GraphicView.cpp : implementation file
//
#include "stdafx.h"
#include "Architecture.h"
#include "Globals.h"
#include "DlxDoc.h"
#include "GraphicView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const COLORREF CYAN=RGB(0,255,255);
const COLORREF RED=RGB(255,0,0);
const COLORREF GREEN=RGB(0,255,0);
const COLORREF BLUE=RGB(0,0,255);
const COLORREF WHITE=RGB(255,255,255);
const COLORREF PURPLE=RGB(255,0,255);
const COLORREF YELLOW=RGB(255,255,0);
CPoint Orign = CPoint(125,25);
CString State[MAXSTATE] = {"STALL","IF","ID","EXE","MEM","WB","HALT","IDLE"};
COLORREF Color[MAXSTATE] = {WHITE,CYAN,RED,BLUE,PURPLE,GREEN,YELLOW,WHITE};
void ShowBlock(CDC * pDC,int state,int i,int clock)
{
if(state != _S_HALT)
{
CBrush * brush = new CBrush;
CRect rect;
rect.left = clock * BLOCKWIDTH + Orign.x;
rect.right = rect.left + BLOCKWIDTH;
rect.top = i * BLOCKLENGTH * 2 + Orign.y;
rect.bottom = rect.top + BLOCKLENGTH;
brush->CreateSolidBrush(Color[state]);
pDC->Rectangle(rect);
pDC->FillRect(rect,brush);
pDC->SetTextAlign(TA_CENTER);
pDC->SetBkColor(Color[state]);
pDC->TextOut((rect.left+rect.right)/2,(rect.top+rect.bottom)/2-BLOCKLENGTH/2,State[state]);
pDC->MoveTo(rect.left,rect.top);
pDC->LineTo(rect.left,rect.bottom);
pDC->LineTo(rect.right,rect.bottom);
pDC->LineTo(rect.right,rect.top);
delete brush;
}
}
/////////////////////////////////////////////////////////////////////////////
// CGraphicView
IMPLEMENT_DYNCREATE(CGraphicView, CScrollView)
CGraphicView::CGraphicView()
{
}
CGraphicView::~CGraphicView()
{
}
BEGIN_MESSAGE_MAP(CGraphicView, CScrollView)
//{{AFX_MSG_MAP(CGraphicView)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGraphicView drawing
void CGraphicView::OnDraw(CDC* pDC)
{
CDlxDoc* pDoc = (CDlxDoc*)GetDocument();
ASSERT_VALID(pDoc);
pDC->MoveTo(Orign.x,Orign.y-BLOCKLENGTH);
pDC->LineTo(Orign.x,Orign.y+800);
pDC->MoveTo(Orign);
pDC->LineTo(Orign.x+MAXCLOCK*BLOCKWIDTH+800,Orign.y);
pDC->TextOut(0,Orign.y-BLOCKLENGTH,"Instruction/Cycle");
for(int i=0; i < MAXCLOCK; i++)
{
CString str;
str.Format("%d",i+1);
if(i<pDoc->m_Clock)
pDC->SetTextColor(RED);
pDC->TextOut(Orign.x+i*BLOCKWIDTH+BLOCKWIDTH/2,Orign.y-BLOCKLENGTH,str);
pDC->SetTextColor(RGB(0,0,0));
pDC->MoveTo(Orign.x+i*BLOCKWIDTH+BLOCKWIDTH,Orign.y-BLOCKLENGTH/2);
pDC->LineTo(Orign.x+i*BLOCKWIDTH+BLOCKWIDTH,Orign.y);
}
int indent = 0;
int forward = pDoc->GetForwarding();
for(i=0; i < pDoc->m_CurInstr; i++)
{
Instruction * pInstr = &pDoc->m_Instruction[i];
pDC->SetBkColor(WHITE);
pDC->SetTextAlign(TA_LEFT);
pDC->TextOut(0,Orign.y+i*BLOCKLENGTH*2,pInstr->cmdString);
for(int j=i; pInstr->states[j] == _S_STALL; j++);
for(; j < pDoc->m_Clock; j++)
{
::ShowBlock(pDC,pInstr->states[j],i,j);
for(int k=0; k < 2; k++)
if(pInstr->states[j] > _S_STALL && pInstr->states[j] < _S_HALT)
if(pInstr->forward[pInstr->states[j]-1][k] != CSize(0,0))
{
int left,top,right,bottom;
if(pInstr->states[j]-1 == _S_IF &&
pDoc->m_Instruction[pInstr->forward[_S_IF][k].cy].states[pInstr->forward[_S_IF][k].cx] == _S_WB)
{
left = Orign.x+pInstr->forward[pInstr->states[j]-1][k].cx*BLOCKWIDTH+BLOCKWIDTH/2;
right = left;
}
else
{
left = Orign.x+pInstr->forward[pInstr->states[j]-1][k].cx*BLOCKWIDTH;
right = Orign.x+j*BLOCKWIDTH+BLOCKWIDTH/2;
}
top = Orign.y+pInstr->forward[pInstr->states[j]-1][k].cy*BLOCKLENGTH*2+BLOCKLENGTH;
bottom = Orign.y+i*BLOCKLENGTH*2;
pDC->MoveTo(left,top);
pDC->LineTo(right,bottom);
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CGraphicView diagnostics
#ifdef _DEBUG
void CGraphicView::AssertValid() const
{
CScrollView::AssertValid();
}
void CGraphicView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGraphicView message handlers
void CGraphicView::OnInitialUpdate()
{
SetScrollSizes(MM_TEXT,CSize(5000,2000));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -