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

📄 chinaviewview.cpp

📁 读取Blob字段(大二进制数据)的一个程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:

//返回值:无  
//***********************************************
void CChinaViewView::DrawStar(CDC *pDC, LPPOINT point, int nCount, COLORREF color)
{
	CPoint *pt;
	pt = new CPoint[10];
	pt[0].x = point[0].x; pt[0].y = point[0].y-8;
	pt[1].x = point[0].x+2; pt[1].y = point[0].y-2;
	pt[2].x = point[0].x+6; pt[2].y = point[0].y-2;
	pt[3].x = point[0].x+3; pt[3].y = point[0].y+1;
	pt[4].x = point[0].x+5; pt[4].y = point[0].y+7;
	pt[5].x = point[0].x; pt[5].y = point[0].y+4;
	pt[6].x = point[0].x-5; pt[6].y = point[0].y+7;
	pt[7].x = point[0].x-3; pt[7].y = point[0].y+1;
	pt[8].x = point[0].x-6; pt[8].y = point[0].y-2;
	pt[9].x = point[0].x-2; pt[9].y = point[0].y-2;
	CBrush *newBrush;
	CBrush *OldBrush;
	newBrush = new CBrush(color);
	OldBrush = pDC->SelectObject(newBrush);
	pDC->Polygon(pt,10);
	pDC->SelectObject(OldBrush);
	delete newBrush;
	delete []pt;
}

void CChinaViewView::ReadDataProvince()
{
	CString filename = _T("CHINA.ZJ1");
	
	FILE *fp;
	fp = fopen(filename,"r");
	while (!feof(fp))
	{
		CZhuji *Zhuji;
		Zhuji = new CZhuji;
		fscanf(fp,"%d %lf %lf %s",&Zhuji->flag,&Zhuji->x,&Zhuji->y,&Zhuji->zhuji);
		m_zhuji.Add(Zhuji);
	}
	fclose(fp);
}


//***********************************************
//函数名:DrawMapFromZJ1

//功能:将ZJ1文件中的数据显示在客户区

//参数说明:pDC   CDC类指针,用于绘制多边形

//返回值:无  
//***********************************************
void CChinaViewView::DrawMapFromZJ1(CDC *pDC)
{
	CFont *newFont1;
	CFont *newFont2;
	CFont *newFont3;
	CFont *OldFont;
	
	newFont1 = new CFont();// 省份的注记
	newFont1->CreateFont(int(-6-10*times),0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
		                 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS ,DRAFT_QUALITY,
						 VARIABLE_PITCH|FF_SWISS,"Tahoma");
	newFont2 = new CFont();// 省会的注记
	newFont2->CreateFont(int(-8*times-5),0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
		                 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS ,DRAFT_QUALITY,
						 VARIABLE_PITCH|FF_SWISS,"Arial");
	newFont3 = new CFont();// 其他的注记
	newFont3->CreateFont(int(-5*times-5),0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
		                 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS ,DRAFT_QUALITY,
						 VARIABLE_PITCH|FF_SWISS,"Times New Roman");
	
	for (int i=0;i<m_zhuji.GetSize()-1;i++)
	{
		CZhuji *temp = m_zhuji.GetAt(i);
		CString str;
		str.Format("%s",temp->zhuji);
		if (temp->flag==1)        // 省份的注记
		{
			pDC->SetTextColor(RGB(255,0,0));
			OldFont = pDC->SelectObject(newFont1);
		}
		else if (temp->flag==2)   // 省会的注记
		{
			pDC->SetTextColor(RGB(0,0,0));
			OldFont = pDC->SelectObject(newFont2);
		}
		else if (temp->flag==3)	//小地图中的省名
		{
			pDC->SetTextColor(RGB(255,0,0));
			OldFont = pDC->SelectObject(newFont3);
		}
		else if (temp->flag==4)//小地图中的省会
		{
			pDC->SetTextColor(RGB(0,0,0));
			OldFont = pDC->SelectObject(newFont3);
		}
		else if (temp->flag==5)//小地图中的岛屿
		{
			pDC->SetTextColor(RGB(255,0,0));
			OldFont = pDC->SelectObject(newFont2);
		}
	
		pDC->SetBkMode(TRANSPARENT);
		pDC->TextOut((int)((temp->x+8)*times-xmin),(int)(ymax-temp->y*times),str);
		pDC->SelectObject(OldFont);
		pDC->SetBkMode(OPAQUE);
	}
	delete newFont1;
	delete newFont2;
	delete newFont3;
	ReleaseDC(pDC);
}

//***********************************************
//函数名:ClearMemScreen

//功能:清除内存设备描述表中的图形,将客户区背景颜色进行修改

//参数说明:pDC   CDC类指针,用于绘制多边形

//返回值:无  
//***********************************************
void CChinaViewView::ClearMemScreen(CDC *pDC)
{
	CPen *newPen;
	CPen *OldPen;
	CBrush *newBrush;
	CBrush *OldBrush;
	newPen = new CPen(PS_SOLID,1,RGB(255,0,0));
	newBrush = new CBrush(RGB(192,192,192));

	if (OldPen = pDC->SelectObject(newPen))
	{
		if (OldBrush = pDC->SelectObject(newBrush))
		{
			pDC->Rectangle(0,0,Screenwidth-1,Screenheight-1);
		}
		pDC->SelectObject(OldBrush);
	}
	pDC->SelectObject(OldPen);
	delete newPen;
	delete newBrush;
}


void CChinaViewView::OnMouseMove(UINT nFlags, CPoint point) 
{
	CString mx,my;//显示坐标
	
	mx.Format("地图坐标是 X: %.3lf ", Min_X + point.x);//加上相对最小值,成为地图上的绝对坐标
	my.Format(" Y: %.3lf ", Min_Y + point.y);
	
	CMainFrame* pBar = (CMainFrame*)AfxGetMainWnd();

	pBar->m_wndStatusBar.SetPaneText(1,mx,TRUE);
	pBar->m_wndStatusBar.SetPaneText(2,my,TRUE);

	
	if (MenuIndex == 1)//Zoom In
	{
		::SetCursor(h_ZoomIn);
		if (buttomdown==TRUE)    //拉框,以便确定放大倍数
		{
			CDC *pdc = GetDC();
			pdc->SetROP2(R2_NOT);
			pdc->SelectStockObject(BLACK_PEN);
			if (m_orign.x>=0)     //鼠标左键按下后才响应
			{
				pdc->Rectangle(m_orign.x,m_orign.y,m_move.x,m_move.y);   //消去前次画的矩形框
				pdc->Rectangle(m_orign.x,m_orign.y,point.x,point.y);    //画当前的矩形框
				m_move = point;   //m_move记录前次移动的坐标
			}	
			ReleaseDC(pdc);
		}
	}
	else if (MenuIndex == 2)//Zoom Out
	{
		::SetCursor(h_ZoomOut);
	}
	else if (MenuIndex == 3)//Pan
	{
		::SetCursor(h_Pan);
	}
	else 
	{
		::SetCursor(h_Arrow);
	}
	
	CView::OnMouseMove(nFlags, point);
}

void CChinaViewView::OnMapZoomin() 
{
	MenuIndex = 1;
	
}

void CChinaViewView::OnMapZoomout() 
{
	MenuIndex = 2;
}

void CChinaViewView::OnMapPan() 
{
	MenuIndex = 3;
}

void CChinaViewView::OnMapFullview() 
{
	MenuIndex = 4;	
	
	times = 1;
	xmin = Min_X;
	xmax = Max_X;
	ymin = Min_Y;
	ymax = Max_Y;
	Invalidate(FALSE);
}

void CChinaViewView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	CClientDC pdc(this);
	dc->CreateCompatibleDC(&pdc);
	bitmap->CreateCompatibleBitmap(&pdc,Screenwidth-1,Screenheight-1);
	dc->SelectObject(bitmap);
	ClearMemScreen(dc);
	
	CChinaViewDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	ReadDataPoint();//My Draw
	ReadDataProvince();

//	ReadDataFromZB1();
//	ReadDataFromZJ1();

	xmin = Min_X; xmax = Max_X;
	ymin = Min_Y; ymax = Max_Y;
	
	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = 100;//1024;
	sizeTotal.cy = 100;//700;
//	SetScrollSizes(MM_TEXT, sizeTotal);
	Invalidate(FALSE);
}

void CChinaViewView::OnUpdateMapZoomin(CCmdUI* pCmdUI) 
{
	pCmdUI->SetRadio(MenuIndex == 1);
}

void CChinaViewView::OnUpdateMapZoomout(CCmdUI* pCmdUI) 
{
	pCmdUI->SetRadio(MenuIndex == 2);
}

void CChinaViewView::OnUpdateMapPan(CCmdUI* pCmdUI) 
{
	pCmdUI->SetRadio(MenuIndex == 3);
}

// 视口创建,设置参数,主要为了设置初始化光标为空,以
// 进行光标相互切换。
BOOL CChinaViewView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	lpszClassName = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
				    LoadCursor(NULL, NULL),
			        (HBRUSH)(COLOR_WINDOW+1),
			        NULL);
		
	return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

void CChinaViewView::OnViewFootnote() 
{
	footnote = !footnote;

	Invalidate();

}



void CChinaViewView::OnUpdateViewFootnote(CCmdUI* pCmdUI) 
{
	 if (footnote)
	 {
		 pCmdUI->SetCheck(TRUE);   
	 }
     else
		 pCmdUI->SetCheck(FALSE);
}

void CChinaViewView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	m_orign = point;
	m_move = m_orign;
	buttomdown = TRUE;
	SetCapture();
	
	CView::OnLButtonDown(nFlags, point);
}

void CChinaViewView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	
	buttomdown = FALSE;
	//获取客户区中心坐标
	CRect rect;
	GetClientRect(&rect);
	int m_centerX,m_centerY;

	m_centerX = rect.Width()/2;
	m_centerY = rect.Height()/2;
	
	ReleaseCapture();
	
	double dx,dy;
	if (MenuIndex == 3)       //漫游
	{
		dx = point.x - m_orign.x;
		dy = point.y - m_orign.y;
		xmin = xmin - dx;
		xmax = xmax - dx;
		ymin = ymin + dy;
		ymax = ymax + dy;

		Invalidate(FALSE);
	}
	if (MenuIndex == 2)   //缩小两倍
	{
		times = times/2.0;
		
		//dx,dy用于使得缩小后的地图中心位于客户区中心
		dx = (Max_X-Min_X)/2.0*times+Min_X*times - m_centerX;
		dy = (Max_Y-Min_Y)/2.0*times+Min_Y*times - m_centerY;
		xmin = Min_X; xmax = Max_X;
		ymin = Min_Y; ymax = Max_Y;

		//修改极值,等价于修改地图显示结果,
		//因为地图显示与xmin和ymax有关,具体见画图算法.
		xmin  = xmin*times + dx;
		xmax  = xmax*times + dx;
		ymin  = ymin*times - dy;
		ymax  = ymax*times - dy;

		Invalidate(FALSE);
	}
	if (MenuIndex == 1)     //放大,放大倍数与拉伸的窗口大小有关
	{
		//以x,y方向上放大倍数最小的值为放大的倍数
		double times1,times2;
		times1 = (Max_X-Min_X)/fabs(point.x-m_orign.x);
		times2 = (Max_Y-Min_Y)/fabs(point.y-m_orign.y);

		//放大倍数太小时不放大,主要是防止点击时出现放大问题 
		if (fabs(point.x-m_orign.x)<10 && fabs(point.y-m_orign.y)<10)
		{
			return;
		} 



		if (times1>times2)
		{
			times = times*times2;
		}
		else 
			times = times*times1;

		//计算新的极值,将拉框的中心显示在客户区中心
		
		dx = (point.x-m_orign.x)/2.0*times + m_orign.x*times - m_centerX;
		dy = (point.y-m_orign.y)/2.0*times + m_orign.y*times - m_centerY;

		xmin = Min_X; 
		xmax = Max_X;
		
		ymin = Min_Y;
		ymax = Max_Y;

		xmin  = xmin*times + dx;
		xmax  = xmax*times + dx;
		ymin  = ymin*times - dy;
		ymax  = ymax*times - dy;
	
		Invalidate(FALSE);
	}

	CView::OnLButtonUp(nFlags, point);
}

⌨️ 快捷键说明

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