📄 ugkcanvas.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 + -