导航工具设计 导航工具设计

导航工具设计

  • 期刊名字:电脑编程技巧与维护
  • 文件大小:201kb
  • 论文作者:潜继成,张文良
  • 作者单位:
  • 更新时间:2020-10-30
  • 下载次数:
论文简介

实用第一/智慧密集导航工具设计潜继成张文良摘要:以一个实例介绍C++在Vega Prime中导航工具的设计与实现。准备工作包括导航工具位图准备、热区数据定义,通过导航类、自定义消息处理过程、热区位置判断、功能执行等实现导航工具所有功能。关键词:导航工具;位困;热区透明的位图,之所以采用透明位图主要是为了避免显示导航工1引言具位图时遮盖了其下面显示的内容,格式可采用PNG格式。.所谓导航工具是指在窗口中显示、在指定区域中可响应用如图2 (a)所示。户操作的图形交互工具,操作包括图形滚动、缩放、旋转、改变视角等,典型应用实例如图1所示。导航工具在地图浏览、三维视景等实际应用系统中有广泛的应用。以Vega Prime三维+视景中的导航工具设计为例,来展示导航工具开发技术。中(叫导航工具位圈(B)然区尺寸圈2导航工具位圈与热区尺寸鲁江2.2 热区定义导航工具热区定义是设置位图尺寸、指定热区位置和尺寸等,将有关数据存储到数据文件中。例如叮将导航位图加载到Adobe Photoshop中,打开标尺,可以查看位图的尺寸、指定热区的位置和尺寸,如图2 (b)所示,指定AB矩形为热区,其位置和尺寸可根据标尺查出。定义图中6个热区的数据文件團1 导航工具应用实例(单位为像索):2准备工作853281位圈尺寸(长、宽)导航工具一般是在位图上定义几个可操纵的区域,称之为30 05530 1/左边热区左上角位置、 右下角位置热区,当鼠标移动到热区中时,鼠标改变成指定形状,如手形3055585 右边热区左上角位置、右下角位置0303055 1上边热区左 上角位置、右下角位重(b),表示为可操作的区域,在该区城内点鼠标键执行用户定553085 55 /下边热区左上角位置、 右下角位置义的功能。准备工作主要是进行位图准备、热区定义。中国煤化工斌、右下角位重2.1 位图准备一文量、右下角位重导航工具位图一般可使用二维绘图软件绘制生成,转换成MYH.CNMHGe66电脑墙程技巧与维护2010. 15图形图像处理.....HIC. AND IMAGE eE...N.........................................&myright,&mobottoml/读上边热区参数数据3程序加载up .eft=myleft:up.top =mytop;up right =myright;up.以上准备工作完成之后,需要将导航工具和热区定义数据bottom=mybottom;fscanf (fp,"%d %d % d % dn',&mylef,&mytop,加载到程序中,进行鼠标是否在热区内判断。这些工作由导航&myright,&mybottom); /读下边热区参数数据类C_ Navigation完成,具体定义为:down.left =myleft;down.top =mytop;down.right =class C Navigationmyright;down.bottom=mybottom;fscanf (fp,"%d %d %d % dn',&myleft,&mytop,public:&myrigh,&mybottom); 1/读左边热区参数数据C. Navigation0);//构造函数left.left =myletf,;lf.top =mpytop:lef.right =myright;~C_ Navigation); //析构函数left.bottom=mybottom;fscanf (fp,"%d %d % d % dNn' ,&myleft,&mytop,bool read(const char *fn://读数据文件&myright,&mybottom); /读右边热区参数数据void SetPos(int x.int y); /设置位置right.left =myleft:right.top =mytp:gh.right =void SetActualSize(int cx,int cy://实际尺寸myrigt:right.bottom=mybottom;fscanf (fp,"% d %d % d % dn",&myleft,&mytop,bool IsInUpfint mouse. xint mouse_y);&myright,&mybottom); /读放大热区参数数据//鼠标是否在上面热区内判断方法zoom_ jn.left=myleft;zoom_ jin.top=moytop:--;bool IsnDownint mouse. x,int mouse. _y);fscanf (fp,"% d %d %d % dn',&myleft,&mytop,//鼠标是否在下面热区内判断方法&myright,&mybottom); /读缩小热区参数数据bool IsInL eftint mouse. x,int mouse. y);zoom_ out.left=myleft;zoom_ out.top=mytop;/鼠标是否在左面热区内判断方法fcloselfp://关闭文件bool IsInRightit mouse x,int mouse. _y);size_ actual.cx= =size.cx;size. _actual.cy=size.cy;/鼠标是否在右面热区内判断方法return true;bool IsInZoomln(int mouse. x,int mouse. y);/鼠标是否在放大热区内判断方法return false;bool lsInZoomOut(int mouse_ x,int mouse. _y);/鼠标是否在缩小热区内判断方法3.2 进行鼠标是否在热区内判断以鼠标是否在上边热区判断为例,来说明判断方法。SIZE size;//位图尺寸bool C. Navigation:lsInUp(int mouse. x,int mouse_ .y)SIZE size. _actual; 实际显示的尺寸int pos_ x,pos. _Y; /显示位置1/判断鼠标是否在热区的矩形区域内RECT up;//上面热区矩形区域定义if (mouse. x-pos. x> =up.left && mouse x- pos. X<=up.RECT down; //. 上面热区矩形区域定义right && ..RECT left; //左 面热区矩形区域定义return tre//在矩形区域内,则返回真RECT right; /右 面热区矩形区域定义else return false://不在矩形区域内,则返回假RECT zoom_ jin; //放大热区矩形区域定义RECT zoom. out;:/缩小热区矩形区城定义3.3 位图显示3.1 加载热区数据将导航位图作为纹理,以导航工具位图绘制矩形,因为位图为透明的,显示结果就是透明的导航工具条,以下是以.bool C_ Nvigation:read(const char *fn)OpenGL相关的雨数实现导航工具的绘制。FILE* fp-fopentn,t't:/:/打开文件roid DrawNavigation(vrDrawContext *context)ifp)/文件存在nt cx,CY;/设置垂直投影模式fscanfp,"%d %dn",&cx,&y//读位图尺寸vrTransform:ElementProjection projectionElement;size.cx=cx;size.cy=cy;中国煤化工phic l0.0f, 1.0f, 0.0f,int myleft,mytop,myright,mybottom;fscanf (tp,"% d %d %d % dn";&mylef,&mytop,YHC N M H Gm:lementrojecion:电脑编程技巧与维护201015、" 67>实用第一/智慧密集Id,&projectionElement);GET. X LPARAMIParam); /存储鼠标位置p_ _VegaPrimeApp ->m_ Mouse. y =//绑定导航位图作为纹理GET_ Y_ LPARAMIParam);context->setState(m. _vr_ Navigation);/.确定导航工具显示位置和尺寸if (p_ VegaPrimeApp ->m_ Navigation.floatwidthwidth_ Navigatin/float)IslnPp(-. Iw_ width*2*m_ Navigation.size.cx/width. Navigation;p_ VegaPrimeApp ->m_ Navigation.heightheight Navigation/float)IsInDown-- IW_ height*2*m. _Naigation.iz.c/-;const float originX = -1.0f, originY =-height/2;IslnLef(... |I11绘制导航位图p_ VegaPrimeApp ->m. Navigation.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);IslnRight-.. |gIBegin(GL_ QUADS);P_ VegaPrimeApp ->m_Navigation.glTexCoord2f(0.0f 1.0f;gIVertex2floriginX, originY + height);P_ VegaPrimeApp ->m_ Navigation.gITexCoord2f(0.0f, 0.0f);Islnool+.-)gIVertex2f(originX, originY);V/如果鼠标在导航工具条的热区内,则关glTexCoord2f(1.0f, 0.0f);1闭视点鼠标操作glVertex2foriginX + width, originY);vpObserver* observer =vpObsev-gITexCoord2f(1.0f, 1.0f;er:find'myObserver' );gVerex2foriginX + width, originY + height;iflobserver)glEnd(;observer ->setStrategyEn-able( false )//如果鼠标在热区内,则关闭视点鼠标操作如果在普通窗口中绘制,可采用CDI++绘制位图的方法,也可实现透明导航上具条的绘制。4用户功能break;4.1处理消息case WM_ LBUTTONUP:/鼠标左键释放在VegaPrime注册自定义消息的处理过程(微软消息处理{过程),以便得到鼠标按键状态,判断鼠标如果在热区内,设iftlp. VegaPrimeApp)置相应标志。LRES ULT UserMicrosoftMessageHandlerFunc (vrWindowp_ VegaPrimeApp ->b_ LButtonDown =*vrWin, HWND hwnd, UINT uMsg, WPARAM .false; /鼠标按下标志p. _VegaPrimeApp - >m. Mouse_x =C. _VegaPrimeApp * p_VegaPrimeApp=pApp;GET_ X LPARAMIlParam);switch{uMsg)p_ VegaPrimeApp ->m. Mouse_y =GET_ Y LPARAM(IParam);case WM_ RBUTTONDOWN//鼠标右键按下::PostMessage (vrWin- ->getParent0.WM _RBUT-/打开视点鼠标操作,恢复默认操作TONDOWN,wParam,lParam);vpObserver* observer =vpObserv-er:find'myObserver* );case WM_ LBUTTONDOWN: /鼠标左键释放if(observer)if(p VegaPrimeApp)able( true );ρ_ VegaPrimeApp ->b_ _LButtonDown =中国煤化工true//服标按下标志p _VegaPrimeApp - >m_ _Mouse. x =MYHCNMHG68,。 2010.15电脑螭程枝巧与维护,图形图像处理....RA.HICS AND IMAGE PCE...S..............................................int mouse_ x,mouse. Y;break;mouse X=m. Mouse. x;mouse. _y=m_ _Mouse. Y;case WM. SIE//窗口尺寸变化//如果鼠标在左边热区,则视点左转if(m_ Navigation.sInL eft(mouse_ x,mouse. y)case WM_ MOUSEMOVE://鼠标移动vpObserver* observer=vpObsererfindC_ VegaPrimeApp * P_ VegaPrimeApp=pApp;('myObserver' ); .if(p. _VegaPrimeApp)iflobserver)if(lp_ VegaPrimeApp- ->m_ Nvigation.lslnUpl-.. Idouble x,ry,r;p_ .VegaPrimeApp- ->m_ Navigation.lslnDow...) |observer- >getRotate( &rx, &ry, &n );p_ VegaPrimeApp ->m. Naigain.slnLef-... |rx+=0.50;P_ VegaPrimeApp ->m_ Navigation.IsInRightobserver->setRotate( x,ry, rz );(|p_ VegaPrimeApp->m _Navigation.IsInZoomln(--)|//如果鼠标在右边热区,则视点右转p_VegaPrimeApp->m. Navigation.IsIn-if(m_ Navigation.IsInRightmouse. x.mouse. _y)Zoomou(.- )vpObserver* observer =vpObervr:find ('myOb-:SetCursor (:LoadCursor (NULLIDC_ HANDI); server' );//鼠标改变为手形ifobserver)elsedouble rx,y,rz;observer- >getRotate( &nx, &ry, &rz );:StCursr(:LoadCursorINULLIDC_ ARROW);nx-=0.50;//鼠标改变为箭形observer->setRotate( x,ry, [2 );p_VegaPrimeApp- ->b, LButtonDown=false;}/如果鼠标在上:边热区,则视点方向上转if(m_ Navigation.lslnUplmouse. x,mouse. _y))break; .vpObserver* observer=vpObserver:find//处理完消息之后,须调用默认的消息处理过程("'myObserver* ); .returnvrWindow:defaultMicrosoftMessageHandlerif(observer)(wrWin, hwnd, uMsg, .);double x,y,z;4.2执行功能observer- ->getRotate( &ux, &ry, &rz );ry+=0.50;根据鼠标状态和所在热区位置,执行用户定义功能,可根observer->setRotate( rx, rγ, rz);据用户的需要进行功能定制。void ProcessNavigation)//如果鼠标在下边热区,则视点方向下转iflb_ LButtonDown)if(m_ Navigation.lsInDown(mouse_x,mouse. _y))vpWindow* window=*vpWindow:begin0;if(window)vpObserver* observer =vpObserver:find ('myOb-RECT rect;server中国煤化工GetClientRectlwindow >etWindowl,&ret:/口尺寸YHCNMHG2010.15 ? 69/陆编程技巧与雄护、实用第一智慧密集double nx.ry,rz;observer- >getRotate( &rx. &ry, &rz );ry-=0.50;observer- ->setRotate( rx, ry, r);//如果鼠标在放大热区,视点升高if (m_ Navigation.lslnZoomln (mouse. x,mouse_ _y))vpObserver* observer=vpObserver:find('myObserver* );iflobserver)(a)double x,y,z;observer- ->getTranslate( &x, &y, &z );observer- ->setTranslate(x. y, z+2 );/如果鼠标在缩小热区,视点降低if (m_ Navigation.lsinZoomOut (mouse. xmouse. _y))vpObserver* observer=vpObserver:ind("myObserver' );if(observer)(b)double x,Y,Z;图4运行效果圉double height=0;参考文献getHeightx,y,z,height;//当前点离地而高度if (-OBSERVER. HOIST, DE-1. ht://mpik.og/demo/.n2. MuliGen- Paradigm Inc Vega Prime Programmer' s Guide VerBASE_ SETP>=height)observer->setTranslate(x. y, z-2);2.0 [M] . MuliGen- Paradigm lne,2005.else3. William ford, William topp.数据结构C++语言描述.清华observer- >setTranslate(x, y, height );大学出版社,1998.(收稿日期: 2010-06-11)}5结语以一个的完整实例介绍了导航工具开发实现技术。系统编译运行需要Microsoft Visual C++ .NET和Vega Prime2.01,导航工具在其他方面的应用与此类似,稍加修改即可用于其他方面,系统运行效果如图4所示。稍加扩充,即可在放大缩小热中国煤化工区之间加入可滚动的移动条等。MYHCNMHG(7 20151电瞒端程技巧与维护

论文截图
上一条:心说课设计
版权:如无特殊注明,文章转载自网络,侵权请联系cnmhg168#163.com删除!文件均为网友上传,仅供研究和学习使用,务必24小时内删除。