vc对话框基于mapx比例尺

txy3159217078 2015-01-14 02:17:52
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);
出错。求帮忙
...全文
428 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
txy3159217078 2015-01-22
  • 打赏
  • 举报
回复
void CMapView::OnToolTest() { CMapXLayers layers=m_ctrlMapX.GetLayers(); CMapXFeature ftr; try { if(ftr.CreateDispatch(ftr.GetClsid())) { ftr=m_ctrlMapX.GetFeatureFactory().CreateSymbol();//创建一个symbo CMapXStyle style=ftr.GetStyle();//获得图元风格 style.SetSymbolType(miSymbolTypeBitmap);//设置图元的风格,显示位图 style.SetSymbolBitmapName("CAR1-32.BMP");//指定所要显示位图的存放位置 style.SetSymbolBitmapSize(32);//指定位图大小 style.SetSymbolBitmapTransparent(TRUE);//设置为透明 ftr.GetPoint().Set(106.580936,29.561000);//指定要显示图元的位置(经纬度位置) layers.Item("China").AddFeature(ftr); } else { AfxThrowOleException(CO_E_CLASS_CREATE_FAILED); } } catch(COleDispatchException *e) { e->ReportError(); e->Delete(); } catch(COleException *e) { e->ReportError(); e->Delete(); } } 不知道为什么图元显示不出来。
txy2117669639 2015-01-20
  • 打赏
  • 举报
回复
我知道问题出在哪里了,新建工程时出问题了。请查这个网页 http://blog.sina.com.cn/s/blog_62ff04950100km48.html
txy3159217078 2015-01-16
  • 打赏
  • 举报
回复
是不是这样的 CMapXLayers tmp=m_ctrlMapX.GetLayers(); tmp.AddUserDrawLayer("ScaleBar",1); 但是到这是 CMapXLayers tmp=m_ctrlMapX.GetLayers(); 出现这样错误 错误C2440:“初始化”:不能从“阶级CCMapXLayers”转换到“阶级CMapXLayers” 还得大哥帮忙,小弟在这谢谢大哥了
txy3159217078 2015-01-16
  • 打赏
  • 举报
回复
是不是这样的
赵4老师 2015-01-15
  • 打赏
  • 举报
回复
m_ctrlMapX.GetLayers().AddUserDrawLayer("ScaleBar",1); 改为 YourClassType tmp=m_ctrlMapX.GetLayers(); tmp.AddUserDrawLayer("ScaleBar",1);
txy3159217078 2015-01-15
  • 打赏
  • 举报
回复
还希望大哥多多指导小弟
txy3159217078 2015-01-15
  • 打赏
  • 举报
回复
我是说在对话框的初始化 添加用户绘画图层 出错 在m_ctrlMapX.GetLayers().AddUserDrawLayer("ScaleBar",1); 如下提示 H:\sample1\sample1Dlg.cpp(141) : error C2027: use of undefined type 'CCMapXLayers' h:\sample1\cmapx.h(15) : see declaration of 'CCMapXLayers' H:\sample1\sample1Dlg.cpp(141) : error C2228: left of '.AddUserDrawLayer' must have class/struct/union type
赵4老师 2015-01-14
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