设为首页 加入收藏

TOP

VC++6.0下GIS打印输出控制的实现(二)
2012-11-04 15:28:42 来源: 作者: 【 】 浏览:421
Tags:6.0 GIS 打印 输出 控制 实现
  二、分页控制

  分页方法为从左至右,从上到下;

void CBoundaryView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)

{

// 获取页面高、宽

mpageheight=pDC->GetDeviceCaps(VERTSIZE);//单位为毫米

mpagewidth=pDC->GetDeviceCaps(HORZSIZE);

xpage=mpagewidth;

ypage=mpageheight;

//计算打印页数

npagex=(int)xwide/xpage+(xwide>xpage*(int)(xwide/xpage));

npagey=(int)yhigh/ypage+(yhigh>ypage*(int)(yhigh/ypage));

npage=npagex*npagey;

pInfo->SetMinPage(1);

pInfo->SetMaxPage(npage);

}

计算每页的打印原点

void CBoundaryView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)

{

// TODO: Add your specialized code here and/or call the base class

int nrow,ncol;

if(pInfo==NULL)

return;


ncol=(pInfo->m_nCurPage-1)%npagex+1;//列位置

if(pInfo->m_nCurPage%npagex==0)

nrow=pInfo->m_nCurPage/npagex;

else

nrow=pInfo->m_nCurPage/npagex+1;//行位置

//////////////////////////////////////计算打印起始点坐标

if(!print_selection)//全图打印

{

printstartx=xmin+(float)((ncol-1)*(double)((xmax-xmin)/(float)npagex));//获取打

//印起始点坐标

printstarty=ymin-(float)((nrow-1)*(double)((ymax-ymin)/(float)npagey));

}//xmin、ymin为全图的最小坐标,xmax、ymax为全图的最大坐标

else if(print_selection)//选择区域打印输出

{ //计算打印起始点坐标

printstartx=print_x1+(float)((ncol-1)*(double)((print_x2-print_x1)/(float)npagex));

printstarty=print_y2-(float)((nrow-1)*(double)((print_y1-print_y2)/(float)npagey));

}// print_x1、print_y2为选择区域的最小坐标,print_x2、print_y1为选择区域的最

//大坐标

CView::OnPrepareDC(pDC, pInfo);

}

  三、屏幕选择区域、全图打印

  定义选择区域打印函数

void CBoundaryView::OnPrintSelection() //选择区域打印

{

draw_selection=1; //选择区域打印标志

………………………

print_selection=1;//设置为选择打印

}

  通过扑获鼠标信息获取选择区域的最小、最大坐标,经坐标变换得到print_x1、print_y2、print_x2、print_y1,利用裁剪函数进行图幅裁剪,将裁剪区域进行输出,这里不在赘述。

  屏幕选择区域、全图打印通过OnDraw(CDC* pDC)来实现,具体定义如下:

void CBoundaryView::OnDraw(CDC* pDC)

{

…………………………

if(pDC->IsPrinting())

{

pDC->SetMapMode(MM_LOMETRIC);

print_flag=1; //打印标志

if(!print_selection)//全图输出时

{ //因为1个单位为0.01厘米

print_scale=(float)(100.0*map_wide/(xmax-xmin));//坐标变换比例

}

else if(print_selection) //选择区域打印时

{

print_scale=(float)(100.0*map_wide/(print_x2-print_x1));

}

}

else //非打印时

{

print_scale=1;

print_flag=0;

}

…………………………

if(print_flag==0)

{

DrawVectorMap(const char *MapFile);

}

else if(print_flag==1) //打印输出时

{

DrawVectorMap(const char *MapFile,CDC* pDC);

}

……………………

}

打印结束后,恢复屏幕视图

void CBoundaryView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)

{

DrawVectorMap(const char *MapFile);//恢复当前屏幕

InvalidateRect(NULL,TRUE);

print_flag=0;

print_selection=0;

…………………

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC++实现工具条上的标准控件动态.. 下一篇VC++实现应用程序对插件的支持

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: