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

📄 ugkcanvas.cpp

📁 linux下一款GIS程序源码
💻 CPP
字号:
/* ugkcanvas.cpp */#include "ugkcanvas.h"#include <qapplication.h>#include "ugkpainter.h"#include "KitSrc/ugkglobal.h"#include "mainfrm.h"#include <stdio.h>#include <qmessagebox.h>#include <qstatusbar.h> #include <qcursor.h> UGKCanvas::UGKCanvas(QWidget *parent,const char *name):	QFrame(parent,name){    m_Parent = parent;    setBackgroundMode(NoBackground);    setFrameStyle(Box | Raised);    setLineWidth(2);    setMidLineWidth(0);       bSetLyrManagerRef = FALSE;    m_LyrManagerRef= NULL;    m_CurMapTool = MAPTOOL_Arrow;    lastScreen = NULL;    bLeftButtonPressed = FALSE;    bReDraw  = TRUE; //第一次需要绘制背景    bPainting  = FALSE;        bMarkSym = FALSE;    dlg = new MarkDlg(this,"Mark Dialog",TRUE);    }/* *  Destroys the object and frees any allocated resources */UGKCanvas::~UGKCanvas(){    if(lastScreen)	delete lastScreen;    if(dlg)	delete dlg;}void UGKCanvas::setLayerManagerRef( GUI_Manager *mgrRef){    if(mgrRef)    {	m_LyrManagerRef = mgrRef;	bSetLyrManagerRef = TRUE;    }    else    {	m_LyrManagerRef =NULL;	bSetLyrManagerRef = FALSE;    }}void UGKCanvas::resizeEvent ( QResizeEvent * e ){    QFrame::resizeEvent(e);    bReDraw = TRUE;}void UGKCanvas::paintEvent(QPaintEvent *e){      QFrame::paintEvent(e);    if(bPainting)	return;    bPainting = TRUE;    QCursor curWait(WaitCursor);    setCursor(curWait);    m_CurMapTool = MAPTOOL_Arrow;            QRect ptrt=contentsRect();//得到组件尺寸    //QRect ptrt=frameRect();//得到组件尺寸    if(bReDraw)  //需要绘制    {	int top,left,pw,ph;	top = ptrt.top();	left = ptrt.left();	pw = ptrt.width();	ph = ptrt.height();	QPixmap memDC(pw,ph,-1,QPixmap::DefaultOptim);//QPixmap::BestOptim 	UGKPainter p(&memDC);	p.setClipRect(0,0,pw,ph);	//先绘制背景	QBrush brush(white);	p.fillRect(0,0,pw,ph,brush);		if(bSetLyrManagerRef) //如果图层管理器设置了	{	    //printf("UGKCanvas__ Repaint\n");	    m_LyrManagerRef->setPaintRect( 0,0,pw, ph );	    m_LyrManagerRef->Draw( &memDC );	}	if(lastScreen)	    delete lastScreen;	lastScreen = new QPixmap(memDC);	p.end();	bitBlt(this,ptrt.left(),ptrt.top(),&memDC);	bReDraw = FALSE;    }    else      {  //不需要重新绘制	if(lastScreen)	    bitBlt(this,ptrt.left(),ptrt.top(),lastScreen);	if(bMarkSym)	{	    bMarkSym = FALSE; //只绘制一次,刷新后就没有了	    QPixmap sym(markSymPath);	    int sw,sh;	    sw = sym.width();	    sh = sym.height();	    if( (sw==16)&&(sh==16) )	    {		UGKPainter p(lastScreen);		p.drawPixmap(markSym_X-sw/2,markSym_Y-sh/2,sym);		p.drawText(markSym_X-sw/2,markSym_Y-sh/2,markSymName);		p.end();	    }	    	    	}    }    bPainting = FALSE;    QCursor curArrow(ArrowCursor);    setCursor(curArrow);  }   void UGKCanvas::mouseMoveEvent( QMouseEvent * e ){    movPt = e->pos();        if(bLeftButtonPressed)    {	int sx = MIN(firPt.x(),movPt.x());	int sy = MIN(firPt.y(),movPt.y());	int sw = ABS(firPt.x()-movPt.x());	int sh = ABS(firPt.y()-movPt.y());	QRect ptrt=contentsRect();	int pw,ph;	pw = ptrt.width();	ph = ptrt.height();	QPixmap memDC(pw,ph,-1,QPixmap::DefaultOptim);	UGKPainter pt(&memDC);	QBrush brush(QColor("white"));	pt.fillRect(0,0,pw,ph,brush);			QPen pen(QColor("black"),1,Qt::DotLine);	pt.setPen(pen);		switch(m_CurMapTool)	{	case MAPTOOL_ZoomIn:	case MAPTOOL_ZoomOut:  	    bitBlt(&memDC,0,0,lastScreen);	    pt.drawRect(sx,sy,sw,sh);	    bitBlt(this,ptrt.left(),ptrt.top(),&memDC);	    	    break;	case MAPTOOL_Pan:	    bitBlt(&memDC,movPt.x()-firPt.x(),movPt.y()-firPt.y(),lastScreen);	    bitBlt(this,ptrt.left(),ptrt.top(),&memDC);	    break;	case MAPTOOL_Arrow:	case MAPTOOL_Label:	    ;	}		pt.end();    }        }void UGKCanvas::mousePressEvent( QMouseEvent * e ){    firPt = e->pos();        if(e->button()==Qt::LeftButton)    {	if((m_CurMapTool==MAPTOOL_ZoomIn)||	   (m_CurMapTool==MAPTOOL_ZoomOut)||	   (m_CurMapTool==MAPTOOL_Pan))	    bLeftButtonPressed = TRUE;	    }}void UGKCanvas::mouseReleaseEvent( QMouseEvent *e){    QStatusBar *statusbar=((mainfrm*)m_Parent)->m_StatusBar;            secPt = e->pos();    if(bLeftButtonPressed)    {	int sx = (firPt.x()+secPt.x())/2;	int sy = (firPt.y()+secPt.y())/2;	int sw = ABS(secPt.x()-firPt.x());	int sh = ABS(secPt.y()-firPt.y());	if((sw==0)&&(sh==0))	{	    bLeftButtonPressed = FALSE;	    return;	}		QRect ptrt=contentsRect();	if((m_CurMapTool==MAPTOOL_ZoomIn)||(m_CurMapTool==MAPTOOL_ZoomOut))	 	    bitBlt(this,ptrt.left(),ptrt.top(),lastScreen);	             bLeftButtonPressed = FALSE;       if(m_LyrManagerRef==NULL)	   return;       double oldViewX,oldViewY;       double oldCenX,oldCenY;       m_LyrManagerRef->getView(oldViewX,oldViewY);       m_LyrManagerRef->getCenter(oldCenX,oldCenY);       double newViewX,newViewY;       double newCenX,newCenY;              QString mess;       switch(m_CurMapTool)       {       case MAPTOOL_Arrow:       case MAPTOOL_Label:	   break;       case MAPTOOL_ZoomIn:	   newViewX = oldViewX *sw/ptrt.width();	   newViewY = oldViewY *sh/ptrt.height();	   newCenX = oldCenX+oldViewX*( sx-(ptrt.left()+ptrt.width()/2) )/ptrt.width();	   newCenY=  oldCenY-oldViewY*( sy-(ptrt.top()+ptrt.height()/2) )/ptrt.height();	   	   if((newViewX<0.05)||(newViewY<0.05))	       return;	   m_LyrManagerRef->setCenter(newCenX,newCenY);	   m_LyrManagerRef->setView(newViewX,newViewY);	   mess = QString(tr("X view:"))+QString::number(newViewX)+QString("  ")+		  QString(tr("Y view:"))+QString::number(newViewY);	   	   statusbar->message(tr("Redrawing..."));	   bReDraw = TRUE;	   repaint(TRUE);	   statusbar->message(mess);	   break;       case MAPTOOL_ZoomOut: 	   newViewX = oldViewX *ptrt.width()/sw;	   newViewY = oldViewY *ptrt.height()/sh;	   newCenX = oldCenX+oldViewX*( sx-(ptrt.left()+ptrt.width()/2) )/ptrt.width();	   newCenY = oldCenY-oldViewY*( sy-(ptrt.top()+ptrt.height()/2) )/ptrt.height();	   if((newViewX<0.05)||(newViewY<0.05))	       return;	   	   m_LyrManagerRef->setCenter(newCenX,newCenY);	   m_LyrManagerRef->setView(newViewX,newViewY);	   mess = QString(tr("X view:"))+QString::number(newViewX)+QString("  ")+		  QString(tr("Y view:"))+QString::number(newViewY);	   	   statusbar->message(tr("Redrawing..."));	   bReDraw = TRUE;	   repaint(TRUE);	   statusbar->message(mess);	   break;       case MAPTOOL_Pan:	   	   newCenX = oldCenX-oldViewX*( secPt.x()-firPt.x())/ptrt.width();	   newCenY=  oldCenY+oldViewY*( secPt.y()-firPt.y() )/ptrt.height();	   m_LyrManagerRef->setCenter(newCenX,newCenY);	   mess = QString(tr("X view:"))+QString::number(oldViewX)+QString("  ")+		  QString(tr("Y view:"))+QString::number(oldViewY);	   	   statusbar->message(tr("Redrawing..."));	   bReDraw = TRUE;	   repaint(TRUE);	   statusbar->message(mess);	   break;             }   }            if(m_CurMapTool==MAPTOOL_Label)    {	//弹出对话框,选择标记图形,然后绘制标记	QString symPath=dlg->ModalShow();	if(symPath.isNull())	    return;	else	{		markSymPath = symPath;		markSymName = getBaseName(symPath);		bMarkSym = TRUE;		markSym_X = secPt.x();		markSym_Y = secPt.y();		repaint(TRUE);		return;	}    }    }

⌨️ 快捷键说明

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