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

📄 databaseview.cpp

📁 1.通过鼠标拖拽和弹出对话框完成实体、属性、联系的绘制以及各参数设定 2.对绘制的实体、属性、联系提供合法性检查 3.对绘制的图形进行拖动、重设大小、删除 4.通过属性对话框对实体、属性、联系的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// databaseView.cpp : implementation of the CDatabaseView class
//

#include "stdafx.h"
#include "database.h"
#include "databaseDoc.h"
#include "databaseView.h"
#include "Attribute.h"
#include "Entity.h"
#include "Relation.h"
#include "Dialog1.h"
#include "Dialog2.h"
#include "Dialog3.h"
#include "Dialog4.h"
#include "Dialog5.h"
#include "change.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
MyEntity* my1;
MyEntity* my2;
Relation* my3;
int count=0;
int count1=0;
int start=0;
int flag=0;
int newflag=0;
/////////////////////////////////////////////////////////////////////////////
// CDatabaseView

IMPLEMENT_DYNCREATE(CDatabaseView, CView)

BEGIN_MESSAGE_MAP(CDatabaseView, CView)
	//{{AFX_MSG_MAP(CDatabaseView)
	ON_COMMAND(IDM_RESIZE, OnResize)
	ON_COMMAND(IDM_RELATION2, OnRelation2)
	ON_COMMAND(IDM_RELATION1, OnRelation1)
	ON_COMMAND(IDM_ENTITY2, OnEntity2)
	ON_COMMAND(IDM_ENTITY1, OnEntity1)
	ON_COMMAND(IDM_DELETE, OnDelete)
	ON_COMMAND(IDM_ATTRIBUTE1, OnAttribute1)
	ON_COMMAND(IDM_ATTRIBUTE2, OnAttribute2)
	ON_COMMAND(IDM_ATTRIBUTE3, OnAttribute3)
	ON_COMMAND(IDM_CHANGE, OnChange)
	ON_COMMAND(IDM_RENAME, OnRename)
	ON_COMMAND(ID_POP, OnPop)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_WM_MOUSEMOVE()
	ON_WM_ERASEBKGND()
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_WM_LBUTTONUP()
	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()

/////////////////////////////////////////////////////////////////////////////
// CDatabaseView construction/destruction

CDatabaseView::CDatabaseView()
{
	// TODO: add construction code here
	p1=new CPoint();
	p2=new CPoint();
}

CDatabaseView::~CDatabaseView()
{
}

BOOL CDatabaseView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}
BOOL CDatabaseView::OnEraseBkgnd(CDC* pDC)
{
	return true;
}
/////////////////////////////////////////////////////////////////////////////
// CDatabaseView drawing

void CDatabaseView::OnDraw(CDC* pDC)
{
	CDatabaseDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);	
    	  CRect rc;
	  GetClientRect(&rc);
	  CDC MemDC; 
      CBitmap MemBitmap;
      MemDC.CreateCompatibleDC(NULL); 
      MemBitmap.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height()); 
      MemDC.SelectObject(&MemBitmap); 
      MemDC.FillSolidRect(0,0,rc.Width(),rc.Height(),RGB(255,255,255)); 
	  pDoc->diagram->paint(MemDC);
      pDC->BitBlt(0,0,rc.Width(),rc.Height(),&MemDC,0,0,SRCCOPY); 
      MemBitmap.DeleteObject(); 
      MemDC.DeleteDC(); 
	  pDoc->DeleteContents();
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CDatabaseView printing

BOOL CDatabaseView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CDatabaseView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CDatabaseView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CDatabaseView diagnostics

#ifdef _DEBUG
void CDatabaseView::AssertValid() const
{
	CView::AssertValid();
}

