vc对话框基于mapx比例尺
vc对话框基于mapx比例尺..
代码如下
在CSample1Dlg::OnInitDialog()
{
m_ctrlMapX.SetGeoSet("2012全国地图1\\China地图.gst");//2014全国地图
//m_ctrlMapX2.SetCenterX(116.4623); //设置中心坐标
//m_ctrlMapX2.SetCenterY(40.2360);
m_ctrlMapX.SetTitleText("");
m_ctrlMapX.SetZoom(5000);
m_ctrlMapX.GetLayers().AddUserDrawLayer("ScaleBar",1);
}
void CSample1Dlg::OnDrawUserLayerMap1(LPDISPATCH Layer, long hOutputDC, long hAttributeDC, LPDISPATCH RectFull, LPDISPATCH RectInvalid)
{
// TODO: Add your control notification handler code here
CDC dc;
dc.Attach((HDC)hOutputDC);
dc.SetAttribDC((HDC)hAttributeDC);
//专门用一个函数绘制比例尺
DrawScaleBar(&dc);
}
void CSample1Dlg::DrawScaleBar(CDC *pDC)
{
float barWidth=(float)0.5,barHeight=(float)0.08;
float startX=(float)0.3,startY=(float)0.3;
long x1,y1,x2,y2;
int i;
m_ctrlMapX.SetMapUnit(miUnitKilometer);
CPen pen;
CBrush brushRed,brushWhite,*pOldBrush;
CFont *pOldFont;
pen.CreatePen(0,1,(COLORREF)0);
brushRed.CreateSolidBrush(255);
brushWhite.CreateSolidBrush(16777215);
//设置map 模式为HI-English
pDC->SetMapMode(MM_HIENGLISH);
//设置绘画工具
CPen *pOldpen=pDC->SelectObject(&pen);
pOldBrush=pDC->SelectObject(&brushRed);
//转换hienglish ,一个hienglish等于0.001英寸
x1=(long)(startX*1000);
y1=(long)(startY*1000);
barHeight*=1000;
barWidth*=10000;
for(i=0;i<=1;i++)
{
long x2=(long)(barWidth+x1);
long y2=(long)(barHeight+y1);
//绘制第一个矩形
if(i==0)
{
//第一排队第一个矩形用红色
pDC->SelectObject(&brushRed);
}
else
{
//第二排第一个矩形用白色
pDC->SelectObject(&brushWhite);
}
}
pDC->Rectangle(x1,-y1,x2,-y2);
//绘制第二个矩形
x1=x2;
x2=(long)(barWidth+x1);
if(i==0)
{
//第一排第二个矩形用白色
pDC->SelectObject(&brushWhite);
}
else
{
//第一排第二个矩形用红色
pDC->SelectObject(&brushRed);
}
//绘制第三个矩形
x1=x2;
x2=(long)(barWidth*2+x1);
if(i==0)
{
//第一排第三个矩形用红色
pDC->SelectObject(&brushRed);
}
else
{
//第一排第三个矩形用红色
pDC->SelectObject(&brushWhite);
}
pDC->Rectangle(x1,-y1,x2,-y2);
x1=(long)(startX*1000);
y1=y2;
//计算每英寸像素
CPoint pt(1000,1000);
pDC->LPtoDP(&pt);
long lPixPerInch=pt.x;
CRect rc;
CSample1Dlg::GetClientRect(&rc);
float screenX,screenY;
double mapX1,mapY1;
screenX=(float)(rc.bottom/2);
try{
m_ctrlMapX.ConvertCoord(&screenX,&screenY,
&mapX1,&mapY1,miScreenToMap);
}
catch(COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch(COleException *e)
{
e->ReportError();
e->Delete();
}
double mapX2,mapY2;
screenX=(float)(rc.right/2+lPixPerInch);
screenY=(float)(rc.bottom/2);
try{
m_ctrlMapX.ConvertCoord(&screenX,&screenY,
&mapY1,&mapY2,miScreenToMap);
}
catch(COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch(COleException *e)
{
e->ReportError();
e->Delete();
}
CFont font;
font.CreatePointFont(100,"Arial",pDC);
pOldFont=pDC->SelectObject(&font);
pDC->SetTextColor(0);
pDC->SetBkMode(TRANSPARENT);
//输出开始识0
x1=(long)(startX*1000);
y1=(long)((startY-.2)*1000);
pDC->TextOut(x1,-y1,"0");
//输出1英寸距离处的标识
x1=(long)(barWidth*2+startX*1000);
CString str;
str.Format("%.0f",m_ctrlMapX.Distance(mapX1,mapY1,mapX2,mapY2)/2);
int iCenterAdjustmet=60*str.GetLength();
//输出2英寸距离处表示
x1=(long)(barWidth*4+startX*1000);
str.Format("%.0f",m_ctrlMapX.Distance(mapX1,mapY1,mapX2,mapX2));
iCenterAdjustmet=60*str.GetLength();
pDC->TextOut(x1-iCenterAdjustmet,-y1,str);
//输出距离单位
x1=(long)(barWidth*2+startX*1000);
y1=(long)((startY+.2)*1000);
str.Format("千米");
iCenterAdjustmet=60*str.GetLength();
pDC->TextOut(x1-iCenterAdjustmet,-y1,str);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldpen);
pDC->SelectObject(pOldFont);
pDC->ReleaseAttribDC();
pDC->Detach();
}
在m_ctrlMapX.GetLayers().AddUserDrawLayer("ScaleBar",1);
出错。求帮忙