📄 cdaview.cpp
字号:
// CDAView.cpp : implementation of the CCDAView class
//
#include "stdafx.h"
#include "CDA.h"
#include "malloc.h"
#include "CDADoc.h"
#include "CDAView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCDAView
IMPLEMENT_DYNCREATE(CCDAView, CView)
BEGIN_MESSAGE_MAP(CCDAView, CView)
//{{AFX_MSG_MAP(CCDAView)
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_COMMAND(ID_Polygon, OnPolygon)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CCDAView construction/destruction
CCDAView::CCDAView()
{
// TODO: add construction code here
nvert = 0;
//l = 0 ;
//r = 0;
//b = 0;
t = 0;
}
CCDAView::~CCDAView()
{
}
BOOL CCDAView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CCDAView drawing
void CCDAView::OnDraw(CDC* pDC)
{
CCDADoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CCDAView printing
BOOL CCDAView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CCDAView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CCDAView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CCDAView diagnostics
#ifdef _DEBUG
void CCDAView::AssertValid() const
{
CView::AssertValid();
}
void CCDAView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CCDADoc* CCDAView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCDADoc)));
return (CCDADoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CCDAView message handlers
void CCDAView::draw_polygon()
{
CClientDC dc(this);
CPen *OldPen,RedPen(PS_SOLID,1,RGB(255,0,0));
OldPen = dc.SelectObject(&RedPen);
dc.MoveTo(vert[0]);
for ( int i = 0; i<nvert - 1;i ++)
{
dc.LineTo (vert[i+1]);
}
dc.SelectObject(OldPen);
}
void CCDAView::draw_win()
{
CClientDC dc(this);
CPen *OldPen,GreenPen(PS_SOLID,1,RGB(0,255,0));
OldPen = dc.SelectObject(&GreenPen);
dc.MoveTo(150,150);
dc.LineTo(150,300);
dc.LineTo(300,300);
dc.LineTo(300,150);
dc.LineTo(150,150);
dc.SelectObject(OldPen);
}
void CCDAView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
vert[nvert] = point;
nvert ++;
draw_polygon();
CView::OnLButtonDown(nFlags, point);
}
void CCDAView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
draw_win();
CClientDC dc(this);
CPen *OldPen,RedPen(PS_SOLID,1,RGB(255,0,0));
OldPen = dc.SelectObject(&RedPen);
dc.MoveTo(vert[0]);
dc.LineTo(vert[nvert-1]);
CView::OnRButtonDown(nFlags, point);
}
void CCDAView::draw_clip()
{
//left.............
CPoint lvert[300];
int l = 0;
for( int i = 0;i<nvert-1 ;i++)
{
if(vert[i].x<150){
if(vert[i+1].x>=150){
lvert[l].x = 150;
lvert[l].y = vert[i].y+(vert[i+1].y - vert[i].y)*(150 - vert[i].x)/(vert[i+1].x-vert[i].x);
l++;
lvert[l] = vert[i+1];
l++;
}
}
else if(vert[i+1].x>=150){
lvert[l] = vert[i+1];
l++;
}
else {
lvert[l].x = 150;
lvert[l].y = vert[i].y+(vert[i+1].y -vert[i].y)*(150 - vert[i].x)/(vert[i+1].x - vert[i].x);
l++;
}
}
if(vert[nvert-1].x<150){
if(vert[0].x>=150){
lvert[l].x = 150;
lvert[l].y = vert[nvert-1].y+(vert[0].y - vert[nvert-1].y)*(150 - vert[nvert-1].x)/(vert[0].x-vert[nvert-1].x);
l++;
lvert[l] = vert[0];
}
}
else if(vert[0].x>=150)
{
lvert[l] = vert[0];
}
else{
lvert[l].x = 150;
lvert[l].y = vert[nvert-1].y+(vert[0].y -vert[nvert-1].y)*(150 - vert[nvert-1].x)/(vert[0].x - vert[nvert-1].x);
}
//right..............
CPoint rvert[300];
int r = 0;
for(int j = 0; j <l;j++)
{
if(lvert[j].x>300){
if(lvert[j+1].x<=300)
{
rvert[r].x = 300;
rvert[r].y = lvert[j].y + (lvert[j+1].y - lvert[j].y)*(300 - lvert[j].x)/(lvert[j+1].x - lvert[j].x);
r++;
rvert[r] = lvert[j+1];
r++;
}
}
else if(lvert[j+1].x>300)
{
rvert[r].x = 300;
rvert[r].y = lvert[j].y + (lvert[j+1].y - lvert[j].y)*(300 - lvert[j].x)/(lvert[j+1].x - lvert[j].x);
r++;
}
else{
rvert[r] = lvert[j+1];
r++;
}
}
if(lvert[l].x>300){
if(lvert[0].x<=300)
{
rvert[r].x = 300;
rvert[r].y = lvert[l].y + (lvert[0].y - lvert[l].y)*(300 - lvert[l].x)/(lvert[0].x - lvert[l].x);
r++;
rvert[r] = lvert[0];
}
}
else if(lvert[0].x>300)
{
rvert[r].x = 300;
rvert[r].y = lvert[l].y + (lvert[0].y - lvert[l].y)*(300 - lvert[l].x)/(lvert[0].x - lvert[l].x);
}
else{
rvert[r] = lvert[0];
}
//bottom...............
CPoint bvert[300];
int b = 0;
for(int k = 0;k < r;k++)
{
if(rvert[k].y < 150){
if(rvert[k+1].y>=150)
{
bvert[b].y = 150;
if(rvert[k].x != rvert[k+1].x)
{
bvert[b].x = (150-rvert[k].y)*(rvert[k+1].x-rvert[k].x)/(rvert[k+1].y-rvert[k].y)+rvert[k].x;
}
else{
bvert[b].x = rvert[k].x;
}
b++;
bvert[b] = rvert[k+1];
b++;
}
}
else if(rvert[k+1].y<150)
{
bvert[b].y = 150;
if(rvert[k].x != rvert[k+1].x)
{
bvert[b].x = (150-rvert[k].y)*(rvert[k+1].x-rvert[k].x)/(rvert[k+1].y-rvert[k].y)+rvert[k].x;
}
else{
bvert[b].x = rvert[k].x;
}
b++;
}
else{
bvert[b] = rvert[k+1];
b++;
}
}
if(rvert[r].y<150){
if(rvert[0].y>=150)
{
bvert[b].y = 150;
if(rvert[r].x != rvert[0].x)
{
bvert[b].x = (150-rvert[r].y)*(rvert[0].x-rvert[r].x)/(rvert[0].y-rvert[r].y)+rvert[r].x;
}
else{
bvert[b].x = rvert[r].x;
}
b++;
bvert[b] = rvert[0];
}
}
else if(rvert[0].y<150)
{
bvert[b].y = 150;
if(rvert[r].x != rvert[0].x)
{
bvert[b].x = (150-rvert[r].y)*(rvert[0].x-rvert[r].x)/(rvert[0].y-rvert[r].y)+rvert[r].x;
}
else
{
bvert[b].x = rvert[r].x;
}
}
else{
bvert[b] = rvert[0];
}
//top..............
for(int n = 0; n<b;n++)
{
if(bvert[n].y>300){
if(bvert[n+1].y<=300)
{
tvert[t].y = 300;
if(bvert[n].x !=bvert[n+1].x)
{
tvert[t].x = (300 - bvert[n].y)*(bvert[n+1].x-bvert[n].x)/(bvert[n+1].y-bvert[n].y)+bvert[n].x;
}
else
{
tvert[t].x = bvert[n].x;
}
t++;
tvert[t] = tvert[n+1];
t++;
}
}
else if(bvert[n+1].y>300)
{
tvert[t].y = 300;
if(bvert[n].x != bvert[n+1].x)
{
tvert[t].x = (300 - bvert[n].y)*(bvert[n+1].x-bvert[n].x)/(bvert[n+1].y-bvert[n].y)+bvert[n].x;
}
else
tvert[t].x = bvert[n].x;
t++;
}
else {
tvert[t] = bvert[n+1];
t++;
}
}
if(bvert[b].y>300){
if(bvert[0].y<=300)
{
tvert[t].y = 300;
if(bvert[b].x != bvert[0].x)
{
tvert[t].x = (300 - bvert[b].y)*(bvert[0].x-bvert[b].x)/(bvert[0].y-bvert[b].y)+bvert[b].x;
}
else
tvert[t].x = bvert[b].x;
t++;
tvert[t] = tvert[0];
}
}
else if(bvert[0].y>300)
{
tvert[t].y = 300;
if(bvert[b].x != bvert[0].x)
{
tvert[t].x = (300 - bvert[b].y)*(bvert[0].x-bvert[b].x)/(bvert[0].y-bvert[b].y)+bvert[b].x;
}else
tvert[t].x = bvert[b].x;
}
else {
tvert[t] = bvert[0];
}
}
void CCDAView::OnPolygon()
{
// TODO: Add your command handler code here
draw_clip();
CClientDC dc(this);
CPen *OldPen,BulePen(PS_SOLID,1,RGB(0,0,255));
OldPen = dc.SelectObject(&BulePen);
dc.MoveTo(tvert[0]);
for(int i=0;i<t;i++)
{
dc.LineTo(tvert[i+1]);
}
dc.MoveTo(tvert[0]);
dc.LineTo(tvert[t]);
dc.SelectObject(OldPen);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -