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

📄 dlg.cpp

📁 我花了很长时间做的一个语法分析器
💻 CPP
字号:
// Dlg.cpp : 实现文件
//

#include "stdafx.h"
#include "MyLEX.h"
#include "Dlg.h"
#include ".\dlg.h"


// CDlg 对话框
extern CString content1;
IMPLEMENT_DYNAMIC(CDlg, CDialog)
CDlg::CDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDlg::IDD, pParent)
{
	pos=0;
}

CDlg::~CDlg()
{
}

void CDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, m_list);
}


BEGIN_MESSAGE_MAP(CDlg, CDialog)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
	ON_LBN_SELCHANGE(IDC_LIST1, OnLbnSelchangeList1)
	ON_WM_CTLCOLOR()
END_MESSAGE_MAP()


// CDlg 消息处理程序

BOOL CDlg::OnInitDialog()
{
	
	CDialog::OnInitDialog();
    CRect rect;
	::GetWindowRect(::GetDesktopWindow(),rect);
	SetWindowPos(&wndTop,0,0,rect.right,rect.bottom,SWP_DRAWFRAME);
	m_list.SetCurSel(0);
	int j=0;CString s;
	int ll=content1.GetLength();
	m_list.ResetContent();
	while(j<ll)
	{
		while(j<ll&&content1.GetAt(j)!='\r'&&content1.GetAt(j)!='\n')
		{
			s+=content1.GetAt(j);
			j++;
		}
		if(s!="")
			m_list.AddString(s);
		s="";j++;
	}
	brush1=new CBrush(RGB(0,255,0));
	return TRUE; // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

void CDlg::drawTree(TreeNode* root,LONG left,LONG right,CDC* dc,int f)
{
	if(!root->list.length)
	{
		int i=0;
		int len=1;
		LONG p1=(right+left)/2;
		LONG p2=left+((2*i+1)*(right-left))/(2*len);
		dc->SetBkMode(TRANSPARENT);
		CSize size;
		size=dc->GetTextExtent(root->name);
		CBrush *brush,*pOldBrush;
		brush=new CBrush(RGB(0,255,0));
		pOldBrush=dc->SelectObject(brush);
		dc->Ellipse(p1-size.cx/2,f*60-10,p1+size.cx/2,f*60+10);
		dc->SelectObject(pOldBrush);
		dc->TextOut(p1-size.cx/2,f*60-size.cy/2,root->name);
		return ;
	}
	else 
	{
		int len=root->list.length;
		for(int i=0;i<len;i++)
		{
			LONG p1,p2;
			if(i+1<len&&root->list.Find(i+2)->list.length==1&&root->list.Find(i+2)->list.Find(1)->list.length==0
				&&i>0&&root->list.Find(i)->list.length==1&&root->list.Find(i)->list.Find(1)->list.length==0
				&&root->list.Find(i+1)->list.length==1&&f<6)
			{
				p1=(right+left)/2;
				p2=left+((2*i+1)*(right-left))/(2*len);
				dc->MoveTo(p1,60*f);
				dc->LineTo(p2,60*(f+1));
				dc->SetBkMode(TRANSPARENT);
				CSize size;
				size=dc->GetTextExtent(root->name);
				CBrush *brush,*pOldBrush;
				brush=new CBrush(RGB(0,255,0));
				pOldBrush=dc->SelectObject(brush);
				dc->Ellipse(p1-size.cx/2,f*60-10,p1+size.cx/2,f*60+10);
				dc->SelectObject(pOldBrush);
				dc->TextOut(p1-size.cx/2,f*60-size.cy/2,root->name);

				drawTree(root->list.Find(i+1),left,right,dc,f+1);
			}
			else if(i+1<len&&root->list.Find(i+2)->list.length==1&&root->list.Find(i+2)->list.Find(1)->list.length==0
				&&root->list.Find(i+1)->list.length==1&&f<6)
			{
				p1=(right+left)/2;
				p2=left+((i+1)*(right-left))/len;
				dc->MoveTo(p1,60*f);
				dc->LineTo(p2,60*(f+1));
				dc->SetBkMode(TRANSPARENT);
				CSize size;
				size=dc->GetTextExtent(root->name);
				CBrush *brush,*pOldBrush;
				brush=new CBrush(RGB(0,255,0));
				pOldBrush=dc->SelectObject(brush);
				dc->Ellipse(p1-size.cx/2,f*60-10,p1+size.cx/2,f*60+10);
				dc->SelectObject(pOldBrush);
				dc->TextOut(p1-size.cx/2,f*60-size.cy/2,root->name);

				drawTree(root->list.Find(i+1),p2-(right-left)/len,p2+(right-left)/len,dc,f+1);
			}
			else if(i>0&&root->list.Find(i)->list.length==1&&root->list.Find(i)->list.Find(1)->list.length==0
				&&root->list.Find(i+1)->list.length==1&&f<6)
			{
				p1=(right+left)/2;
				p2=left+(i*(right-left))/(2*len);
				dc->MoveTo(p1,60*f);
				dc->LineTo(p2,60*(f+1));
				dc->SetBkMode(TRANSPARENT);
				CSize size;
				size=dc->GetTextExtent(root->name);
				CBrush *brush,*pOldBrush;
				brush=new CBrush(RGB(0,255,0));
				pOldBrush=dc->SelectObject(brush);
				dc->Ellipse(p1-size.cx/2,f*60-10,p1+size.cx/2,f*60+10);
				dc->SelectObject(pOldBrush);
				dc->TextOut(p1-size.cx/2,f*60-size.cy/2,root->name);

				drawTree(root->list.Find(i+1),p2-(right-left)/len,p2-(right-left)/len,dc,f+1);
			}
			else
			{
				p1=(right+left)/2;
				p2=left+((2*i+1)*(right-left))/(2*len);
				dc->MoveTo(p1,60*f);
				dc->LineTo(p2,60*(f+1));
				dc->SetBkMode(TRANSPARENT);
				CSize size;
				size=dc->GetTextExtent(root->name);
				CBrush *brush,*pOldBrush;
				brush=new CBrush(RGB(0,255,0));
				pOldBrush=dc->SelectObject(brush);
				dc->Ellipse(p1-size.cx/2,f*60-10,p1+size.cx/2,f*60+10);
				dc->SelectObject(pOldBrush);
				dc->TextOut(p1-size.cx/2,f*60-size.cy/2,root->name);

				drawTree(root->list.Find(i+1),p2-(right-left)/(2*len)-25,p2+(right-left)/(2*len)+25,dc,f+1);
			}

		}
	}
}

void CDlg::OnPaint()
{
	CPaintDC dc(this); 
	CRect rect;
	::GetWindowRect(::GetDesktopWindow(),rect);
	// GetWindowRect(&rect);
	extern List<TreeNode*> P;
	CPen*pen,*pOldPen;
	pen=new CPen(PS_SOLID, 2, RGB(255,0,0));
	pOldPen=dc.SelectObject(pen);
	if(P.length)
	{
		drawTree(P.Find(pos+1),rect.left,rect.right,&dc,1);
	}
	dc.SelectObject(pOldPen);
	// device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CDialog::OnPaint()
}

void CDlg::OnBnClickedButton1()
{
	pos++;
	extern List<TreeNode*> P;
	pos=pos%(P.length);
	m_list.SetCurSel(pos);
	m_list.Invalidate();
	Invalidate();
}

void CDlg::OnLbnSelchangeList1()
{
	pos=m_list.GetCurSel();
	extern List<TreeNode*> P;
	pos=pos%(P.length);
	Invalidate();
}

HBRUSH CDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何属性
	if(nCtlColor==CTLCOLOR_LISTBOX||CTLCOLOR_EDIT||CTLCOLOR_MSGBOX)
	{
		pDC->SetTextColor(RGB(255, 0, 0));
        hbr=(HBRUSH)brush1;
		//pDC->SetBkColor(RGB(0,255,255));

	}
	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	return hbr;
}

⌨️ 快捷键说明

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