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

📄 sdbview.cpp

📁 用Visual C++实现关系数据库的图形编程.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SDBView.cpp : implementation of the CSDBView class
//

#include "stdafx.h"
#include "SDB.h"

#include "SDBDoc.h"
#include "SDBView.h"
#include "ADOSQL.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSDBView

IMPLEMENT_DYNCREATE(CSDBView, CView)

BEGIN_MESSAGE_MAP(CSDBView, CView)
	//{{AFX_MSG_MAP(CSDBView)
	ON_WM_LBUTTONDOWN()
	ON_COMMAND(ID_POINT_CIRCLE, OnPointCircle)
	ON_COMMAND(ID_POINT_RECTANGLE, OnPointRectangle)
	ON_COMMAND(ID_POINT_TRIANGLE, OnPointTriangle)
	ON_COMMAND(ID_COLOR, OnSetColor)
	ON_COMMAND(ID_READ_DB, OnReadDB)
	ON_COMMAND(ID_DEL_POINT, OnDelPoint)
	ON_COMMAND(ID_LINE_LINE, OnDrawLine)
	ON_COMMAND(ID_LINE_CIRCLE, OnLineCircle)
	ON_COMMAND(ID_LINE_RECTANGLE, OnLineRectangle)
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_READ_LINEENTITY, OnReadLineEntity)
	ON_COMMAND(ID_EDIT_POINTENTITY, OnEditPointentity)
	ON_COMMAND(ID_DEL_LINE, OnDelLine)
	ON_COMMAND(ID_DEL_CIRCLE, OnDelCircle)
	ON_COMMAND(ID_DEL_LINEENTITY, OnDelLineEntity)
	ON_COMMAND(ID_DEL_RECTLINE, OnDelRectline)
	ON_COMMAND(ID_DEL_ARC, OnDelArc)
	ON_COMMAND(ID_DEL_RECT, OnDelRect)
	ON_COMMAND(ID_DEL_TRIANGLE, OnDelTriangle)
	ON_COMMAND(ID_PLOYLINE, OnPloyline)
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_MAKEAREA, OnMakearea)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CSDBView construction/destruction

CSDBView::CSDBView()
{
	// TODO: add construction code here
	flag=0;                       //类型标志
	m_Color=RGB(0,0,0);
	m_OpenDB=false;
	m_Drag=0;  
	m_nStartX=m_nStartY=m_nMidX=m_nMidY=m_nEndX=m_nEndY=0;
	m_nStep=0;
		m_Edit=0;             //编辑标志
		m_Refesh=0;
		m_Del=0;
	m_Stop=false;
}

CSDBView::~CSDBView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSDBView drawing

void CSDBView::OnDraw(CDC* pDC)
{
	CSDBDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
   if(m_Drag==1&&m_Refesh>0)   OnReadDB();
   if(m_Del>0&&m_Del<4&&m_Refesh>0)   OnReadDB(); 
   if(m_Del>4&&m_Del<10&&m_Refesh>0) OnReadLineEntity();
}

/////////////////////////////////////////////////////////////////////////////
// CSDBView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CSDBView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CSDBView message handlers

void CSDBView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC *pDC=GetDC();
	CPen newpen(PS_SOLID,1,m_Color);              //构造画笔
	CPen *pOldPen=pDC->SelectObject(&newpen);      //将画笔选入设备环境
	//////////////////////////////点元/////////////////////////////////
	if(flag>0&&flag<4)
	{
		if(flag==1)                      //数据库中type为1表示为圆形点元
			pDC->Ellipse(point.x,point.y,point.x+10,point.y+10);
		if(flag==2)                       //数据库中type为2表示为矩形点元
			pDC->Rectangle(point.x-5,point.y-5,point.x+5,point.y+5);
		if(flag==3)                        //数据库中type为3表示为三角形点元
		{
			POINT polygon[3]={{point.x+5,point.y+8},{point.x,point.y},{point.x+10,point.y}};
			pDC->Polygon(polygon,3);
		}
		sp.InsertPoint(point,flag);                  //插入点坐标
		sp.InsertPointEntity(flag,m_Color);     //插入点元
	}
	//////////////////////////////线元/////////////////////////////////
	else if(flag>4&&flag<10)
	{
		if(flag==5)                      //画直线
		{
			if(m_nStep==0)
			{
				m_nStartX=point.x;
				m_nStartY=point.y;	
				m_nStep++;                      //操作步数加1
				sp.InsertPoint(point,flag);                  //插入点坐标
				SetCapture();                //捕做鼠标
			}  
			else
			{
			   pDC->MoveTo(m_nStartX,m_nStartY);
			   pDC->LineTo(point);

			   m_nStep=0;
			   m_nStartX=m_nStartY=0;
			   m_nEndX=m_nStartX=0;
			   ::ReleaseCapture();
				sp.InsertPoint(point,flag);                  //插入点坐标
				sp.InsertIineEntity(flag,m_Color);
			}
		}
		if(flag==6)              //画弧线
		{
			if(m_nStep==0)
			{
				m_nStartX=point.x;
				m_nStartY=point.y;	
				m_nStep++;                      //操作步数加1
				sp.InsertPoint(point,flag);                  //插入点坐标
				SetCapture();                //捕做鼠标
			}  
			else
			{
			   pDC->Arc(m_nStartX,m_nStartY,point.x,point.y,0,0,0,0);

			   m_nStep=0;
			   m_nStartX=m_nStartY=0;
			   m_nEndX=m_nStartX=0;
			   ::ReleaseCapture();
				sp.InsertPoint(point,flag);                  //插入点坐标
				sp.InsertIineEntity(flag,m_Color);       //插入点元
			}
/*			else if(m_nStep==1)
			{
				m_nMidX=point.x;
				m_nMidY=point.y;	
				m_nStep++;                      //操作步数加1
				sp.InsertPoint(point);                  //插入点坐标
				SetCapture();                //捕做鼠标
			}  
			else
			{
			   pDC->Arc(m_nStartX,m_nStartY,m_nMidX,m_nMidY,point.x,point.y,0,0);

			   m_nStep=0;
			   m_nStartX=m_nStartY=0;
			   m_nMidX=m_nMidY=0;
			   m_nEndX=m_nStartX=0;
			   ::ReleaseCapture();
				sp.InsertPoint(point);                  //插入点坐标
				sp.InsertIineEntity(flag,m_Color);       //插入点元
				}
			*/}
			if(flag==7)                      //画矩形
			{
				pDC->SetROP2(R2_NOTXORPEN);
				if(m_nStep==0)
				{
					m_nStartX=point.x;
					m_nStartY=point.y;	
					m_nEndX=point.x;
					m_nEndY=point.y;
					m_nStep++;                      //操作步数加1
					sp.InsertPoint(point,flag);                  //插入点坐标
					SetCapture();                 //捕做鼠标
				}  
				else
				{
				//	pDC->Rectangle(m_nStartX,m_nStartY,point.x,point.y);
					
					m_nStep=0;
					m_nStartX=m_nStartY=0;
					m_nEndX=m_nStartX=0;
					::ReleaseCapture();
					sp.InsertPoint(point,flag);                  //插入点坐标
					sp.InsertIineEntity(flag,m_Color);
				}
			}
			if(flag==8)
			{
				if(m_nStep==0)
				{
					m_nStartX=point.x;
					m_nStartY=point.y;	
					m_nStep++;                      //操作步数加1
					sp.InsertPoint(point,flag);                  //插入点坐标
					SetCapture();                //捕做鼠标
				}  
				else
				{	
					if(m_nStep>10) 
					{
						m_Stop=true;
						MessageBox("输入的点数不能超过10!");
					}
					if(m_Stop)
					{
						::ReleaseCapture();
						m_nStep=0;
						m_nStartX=m_nStartY=0;
						m_nEndX=m_nStartX=0;
						m_Stop=false;
					}
					else
					{
						pDC->MoveTo(m_nStartX,m_nStartY);
						pDC->LineTo(point);
						
						m_nStep++;
						m_nStartX=point.x;
						m_nStartY=point.y;	
						//	m_nStartX=m_nStartY=0;
						m_nEndX=m_nEndY=0;
					}
					
					
					sp.InsertPoint(point,flag);                  //插入点坐标
					
					
				}
			}
		
	}
	//////////////////////////////////////////////////////////////////


	//////////////////////////////////////////////////////////////////
	else
	{
		if(m_Drag==1)                          //删除点元
		{
			for(int i=point.x-5;i<=point.x+5;i++)
				for(int j=point.y-5;j<=point.y+5;j++)
				{
					sp.DelPointEntity(i,j);	
					Invalidate(TRUE);            //更新界面
					m_Refesh++;
				}
		}
		if(m_Edit==1)                            //编辑点元
		{
			for(int i=point.x-5;i<=point.x+5;i++)
				for(int j=point.y-5;j<=point.y+5;j++)
				{
					if(int m=sp.CheckPoint(i,j)>0)       //如果点被选中
					{
						itoa(m,s,10); 
						int x1;
						CString sql;
						sql="SELECT * FROM PointEntity WHERE PNum=";
						sql+=s;
						m_Rst=m_ado.GetRecordSet((_bstr_t)sql);
						while(m_Rst->adoEOF==0) 
						{
							CString xx((LPCTSTR)(_bstr_t)m_Rst->GetCollect("Type"));
						//	varValue=m_Recond->GetFields()->GetItem("ID")->Value;
							 x1=atoi(xx);				
							m_Rst->MoveNext();
						}	
						    
					//	CString yy((LPCTSTR)(_bstr_t)m_Rst->GetCollect("Color")); 	
					//	int x1=atoi(xx);
					//	int y1=atoi(yy);
						CPen newpen2(PS_SOLID,1,RGB(0,255,255));              //构造画笔
						CPen *pOldPen=pDC->SelectObject(&newpen2);      //将画笔选入设备环境
						if(x1==1)           //画圆形点元
						{
							pDC->Ellipse(i,j,i+10,j+10);
						}
						if(x1==2)           //画矩形点元
						{
							pDC->Rectangle(i-5,j-5,i+5,j+5);
						}
						if(x1==3)           //画三角形点元
						{
							POINT polygon[3]={{i+5,j+8},{i,j},{i+10,j}};
							pDC->Polygon(polygon,3);
						}

						
						
					//	m_nStartX=point.x;
					//	m_nStartY=point.y;
						m_nStep++;
						flag=11;
					}
					//	sp.EditPointEntity(i,j);	

					//			m_Refesh++;
				}
				if(flag==10) 
				{
				sp.EditPointEntity(m_nStartX,m_nStartY,point.x,point.y,m_Color);
				Invalidate(TRUE);            //更新界面	
				m_Refesh++;				
				}
		}
	}
	pDC->SelectObject(pOldPen);
	ReleaseDC(pDC);
	CView::OnLButtonDown(nFlags, point);
}

void CSDBView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
		CDC *pDC=GetDC();
	CPen newpen(PS_SOLID,1,m_Color);              //构造画笔
	CPen *pOldPen=pDC->SelectObject(&newpen);      //将画笔选入设备环境
	
	CClientDC dc(this);
	if(flag==5)
	{

⌨️ 快捷键说明

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