📄 graphicsalgorithmview.cpp
字号:
// GraphicsAlgorithmView.cpp : implementation of the CGraphicsAlgorithmView class
//
#include "stdafx.h"
#include "GraphicsAlgorithm.h"
#include "GraphicsAlgorithmDoc.h"
#include "GraphicsAlgorithmView.h"
#include "LWidth.h"
#include "ttt.h"
#include "math.h"
#include "stdio.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGraphicsAlgorithmView
IMPLEMENT_DYNCREATE(CGraphicsAlgorithmView, CView)
BEGIN_MESSAGE_MAP(CGraphicsAlgorithmView, CView)
//{{AFX_MSG_MAP(CGraphicsAlgorithmView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_COMMAND(idCurColor, OnidCurColor)
ON_COMMAND(idClear, OnidClear)
ON_COMMAND(idPolygon, OnidPolygon)
ON_COMMAND(IDCLOSE, OnClose)
ON_COMMAND(idFillColor, OnidFillColor)
ON_COMMAND(idLineWidth, OnidLineWidth)
ON_COMMAND(idabout, Onidabout)
ON_COMMAND(idTransShift, OnidTransShift)
ON_COMMAND(idTransScale, OnidTransScale)
ON_COMMAND(idTransRotation, OnidTransRotation)
ON_COMMAND(idTransDonghua1, OnidTransDonghua1)
ON_COMMAND(idTransXMirror, OnidTransXMirror)
ON_COMMAND(idTransYMirror, OnidTransYMirror)
ON_COMMAND(idTransPMirror, OnidTransPMirror)
ON_COMMAND(idTansCuoqie, OnidTansCuoqie)
ON_COMMAND(idSecPoly, OnidSecPoly)
ON_COMMAND(idFirPicToSecPic, OnidFirPicToSecPic)
ON_COMMAND(idTransDongHua3, OnidTransDongHua3)
ON_COMMAND(idCrossBar, OnidCrossBar)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGraphicsAlgorithmView construction/destruction
CGraphicsAlgorithmView::CGraphicsAlgorithmView()
{
// TODO: add construction code here
// tBreLine=0;
// tDDALine=1;
}
CGraphicsAlgorithmView::~CGraphicsAlgorithmView()
{
}
BOOL CGraphicsAlgorithmView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CGraphicsAlgorithmView drawing
void CGraphicsAlgorithmView::OnDraw(CDC* Gra)
{
CGraphicsAlgorithmDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
Gra->SaveDC(); cls();
}
/////////////////////////////////////////////////////////////////////////////
// CGraphicsAlgorithmView printing
BOOL CGraphicsAlgorithmView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CGraphicsAlgorithmView::OnBeginPrinting(CDC* /*Gra*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CGraphicsAlgorithmView::OnEndPrinting(CDC* /*Gra*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CGraphicsAlgorithmView diagnostics
#ifdef _DEBUG
void CGraphicsAlgorithmView::AssertValid() const
{
CView::AssertValid();
}
void CGraphicsAlgorithmView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CGraphicsAlgorithmDoc* CGraphicsAlgorithmView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGraphicsAlgorithmDoc)));
return (CGraphicsAlgorithmDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGraphicsAlgorithmView message handlers
void CGraphicsAlgorithmView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
Gra=new CClientDC(this);
Gra->SetBkColor(RGB(0xff,0xff,0xff));
Curcolor=RGB(255,0,255);
FillColor=RGB(255,0,255);
CurPen.CreatePen(PS_SOLID,3,Curcolor);
OrgPen.CreatePen(PS_SOLID,3,RGB(255,0,255));
MouDown=false;
FunSel=-1;
}
void CGraphicsAlgorithmView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
MouDown=true;
switch(FunSel)
{
case 0:
break;
case 1:
BegP=point;
if(PNum==0)
{
ContP[PNum++]=point;
}
else
{
BegP=ContP[PNum-1];
}
PreP=BegP;
Gra->SetROP2(R2_XORPEN);
Gra->SelectObject(&OrgPen);
Gra->MoveTo(BegP.x-10,BegP.y); Gra->LineTo(BegP.x+10,BegP.y);
Gra->MoveTo(BegP.x,BegP.y-10); Gra->LineTo(BegP.x,BegP.y+10);
Gra->MoveTo(BegP); Gra->LineTo(PreP);
break;
case 2:
BegP=point;PreP=BegP;
Gra->SetROP2(R2_XORPEN);
Gra->SelectObject(&OrgPen);
Gra->MoveTo(BegP.x-10,BegP.y); Gra->LineTo(BegP.x+10,BegP.y);
Gra->MoveTo(BegP.x,BegP.y-10); Gra->LineTo(BegP.x,BegP.y+10);
Gra->MoveTo(BegP); Gra->LineTo(PreP);
TransShift(PreP-BegP);
break;
case 3:
Gra->SetROP2(R2_XORPEN);
Gra->SelectObject(&CurPen);
BegP=point;PreP=point;
Gra->MoveTo(BegP.x-10,BegP.y); Gra->LineTo(BegP.x+10,BegP.y);
Gra->MoveTo(BegP.x,BegP.y-10); Gra->LineTo(BegP.x,BegP.y+10);
Gra->MoveTo(BegP); Gra->LineTo(PreP);
break;
case 4:
BegP=point;PreP=BegP;
Gra->SetROP2(R2_XORPEN);
Gra->SelectObject(&CurPen);
Gra->Ellipse(BegP.x-50,BegP.y+50,BegP.x+50,BegP.y-50);
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
TransScale(ratio);
//PreP=point;
break;
case 5:
BegP=point;
if(PNum2==0)
{
ContP2[PNum2++]=point;
}
else
{
BegP=ContP2[PNum2-1];
}
PreP=point;
Gra->SetROP2(R2_XORPEN);
Gra->SelectObject(&OrgPen);
Gra->MoveTo(BegP.x-10,BegP.y); Gra->LineTo(BegP.x+10,BegP.y);
Gra->MoveTo(BegP.x,BegP.y-10); Gra->LineTo(BegP.x,BegP.y+10);
Gra->MoveTo(BegP); Gra->LineTo(PreP);
break;
case 6:
BegP=point;PreP=BegP;
Gra->SetROP2(R2_XORPEN);
Gra->SelectObject(&OrgPen);
Gra->MoveTo(BegP.x-10,BegP.y); Gra->LineTo(BegP.x+10,BegP.y);
Gra->MoveTo(BegP.x,BegP.y-10); Gra->LineTo(BegP.x,BegP.y+10);
Gra->MoveTo(BegP);
Gra->LineTo(BegP.x+200,BegP.y);
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
TransRotation(angle);
PreP=point;
break;
case 7:
BegP=point;PreP=BegP;
Gra->SetROP2(R2_XORPEN);
Gra->SelectObject(&OrgPen);
TransMirror(PreP);
Gra->MoveTo(PreP.x-10,PreP.y); Gra->LineTo(PreP.x+10,PreP.y);
Gra->MoveTo(PreP.x,PreP.y-10); Gra->LineTo(PreP.x,PreP.y+10);
PreP=point;
break;
case 8:
BegP=point;PreP=BegP;
Gra->SetROP2(R2_XORPEN);
Gra->SelectObject(&OrgPen);
Gra->MoveTo(PreP.x-600,PreP.y);
Gra->LineTo(PreP.x+600,PreP.y);
TransXMirror(PreP);
PreP=point;
break;
case 9:
BegP=point;PreP=BegP;
Gra->SetROP2(R2_XORPEN);
Gra->SelectObject(&OrgPen);
Gra->MoveTo(PreP.x,PreP.y-600);
Gra->LineTo(PreP.x,PreP.y+600);
TransYMirror(PreP);
PreP=point;
break;
case 10:
BegP=point;PreP=BegP;
Gra->SetROP2(R2_XORPEN);
Gra->SelectObject(&OrgPen);
Gra->MoveTo(BegP.x,BegP.y); Gra->LineTo(BegP.x+500,BegP.y);
Gra->MoveTo(BegP.x+50,BegP.y);
Gra->LineTo(BegP.x+50,BegP.y+50);Gra->LineTo(BegP.x,BegP.y+50);
Gra->MoveTo(BegP.x,BegP.y+500); Gra->LineTo(BegP);
TransCuoQie(Hx,Hy);
PreP=point;
break;
}
CView::OnLButtonDown(nFlags, point);
}
void CGraphicsAlgorithmView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(MouDown){
switch(FunSel)
{
case 0:
break;
case 1:
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
PreP=point;
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
break;
case 2:
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
TransShift(PreP-BegP);
PreP=point;
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
TransShift(PreP-BegP);
break;
case 3:
break;
case 4:
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
TransScale(ratio);
PreP=point;
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
TransScale(ratio);
break;
case 5:
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
PreP=point;
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
break;
case 6:
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
TransRotation(angle);
PreP=point;
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
TransRotation(angle);
break;
case 7:
TransMirror(PreP);
Gra->MoveTo(PreP.x-10,PreP.y); Gra->LineTo(PreP.x+10,PreP.y);
Gra->MoveTo(PreP.x,PreP.y-10); Gra->LineTo(PreP.x,PreP.y+10);
PreP=point;
Gra->MoveTo(PreP.x-10,PreP.y); Gra->LineTo(PreP.x+10,PreP.y);
Gra->MoveTo(PreP.x,PreP.y-10); Gra->LineTo(PreP.x,PreP.y+10);
TransMirror(PreP);
break;
case 8:
Gra->MoveTo(PreP.x-600,PreP.y);
Gra->LineTo(PreP.x+600,PreP.y);
TransXMirror(PreP);
PreP=point;
BegP=point;
Gra->MoveTo(PreP.x-600,PreP.y);
Gra->LineTo(PreP.x+600,PreP.y);
TransXMirror(PreP);
break;
case 9:
Gra->MoveTo(PreP.x,PreP.y-300);
Gra->LineTo(PreP.x,PreP.y+300);
TransYMirror(PreP);
PreP=point;
BegP=point;
Gra->MoveTo(PreP.x,PreP.y-300);
Gra->LineTo(PreP.x,PreP.y+300);
TransYMirror(PreP);
break;
case 10:
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
TransCuoQie(Hx,Hy);
PreP=point;
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
TransCuoQie(Hx,Hy);
break;
}
}
CView::OnMouseMove(nFlags, point);
}
void CGraphicsAlgorithmView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int i;
MouDown=false;
switch(FunSel)
{
case 0:
break;
case 1:
Gra->SetROP2(R2_XORPEN);
Gra->MoveTo(BegP.x-10,BegP.y);Gra->LineTo(BegP.x+10,BegP.y);
Gra->MoveTo(BegP.x,BegP.y-10);Gra->LineTo(BegP.x,BegP.y+10);
Gra->MoveTo(BegP);Gra->LineTo(point);
// pen1.CreatePen(PS_SOLID,1,RGB(255,0,0));
Gra->SetROP2(R2_COPYPEN);
Gra->SelectObject(&CurPen);
Gra->MoveTo(BegP);
Gra->LineTo(point);
ContP[PNum++]=point;
break;
case 2:
cls();
Gra->SetROP2(R2_COPYPEN);
TransShift(point-BegP);
for( i=0;i<PNum;i++)
ContP[i]=ContP[i]+point-BegP;
break;
case 3:
Gra->SetROP2(R2_XORPEN);
Gra->MoveTo(BegP.x-10,BegP.y);
Gra->LineTo(BegP.x+10,BegP.y);
Gra->MoveTo(BegP.x,BegP.y-10);
Gra->LineTo(BegP.x,BegP.y+10);
Gra->MoveTo(BegP);
Gra->LineTo(PreP);
// pen1.CreatePen(PS_SOLID,1,RGB(255,0,0));
Gra->SetROP2(R2_COPYPEN);
Gra->SelectObject(&OrgPen);
Gra->MoveTo(BegP);
Gra->LineTo(point);
break;
case 4:
cls();
Gra->SetROP2(R2_COPYPEN);
TransScale(ratio);
if((PreP.x-BegP.x)*(PreP.x-BegP.x)+(PreP.y-BegP.y)*(PreP.y-BegP.y)<0.5)
return;
ratio=sqrt(1.0*(PreP.x-BegP.x)/50*(PreP.x-BegP.x)/50+(PreP.y-BegP.y)/50*(PreP.y-BegP.y)/50);
for( i=0;i<PNum;i++)
{
ContP[i].x=ContP[i].x*ratio+(1-ratio)*BegP.x;
ContP[i].y=ContP[i].y*ratio+(1-ratio)*BegP.y;
}
break;
case 5:
Gra->SetROP2(R2_XORPEN);
Gra->MoveTo(BegP.x-10,BegP.y);Gra->LineTo(BegP.x+10,BegP.y);
Gra->MoveTo(BegP.x,BegP.y-10);Gra->LineTo(BegP.x,BegP.y+10);
Gra->MoveTo(BegP);Gra->LineTo(point);
Gra->SetROP2(R2_COPYPEN);
Gra->SelectObject(&CurPen);
Gra->MoveTo(BegP);
Gra->LineTo(point);
ContP2[PNum2++]=point;
break;
case 6:
cls();
Gra->SetROP2(R2_COPYPEN);
TransRotation(angle);
for(i=0;i<PNum;i++)
{ CPoint ctp[1000];
for(i=0;i<PNum;i++)
ctp[i]=ContP[i];
ContP[i].x=BegP.x+(ctp[i].x-BegP.x)*cos(angle)-(ctp[i].y-BegP.y)*sin(angle);
ContP[i].y=BegP.y+(ctp[i].y-BegP.y)*cos(angle)+(ctp[i].x-BegP.x)*sin(angle);
}
break;
case 7:
cls();
Gra->SetROP2(R2_COPYPEN);
TransMirror(PreP);
for( i=0;i<PNum;i++)
{
ContP[i].x=2*PreP.x-ContP[i].x;
ContP[i].y=2*PreP.y-ContP[i].y;
}
break;
case 8:
cls();
Gra->SetROP2(R2_COPYPEN);
TransXMirror(PreP);
for( i=0;i<PNum;i++)
{
ContP[i].y=2*PreP.y-ContP[i].y;
}
break;
case 9:
cls();
Gra->SetROP2(R2_COPYPEN);
TransYMirror(PreP);
for( i=0;i<PNum;i++)
{
ContP[i].x=2*PreP.x-ContP[i].x;
}
break;
case 10:
cls();
Gra->SetROP2(R2_COPYPEN);
TransCuoQie(Hx,Hy);
// CPoint CP[1000];
// for(int i=0;i<PNum;i++)
// CP[i]=ContP[i];
// for(i=0;i<PNum;i++)
// {
// ContP[i].x=CP[i].x+Hx*CP[i].y;
// ContP[i].y=CP[i].y+Hy*CP[i].x;
// }
break;
}
CView::OnLButtonUp(nFlags, point);
}
void CGraphicsAlgorithmView::OnidFloodFilll4()
{
// TODO: Add your command handler code here
FunSel=1;//四连通区域填充
}
void CGraphicsAlgorithmView::FloodFill4(CPoint SeedP, COLORREF FillColor, COLORREF BdColor)
{
if((Gra->GetPixel(SeedP)!=FillColor)&&(Gra->GetPixel(SeedP)!=BdColor))
{
Gra->SetPixel(SeedP,FillColor);
FloodFill4(SeedP+CPoint(1,0), FillColor, BdColor);
FloodFill4(SeedP-CPoint(1,0), FillColor, BdColor);
FloodFill4(SeedP+CPoint(0,1), FillColor, BdColor);
FloodFill4(SeedP-CPoint(0,1), FillColor, BdColor);
}
}
void CGraphicsAlgorithmView::OnidCurColor()
{
// TODO: Add your command handler code here
CColorDialog cdlg;
if(cdlg.DoModal()==IDOK)
{
Curcolor=cdlg.GetColor();
CurPen.DeleteObject();
CurPen.CreatePen(PS_SOLID,3,Curcolor);
}
}
void CGraphicsAlgorithmView::cls()
{
CRect rc;
GetClientRect(rc);
Gra->FillSolidRect(rc,Gra->GetBkColor());
}
void CGraphicsAlgorithmView::OnidClear()
{
// TODO: Add your command handler code here
FunSel=0;PNum=0;
cls();
}
void CGraphicsAlgorithmView::OnidPolygon()
{
// TODO: Add your command handler code here
FunSel=1;PNum=0;
}
void CGraphicsAlgorithmView::OnClose()
{
// TODO: Add your command handler code here
//FunSel=5;
if(PNum>0)
{
Gra->MoveTo(ContP[PNum-1]);
Gra->LineTo(ContP[0]);
ContP[PNum++]=ContP[0];
}
if(PNum2>0)
{
Gra->MoveTo(ContP2[PNum2-1]);
Gra->LineTo(ContP2[0]);
ContP2[PNum2++]=ContP2[0];
}
}
void CGraphicsAlgorithmView::OnidFillColor()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -