📄 tonfaview.cpp
字号:
CPen zihuanpen;
stockbrush.CreateStockObject(5);
colorbrush.CreateSolidBrush(RGB(0,0,0));//清绿色
Tbrush.CreateSolidBrush(RGB(0,0,0));//鲜澄色
Dirbrush.CreateSolidBrush(RGB(0,0,0));//清紫色
colorpen.CreatePen(PS_SOLID,1,RGB(54,54,54));
redpen.CreatePen(PS_SOLID,1,RGB(223,53,57));//bezier
quanpen.CreatePen(PS_SOLID,1,RGB(54,54,54));
zihuanpen.CreatePen(PS_SOLID,1,RGB(54,54,54));
CPoint PO[4];
//InitPosition();
//终结点
//CString ST;
//ST.Format("%d",pDoc->T);
//画线
int LO=SetDFAPos.LO;
pDC->SelectObject(&stockbrush);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(24,71,133));
pDC->TextOut(SetDFAPos.LOx,SetDFAPos.LOy-50,"DFA状态图");
//StateTable DFATable;GetDocument()->DFATable;
ListNode * p;
for(int i2=0;i2<=SetDFAPos.num;i2++)
{
p=GetDocument()->DFATable.tableList[i2].next;
while(p!=NULL)
{
//判断直接后趋的结点的状态值
if((i2<p->data)&&(p->data!=-1)) //大 画直线
//if((i2<p->data)&&(p->data!='$'))
{
pDC->SelectObject(&colorpen);
pDC->MoveTo(GetDocument()->DFATable.tableList[i2].point.x,GetDocument()->DFATable.tableList[i2].point.y);
pDC->LineTo(GetDocument()->DFATable.tableList[p->data].point.x,GetDocument()->DFATable.tableList[p->data].point.y);
//画箭头//10|(01|1)*0|1*#
CString sinfo=GetDocument()->ListStr(p->data);
double h,w;
w=SetDFAPos.LO*0.2*sinfo.GetLength()/2.0;//椭圆的Width
h=SetDFAPos.LO*0.5/2.0;//椭圆的Heigth;
float k;//斜率
float af=0.5;//角度
double x1,y1,x2,y2,ox,oy;
x1=GetDocument()->DFATable.tableList[i2].point.x;
y1=GetDocument()->DFATable.tableList[i2].point.y;
x2=GetDocument()->DFATable.tableList[p->data].point.x;
y2=GetDocument()->DFATable.tableList[p->data].point.y;
k=(y2-y1)/(x2-x1+0.000001);
ox=x2-w*h/sqrt(pow(h,2)+pow(w,2)*pow(k,2));
oy=y2-w*h*k/sqrt(pow(h,2)+pow(w,2)*pow(k,2));
pDC->SelectObject(&Dirbrush);
//pDC->Ellipse(x4-SetDFAPos.LO/6,y4-SetDFAPos.LO/6,x4+SetDFAPos.LO/6,y4+SetDFAPos.LO/6);
pDC->Ellipse(ox-SetDFAPos.LO/6,oy-SetDFAPos.LO/6,ox+SetDFAPos.LO/6,oy+SetDFAPos.LO/6);
//---------------------------
pDC->SetTextColor(RGB(0,0,0));
//pDC->TextOut((GetDocument()->DFATable.tableList[i2].point.x+LO/2+GetDocument()->DFATable.tableList[p->data].point.x+LO/2)/2,(GetDocument()->DFATable.tableList[i2].point.y+LO/2+GetDocument()->DFATable.tableList[p->data].point.y+LO/2)/2-15,p->token);
pDC->TextOut((GetDocument()->DFATable.tableList[i2].point.x+GetDocument()->DFATable.tableList[p->data].point.x)/2,(GetDocument()->DFATable.tableList[i2].point.y+LO/2+GetDocument()->DFATable.tableList[p->data].point.y+LO/2)/2-15,p->token);
}
if((i2==p->data)&&(p->data!=-1))
//if((i2==p->data)&&(p->data!='$')) //等于 画回路到自己
{
pDC->SelectObject(&stockbrush);
//pDC->SelectObject(&zihuanpen);
//pDC->Ellipse(GetDocument()->DFATable.tableList[i2].point.x+LO/6,GetDocument()->DFATable.tableList[i2].point.y-LO+LO/3+LO/6,GetDocument()->DFATable.tableList[i2].point.x+5*LO/6,GetDocument()->DFATable.tableList[i2].point.y+LO/6);
pDC->Ellipse(GetDocument()->DFATable.tableList[i2].point.x-LO/6,GetDocument()->DFATable.tableList[i2].point.y-LO,GetDocument()->DFATable.tableList[i2].point.x+4*LO/6,GetDocument()->DFATable.tableList[i2].point.y+LO/6);
pDC->SetTextColor(RGB(241,147,115));
// pDC->TextOut((GetDocument()->DFATable.tableList[i2].point.x+LO/6+GetDocument()->DFATable.tableList[i2].point.x+5*LO/6)/2,GetDocument()->DFATable.tableList[i2].point.y-LO+5,p->token);
pDC->TextOut((GetDocument()->DFATable.tableList[i2].point.x+GetDocument()->DFATable.tableList[i2].point.x+4*LO/6)/2,GetDocument()->DFATable.tableList[i2].point.y-LO*4/3,p->token);
}
if((i2>p->data)&&(p->data!=-1))
//if((i2>p->data)&&(p->data!='$')) //小于 画弧线
{
pDC->SelectObject(&redpen);
PO[0]=CPoint(GetDocument()->DFATable.tableList[p->data].point.x,GetDocument()->DFATable.tableList[p->data].point.y);
PO[3]=CPoint(GetDocument()->DFATable.tableList[i2].point.x,GetDocument()->DFATable.tableList[i2].point.y);
// PO[2]=CPoint((PO[0].x+PO[3].x)/2+abs(PO[0].y-PO[3].y)/1.5,(PO[0].y+PO[3].y)/2-abs(PO[0].x-PO[3].x)/6);
PO[2]=CPoint((PO[0].x+PO[3].x)/2+abs(PO[0].y-PO[3].y)/1.5,(PO[0].y+PO[3].y)/2-abs(PO[0].x-PO[3].x)/6);
PO[1]=PO[2];//CPoint(((p[0].x+p[3].x)*1)/2+10,((p[0].y+p[3].y)*1)/2-50);
pDC->PolyBezier(PO,4);
//画箭头
//MessageBox("");
CString sinfo=GetDocument()->ListStr(p->data);
double h,w;
w=SetDFAPos.LO*0.2*sinfo.GetLength()/2.0;//椭圆的Width
h=SetDFAPos.LO*0.5/2.0;//椭圆的Heigth;
float k;//斜率
float af=0.5;//角度
double x1,y1,x2,y2,ox,oy;
x1=PO[1].x;
y1=PO[1].y;
x2=PO[0].x;
y2=PO[0].y;
k=(y2-y1)/(x2-x1+0.000001);
ox=x2+w*h/sqrt(pow(h,2)+pow(w,2)*pow(k,2));
oy=y2+w*h*k/sqrt(pow(h,2)+pow(w,2)*pow(k,2));
pDC->SelectObject(&Dirbrush);
pDC->Ellipse(ox-SetDFAPos.LO/6,oy-SetDFAPos.LO/6,ox+SetDFAPos.LO/6,oy+SetDFAPos.LO/6);
//10|(01|1)*0|1*#10|(01|1)*0|1*#
// pDC->Ellipse(ox-SetDFAPos.LO/6,oy-SetDFAPos.LO/6,ox+SetDFAPos.LO/6,oy+SetDFAPos.LO/6);
// pDC->Ellipse(x4-SetDFAPos.LO/6,y4-SetDFAPos.LO/6,x4+SetDFAPos.LO/6,y4+SetDFAPos.LO/6);
//---------------------------
pDC->SetTextColor(RGB(54,54,54));
pDC->TextOut(PO[1].x,PO[1].y,p->token);
}
p=p->next;
}
}
//画结点
int maxw=0;
pDC->SelectObject(&colorbrush);
for(int i=0;i<=SetDFAPos.num;i++)
{
CString sinfo=GetDocument()->ListStr(i);
double h,w;
w=SetDFAPos.LO*0.2*sinfo.GetLength()/2;//椭圆的Width
h=SetDFAPos.LO*0.5/2;//椭圆的Heigth;
if(maxw<w*2)maxw=w*2;
p=GetDocument()->zList.head;
while(p!=NULL)
{
if(p->data==i)
{
pDC->SelectObject(&Tbrush);
// pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x,GetDocument()->DFATable.tableList[i].point.y,GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO);
// pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO/10,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO/10,GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO-SetDFAPos.LO/10,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO-SetDFAPos.LO/10);
pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x-w,GetDocument()->DFATable.tableList[i].point.y-h,GetDocument()->DFATable.tableList[i].point.x+w,GetDocument()->DFATable.tableList[i].point.y+h);
pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x-w+w/10,GetDocument()->DFATable.tableList[i].point.y-h+h/10,GetDocument()->DFATable.tableList[i].point.x+w-w/10,GetDocument()->DFATable.tableList[i].point.y+h-h/10);
break;
}
p=p->next;
}
if(p==NULL)
{
pDC->SelectObject(&colorbrush);
//pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x,GetDocument()->DFATable.tableList[i].point.y,GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO);
pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x-w,GetDocument()->DFATable.tableList[i].point.y-h,GetDocument()->DFATable.tableList[i].point.x+w,GetDocument()->DFATable.tableList[i].point.y+h);
}
/*if(GetDocument()->DFATable.tableList[i].next!=NULL)
{
pDC->SelectObject(&colorbrush);
pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x,GetDocument()->DFATable.tableList[i].point.y,GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO);
}
else //终结点
{
pDC->SelectObject(&Tbrush);
pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x,GetDocument()->DFATable.tableList[i].point.y,GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO);
pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO/10,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO/10,GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO-SetDFAPos.LO/10,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO-SetDFAPos.LO/10);
}*/
//输出数字
CString CtrNum;
CtrNum.Format("%d",i);
int m_length=CtrNum.GetLength();
pDC->SetTextColor(RGB(255,255,0));
pDC->TextOut(GetDocument()->DFATable.tableList[i].point.x+(SetDFAPos.LO/2)-w/1.3-23,GetDocument()->DFATable.tableList[i].point.y-h*1.5+(SetDFAPos.LO/2)-15,sinfo);
//pDC->TextOut(GetDocument()->DFATable.tableList[i].point.x-30+(SetDFAPos.LO/1.7)-m_length*4,GetDocument()->DFATable.tableList[i].point.y-10+(SetDFAPos.LO/2),sinfo);
}
//区域
//
pDC->BeginPath();
// CClientDC dc(this);
// CPoint MyPoint=MyScroll;
// pDC->DPtoLP(&MyPoint);
for(i=0;i<=SetDFAPos.num;i++)
{
CString sinfo=GetDocument()->ListStr(i);
int h,w;
w=SetDFAPos.LO*0.2*sinfo.GetLength();
h=SetDFAPos.LO;
pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x-MyScroll.x-w/2,GetDocument()->DFATable.tableList[i].point.y-MyScroll.y-h/2,GetDocument()->DFATable.tableList[i].point.x-MyScroll.x+w/2,GetDocument()->DFATable.tableList[i].point.y-MyScroll.y+h/2);
//pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x-MyScroll.x,GetDocument()->DFATable.tableList[i].point.y-MyScroll.y,GetDocument()->DFATable.tableList[i].point.x-MyScroll.x+SetDFAPos.LO,GetDocument()->DFATable.tableList[i].point.y-MyScroll.y+SetDFAPos.LO);
//pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x-MyPoint.x,GetDocument()->DFATable.tableList[i].point.y-MyPoint.y,GetDocument()->DFATable.tableList[i].point.x+MyPoint.x+SetDFAPos.LO,GetDocument()->DFATable.tableList[i].point.y+MyPoint.y+SetDFAPos.LO);
}
pDC->EndPath();
CRgn trgn;
trgn.CreateFromPath(pDC);// (&dc);
m_DFA.CopyRgn(&trgn);
trgn.DeleteObject();
//
stockbrush.DeleteObject();
colorbrush.DeleteObject();
Tbrush.DeleteObject();
Dirbrush.DeleteObject();
colorpen.DeleteObject();
redpen.DeleteObject();//bezier
quanpen.DeleteObject();
zihuanpen.DeleteObject();
}
void CTONFAView::DrawMINTABLE(CDC* pDC)
{
CRect rc;
GetClientRect(rc);
CPoint MyScroll=GetScrollPosition();
CRect rc1(MyScroll.x,MyScroll.y,rc.right+MyScroll.x,rc.bottom+MyScroll.y);
//COLORREF crBackGroundColor=RGB(255,255,255);
//if(flag==2)
//pDC->FillSolidRect(rc1, crBackGroundColor);
CBrush brush(RGB(200,225,190));
pDC->SelectObject(&brush);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(24,71,133));
pDC->TextOut(DFA_MINTABLE_LEFT,DFA_MINTABLE_TOP-20,"DFA->MINDFA转换表");
pDC->SetTextColor(RGB(182,41,43));
//-----------------------------画出DFA->MINDFA转换表
pDC->Rectangle(DFA_MINTABLE_LEFT,DFA_MINTABLE_TOP,DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(GetDocument()->letternum+1),DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT);
pDC->MoveTo(DFA_MINTABLE_LEFT,DFA_MINTABLE_TOP);
pDC->LineTo(DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH,DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT);
pDC->TextOut(DFA_MINTABLE_LEFT+100,DFA_MINTABLE_TOP+2,"字符");
pDC->TextOut(DFA_MINTABLE_LEFT+2,DFA_MINTABLE_TOP+13,"状态集");
for(int i=0;i<GetDocument()->letternum;i++)
{
pDC->MoveTo(DFA_MINTABLE_LEFT+(i+1)*DFA_MINTABLE_WIDTH,DFA_MINTABLE_TOP);
pDC->LineTo(DFA_MINTABLE_LEFT+(i+1)*DFA_MINTABLE_WIDTH,DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT);
pDC->TextOut(DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(i+1)+40+DFA_MINTABLE_HEIGHT,DFA_MINTABLE_TOP+10,CString(GetDocument()->character[i]));
}
pDC->SetTextColor(RGB(150,100,50));
//for(i=0;i<=SetMINPos.num;i++)
int ko=0;
for(i=0;i<=SetMINPos.num;i++)
{
if(GetDocument()->MA[i]->head==NULL)
continue;
//画区域
pDC->Rectangle(DFA_MINTABLE_LEFT,DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(ko+1),DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(GetDocument()->letternum+1),DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(ko+2));
pDC->TextOut(DFA_MINTABLE_LEFT+5,DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(ko+1)+5,GetDocument()->ListStrMIN(i));
ListNode * p;
int j=0;
p=GetDocument()->MINTable.tableList[i].next;
//for(int j=0;j<GetDocument()->letternum;j++)
while(p!=NULL)
{
pDC->MoveTo(DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(j+1),DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(ko+1));
pDC->LineTo(DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(j+1),DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(ko+2));
//if(p->data!='$')
if(p->data!=-1)
pDC->TextOut(DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(j+1)+5,DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(ko+1)+5,GetDocument()->ListStrMIN(p->data));
// 10|(01|1)*0|1*# MessageBox("");
j++;
p=p->next;
}
ko++;
}
pDC->BeginPath();
pDC->Rectangle(DFA_MINTABLE_LEFT-MyScroll.x,DFA_MINTABLE_TOP-MyScroll.y,DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(GetDocument()->letternum+1)-MyScroll.x,DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(SetMINPos.num+1)-MyScroll.y);
pDC->EndPath();
CRgn trgn;
trgn.CreateFromPath(pDC);
m_MINTABLE.CopyRgn(&trgn);
trgn.DeleteObject();
brush.DeleteObject();
}
void CTONFAView::DrawMINDFA(CDC* pDC)
{
CPoint MyScroll=GetScrollPosition();
CTONFADoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CBrush stockbrush;
CBrush colorbrush;
CBrush Tbrush;//终态结点
CBrush Dirbrush;//方向点
CPen redpen;
CPen colorpen;
CPen quanpen;
CPen zihuanpen;
stockbrush.CreateStockObject(5);
colorbrush.CreateSolidBrush(RGB(80,166,37));
Tbrush.CreateSolidBrush(RGB(236,135,14));
Dirbrush.CreateSolidBrush(RGB(130,115,176));
colorpen.CreatePen(PS_SOLID,1,RGB(54,54,54));
redpen.CreatePen(PS_SOLID,1,RGB(223,53,57));//bezier
quanpen.CreatePen(PS_SOLID,1,RGB(54,54,54));
zihuanpen.CreatePen(PS_SOLID,1,RGB(54,54,54));
CPoint PO[4];
//InitPosition();
//终结点
//CString ST;
//ST.Format("%d",pDoc->T);
//画线
int LO=SetMINPos.LO;
pDC->SelectObject(&stockbrush);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(24,71,133));
pDC->TextOut(SetMINPos.LOx,SetMINPos.LOy-50,"MINDFA状态图");
ListNode * p;
for(int i2=0;i2<=SetMINPos.num;i2++)
{
p=GetDocument()->MINTable.tableList[i2].next;
while(p!=NULL)
{
//判断直接后趋的结点的状态值
if((i2<p->data)&&(p->data!=-1)) //大 画直线
//if((i2<p->data)&&(p->data!='$'))
{
pDC->SelectObject(&colorpen);
pDC->MoveTo(GetDocument()->MINTable.tableList[i2].point.x,GetDocument()->MINTable.tableList[i2].point.y);
pDC->LineTo(GetDocument()->MINTable.tableList[p->data].point.x,GetDocument()->MINTable.tableList[p->data].point.y);
//画箭头//10|(01|1)*0|1*#
CString sinfo=GetDocument()->ListStrMIN(p->data);
double h,w;
w=SetMINPos.LO*0.2*sinfo.GetLength()/2.0;//椭圆的Width
h=SetMINPos.LO*0.5/2.0;//椭圆的Heigth;
float k;//斜率
float af=0.5;//角度
double x1,y1,x2,y2,ox,oy;
x1=GetDocument()->MINTable.tableList[i2].point.x;
y1=GetDocument()->MINTable.tableList[i2].point.y;
x2=GetDocument()->MINTable.tableList[p->data].point.x;
y2=GetDocument()->MINTable.tableList[p->data].point.y;
k=(y2-y1)/(x2-x1+0.000001);
ox=x2-w*h/sqrt(pow(h,2)+pow(w,2)*pow(k,2));
oy=y2-w*h*k/sqrt(pow(h,2)+pow(w,2)*pow(k,2));
pDC->SelectObject(&Dirbrush);
pDC->Ellipse(ox-SetMINPos.LO/6,oy-SetMINPos.LO/6,ox+SetMINPos.LO/6,oy+SetMINPos.LO/6);
//---------------------------
pDC->SetTextColor(RGB(0,0,0));
pDC->TextOut((GetDocument()->MINTable.tableList[i2].point.x+GetDocument()->MINTable.tableList[p->data].point.x)/2,(GetDocument()->MINTable.tableList[i2].point.y+LO/2+GetDocument()->MINTable.tableList[p->data].point.y+LO/2)/2-15,p->token);
}
if((i2==p->data)&&(p->data!=-1))
//if((i2==p->data)&&(p->data!='$')) //等于 画回路到自己
{
pDC->SelectObject(&stockbrush);
pDC->Ellipse(GetDocument()->MINTable.tableList[i2].point.x-LO/6,GetDocument()->MINTable.tableList[i2].point.y-LO,GetDocument()->MINTable.tableList[i2].point.x+4*LO/6,GetDocument()->MINTable.tableList[i2].point.y+LO/6);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -