📄 chinaviewview.cpp
字号:
//返回值:无
//***********************************************
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 + -