void CDatabaseView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CDatabaseDoc* CDatabaseView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDatabaseDoc)));
	return (CDatabaseDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDatabaseView message handlers

void CDatabaseView::OnLButtonDown(UINT nFlags , CPoint Point)
{	
	 CDatabaseDoc* pDoc = GetDocument();
	 CDC *g=this->GetDC();
     int x1=Point.x-40;
	 int y1=Point.y-20;
	 int x2=Point.x+40;
	 int y2=Point.y+20;

	 if(pDoc->diagram->selected!=NULL&&flag==2)
	 {
		 start=1;
		 return;
	 }
	 if(flag==0||flag==1)
	 {
		 flag=0;
		 pDoc->diagram->selected=NULL;
		 Element* first=pDoc->diagram->firstElement;
		 while(first!=NULL)
		 {
			 first->selecting=0;
			 first=first->nextelement;
		 }
		 first=pDoc->diagram->firstElement;
         while(first!=NULL)
		 {
		      if(first->isselected(&Point))
			  {
		           first->selecting=1;
				   pDoc->diagram->selected=first;
				   flag=1;
				 break;
			  }
		      first=first->nextelement;
		 }
		 
	 }
	 if(flag>=3)
	 {
		 p1->x=Point.x;
		 p1->y=Point.y;
		 p2->x=Point.x;
		 p2->y=Point.y;
		 start=1;
		 return;
	 }
	 this->Invalidate(true);
}
//////////////////////////////////////////////////////////////////
void CDatabaseView::OnRButtonDown(UINT nFlags , CPoint Point)
{
	 CDatabaseDoc* pDoc = GetDocument();
	 if(pDoc->diagram->selected==NULL)
	 {
		 return;
	 }
   	if(pDoc->diagram->selected->isselected(&Point)==1)
	{
		ClientToScreen(&Point);
		CMenu pop;
		pop.LoadMenu(IDR_MENU1);
		pop.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTBUTTON,Point.x,Point.y,this);
	}
	else
	{
        pDoc->diagram->selected->selecting=0;
		pDoc->diagram->selected=NULL;
		start=0;
    	flag=0;
    	this->Invalidate(true);
	}
}
//////////////////////////////////////////////////////////////////
void CDatabaseView::OnMouseMove(UINT nFlags, CPoint point)
{
	CDatabaseDoc* pDoc = GetDocument();
   if(flag==1)
   {
      if(pDoc->diagram->selected==NULL)
	  {
		  return;
	  }
	  else
	  {
		  int x1=pDoc->diagram->selected->getPoint1().x;
		  int y1=pDoc->diagram->selected->getPoint1().y;
		  int x2=pDoc->diagram->selected->getPoint2().x;
		  int y2=pDoc->diagram->selected->getPoint2().y;
		  int x11=x1+(point.x-(x1+x2)/2);
		  int x22=x2+(point.x-(x1+x2)/2);
		  int y11=y1+(point.y-(y1+y2)/2);
		  int y22=y2+(point.y-(y1+y2)/2);
		  pDoc->diagram->selected->setPoint1(x11,y11);
		  pDoc->diagram->selected->setPoint2(x22,y22);
		  this->Invalidate(true);	
	  }
   }
   if(flag==2&&start==1)
   {
	   if(pDoc->diagram->selected==NULL)
	  {
		  return;
	  }
	  else
	  {
          int x1=point.x;
		  int y1=point.y;
		  pDoc->diagram->selected->setPoint2(x1,y1);
          this->Invalidate(true);	
	  }

   }
   if(flag==3&&start==1)
   {
	   CPen pen(PS_SOLID,1,RGB(255,255,255));
	   CPen *oldpen;
	   CDC *g=this->GetDC();
	   oldpen=g->SelectObject(&pen);
	   g->Rectangle(p1->x,p1->y,p2->x,p2->y);

	   p2->x=point.x;
	   p2->y=point.y;
	   g->SelectObject(oldpen);
	   g->Rectangle(p1->x,p1->y,p2->x,p2->y);
	   g->DeleteDC();
   }
   if(flag==4&&start==1)
   {
	   CPen pen(PS_SOLID,1,RGB(255,255,255));
	   CPen *oldpen;
	   CDC *g=this->GetDC();
	   oldpen=g->SelectObject(&pen);
	   g->Rectangle(p1->x,p1->y,p2->x,p2->y);
	   g->Rectangle(p1->x+5,p1->y+5,p2->x-5,p2->y-5);
	   p2->x=point.x;
	   p2->y=point.y;
	   g->SelectObject(oldpen);
	   g->Rectangle(p1->x,p1->y,p2->x,p2->y);
	   g->Rectangle(p1->x+5,p1->y+5,p2->x-5,p2->y-5);
	   g->DeleteDC();
	   
   }
   if(flag==5&&start==1)
   {
	   CPen pen(PS_SOLID,1,RGB(255,255,255));
	   CPen *oldpen;
	   CDC *g=this->GetDC();
	   oldpen=g->SelectObject(&pen);
	   CPoint *p=new CPoint[4];
	    p[0]=*(new CPoint(p1->x-5,(p1->y+p2->y)/2));
	    p[1]=*(new CPoint((p1->x+p2->x)/2,p1->y-5));
    	p[2]=*(new CPoint(p2->x+5,(p1->y+p2->y)/2));
	    p[3]=*(new CPoint((p1->x+p2->x)/2,p2->y+5));
		g->Polygon(p,4);
	    p2->x=point.x;
	    p2->y=point.y;
	    g->SelectObject(oldpen);
		p[0].y=(p1->y+p2->y)/2;
		p[1].x=(p1->x+p2->x)/2;
		p[2].x=p2->x+5;
		p[2].y=(p1->y+p2->y)/2;
		p[3].x=(p1->x+p2->x)/2;
		p[3].y=p2->y+5;
		g->Polygon(p,4);
		g->DeleteDC();
   }
   if(flag==6&&start==1)
   {
	   CPen pen(PS_SOLID,1,RGB(255,255,255));
	   CPen *oldpen;
	   CDC *g=this->GetDC();
	   oldpen=g->SelectObject(&pen);
	   CPoint *p=new CPoint[4];
	   p[0]=*(new CPoint(p1->x-5,(p1->y+p2->y)/2));
	   p[1]=*(new CPoint((p1->x+p2->x)/2,p1->y-5));
       p[2]=*(new CPoint(p2->x+5,(p1->y+p2->y)/2));
	   p[3]=*(new CPoint((p1->x+p2->x)/2,p2->y+5));
	   g->Polygon(p,4);
	   p[0].x=p[0].x+5;
	   p[1].y=p[1].y+5;
	   p[2].x=p[2].x-5;
	   p[3].y=p[3].y-5;
       g->Polygon(p,4);
	   p[0].x=p[0].x-5;
	   p[1].y=p[1].y-5;
	   p[2].x=p[2].x+5;
	   p[3].y=p[3].y+5;
	   	p2->x=point.x;
	    p2->y=point.y;
	   g->SelectObject(oldpen);
		p[0].y=(p1->y+p2->y)/2;
		p[1].x=(p1->x+p2->x)/2;
		p[2].x=p2->x+5;
		p[2].y=(p1->y+p2->y)/2;
		p[3].x=(p1->x+p2->x)/2;
		p[3].y=p2->y+5;
		g->Polygon(p,4);
	   p[0].x=p[0].x+5;
	   p[1].y=p[1].y+5;
	   p[2].x=p[2].x-5;
	   p[3].y=p[3].y-5;
       g->Polygon(p,4);
	   g->DeleteDC();
   }
   if((flag==7||flag==8)&&start==1)
   {
	   CPen pen(PS_SOLID,1,RGB(255,255,255));
	   CPen *oldpen;
	   CDC *g=this->GetDC();
	   oldpen=g->SelectObject(&pen);
	   g->Ellipse(p1->x,p1->y,p2->x,p2->y);
	   if(flag==8)
	   {
		   g->Ellipse(p1->x+5,p1->y+5,p2->x-5,p2->y-5);
	   }
	   g->SelectObject(oldpen);
	   p2->x=point.x;
	   p2->y=point.y;
	   g->Ellipse(p1->x,p1->y,p2->x,p2->y);
	   if(flag==8)
	   {
		   g->Ellipse(p1->x+5,p1->y+5,p2->x-5,p2->y-5);
	   }
	   g->DeleteDC();
   }
   if(flag==9&&start==1)
   {
       CPen pen(PS_DOT,1,RGB(255,255,255));
	   CPen pen2(PS_DOT,1,RGB(0,0,0));
	   CDC *g=this->GetDC();
	   g->SelectObject(&pen);
	   g->Ellipse(p1->x,p1->y,p2->x,p2->y);
	   g->SelectObject(&pen2);
	   p2->x=point.x;
	   p2->y=point.y;
	   g->Ellipse(p1->x,p1->y,p2->x,p2->y);
	   g->DeleteDC();
   }
}
//////////////////////////////////////////////////////////////
void CDatabaseView::OnLButtonUp(UINT nFlags, CPoint point)
{
	CDatabaseDoc* pDoc = GetDocument();

	if(flag==3||flag==4)
	{
		CString s;
        CDialog1 a=new CDialog1();
		a.DoModal();
		s=a.m_entityname1;
		if(s==""||
			(s.GetAt(0)>='1'&&
		   s.GetAt(0)<='9')||
		   s.Find(" ")>=1||pDoc->diagram->have(s)==1)
		{
			MessageBox("error input in the formal dialog",NULL,MB_ICONSTOP);
		}
		else
		{
			int x;
			if(flag==3)
			{
				x=1;
			}
			else
			{
				x=2;
			}
			MyEntity *e=new MyEntity(s,p1->x,p1->y,p2->x,p2->y,x);
			pDoc->diagram->addElement(e);

⌨️ 快捷键说明

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