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

📄 fcdlg.cpp

📁 编译原理的一个课程设计
💻 CPP
字号:
#include "stdafx.h"
#include "FC.h"
#include "FCDlg.h"

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

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();
// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL
// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

CFCDlg::CFCDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFCDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CFCDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	m_bSaved=TRUE;
	m_iPosition=1;
	m_strPrecision="6";
	m_iStatus=1;
	m_strEdit="";
	m_strFile="";

	m_iBack=4;
	m_iBackChoice=0;
	m_bBlankLine=TRUE;
	m_bExitWait=TRUE;
	m_bMainFunction=FALSE;
	m_bOpSpace=FALSE;
	m_bOutPrecision=FALSE;
	m_bOutRuntime=FALSE;
	m_strCppFile="";
}

void CFCDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFCDlg)
	DDX_Text(pDX, IDC_EDIT, m_strEdit);
	DDX_CBString(pDX, IDC_PRECISION, m_strPrecision);
	DDX_Text(pDX, IDC_POSITION, m_iPosition);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CFCDlg, CDialog)
	//{{AFX_MSG_MAP(CFCDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDB_OPEN, OnOpen)
	ON_BN_CLICKED(IDB_SAVE, OnSave)
	ON_BN_CLICKED(IDB_SAVE_AS, OnSaveAs)
	ON_BN_CLICKED(IDB_RUN, OnRun)
	ON_BN_CLICKED(IDB_CLEAR, OnClear)
	ON_BN_CLICKED(IDB_ABOUT_EDIT, OnAboutEdit)
	ON_BN_CLICKED(IDB_ABOUT_GRM, OnAboutGrm)
	ON_BN_CLICKED(ID_APP_ABOUT, OnAppAbout)
	ON_EN_CHANGE(IDC_EDIT, OnChangeEdit)
	ON_BN_CLICKED(IDB_SET_POSITION, OnSetPosition)
	ON_EN_KILLFOCUS(IDC_POSITION, OnKillfocusPosition)
	ON_CBN_KILLFOCUS(IDC_PRECISION, OnKillfocusPrecision)
	ON_BN_CLICKED(IDB_TRANSLATE, OnTranslate)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL CFCDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);
	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	GetDlgItem(IDC_STATIC_PRECISION)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_PRECISION)->ShowWindow(SW_HIDE);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CFCDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

void CFCDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
		CDialog::OnPaint();
}

HCURSOR CFCDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
//CFCDlg 消息处理函数//////////////////////////////////////////////////////////
void CFCDlg::OnOpen() 
{
	UpdateData(TRUE);
	switch(m_iStatus)
	{
	case 1://edit
		On_OpenSource();
		break;
	case 2://compile
		On_OpenCode();
		break;
	case 3://about
		break;
	case 4://translate
		break;
	}
	UpdateData(FALSE);
}

void CFCDlg::OnSave() 
{
	UpdateData(TRUE);
	switch(m_iStatus)
	{
	case 1://eidt
		On_SaveSource();
		break;
	case 2://compile
		On_SaveCode();
		break;
	case 3://about
		On_SaveAbout();
		break;
	case 4://translate
		break;
	}
	UpdateData(FALSE);
}

void CFCDlg::OnSaveAs() 
{
	UpdateData(TRUE);
	switch(m_iStatus)
	{
	case 1://edit
		On_SaveAsSource();
		break;
	case 2://compile
		On_SaveResult();
		break;
	case 3://about
		break;
	case 4://translate
		break;
	}
	UpdateData(FALSE);
}

void CFCDlg::OnRun() 
{
	UpdateData(TRUE);
	switch(m_iStatus)
	{
	case 1://edit
		On_Compile();
		break;
	case 2://compile
		On_Interpret();
		break;
	case 3://about
		break;
	case 4://translate
		break;
	}
	UpdateData(FALSE);
}

void CFCDlg::OnClear() 
{
	UpdateData(TRUE);
	switch(m_iStatus)
	{
	case 1://edit
		m_strEdit="";
		m_strFile="";
		m_bSaved=TRUE;
		SetWindowText("FC 2.2");
		break;
	case 2://compile
		m_strEdit="";
		SetWindowText("FC 2.2 - 解释器");
		break;
	case 3://about
		break;
	case 4://translate
		break;
	}
	UpdateData(FALSE);
}

void CFCDlg::OnAboutEdit() 
{
	UpdateData(TRUE);
	if(m_iStatus==1)//edit
		On_AboutEdit();
	UpdateData(FALSE);
}

void CFCDlg::OnAboutGrm() 
{
	UpdateData(TRUE);
	if(m_iStatus==1)//edit
		On_AboutGrm();
	UpdateData(FALSE);
}

void CFCDlg::OnAppAbout() 
{
	UpdateData(TRUE);
	if(m_iStatus==1)//edit
	{
		CAboutDlg dlg;
		dlg.DoModal();
	}
	UpdateData(FALSE);
}

void CFCDlg::OnCancel() 
{
	UpdateData(TRUE);
	switch(m_iStatus)
	{
	case 1://edit
		On_Exit();
		break;
	case 2://compile
		On_ExitCompile();
		break;
	case 3://about
		On_ExitAbout();
		break;
	case 4://translate
		On_ExitTranslate();
		break;
	}
	UpdateData(FALSE);
}

void CFCDlg::OnChangeEdit() 
{
	if(m_iStatus!=1)
		return;
	if(m_bSaved)
	{
		m_bSaved=FALSE;
		if(m_strFile=="")
			SetWindowText("FC 2.2 *");
		else
			SetWindowText("FC 2.2 - "+m_strFile+" *");
	}
}

void CFCDlg::OnKillfocusPrecision() 
{
	if(m_iStatus!=2)
		return;
	int OldPrecision=atoi(m_strPrecision),precision;
	UpdateData(TRUE);
	int i,length=m_strPrecision.GetLength();
	for(i=0;i<length;i++)
		if(m_strPrecision[i]<'0' || m_strPrecision[i]>'9')
			break;
	if(i==0 || i!=length)
	{
		MessageBox("请输入正确的“输出精度”!\n","FC 2.1",MB_OK|MB_ICONEXCLAMATION);
		GetDlgItem(IDC_PRECISION)->SetFocus();
		((CEdit*)GetDlgItem(IDC_PRECISION))->SetSel(0,-1);
		return;
	}
	precision=atoi(m_strPrecision);
	if(precision<0 )precision=0;
	if(precision>15)precision=15;
	if(precision!=OldPrecision)
	{
		m_strPrecision.Format("%d",precision);
		UpdateData(FALSE);
		if(MessageBox("要重新执行程序吗?","FC 2.2",MB_YESNO|MB_ICONQUESTION)==IDYES)
			On_Interpret();
	}
}

void CFCDlg::OnKillfocusPosition() 
{
	if(m_iStatus!=1)
		return;
	UpdateData(TRUE);
	UINT nLine=((CEdit*)GetDlgItem(IDC_EDIT))->GetLineCount();
	if(m_iPosition<1)m_iPosition=1;
	if(m_iPosition>nLine)m_iPosition=nLine;
	UpdateData(FALSE);
}

void CFCDlg::OnSetPosition() 
{
	if(m_iStatus!=1)
		return;
	UpdateData(TRUE);
	CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
	pEdit->SetFocus();
	pEdit->SetSel(pEdit->LineIndex(m_iPosition-1),pEdit->LineIndex(m_iPosition));
}

void CFCDlg::OnTranslate() 
{
	if(m_iStatus!=1)
		return;
	UpdateData(TRUE);
	On_Translate();
	UpdateData(FALSE);
}

⌨️ 快捷键说明

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