導(dǎo)航工具設(shè)計(jì)
- 期刊名字:電腦編程技巧與維護(hù)
- 文件大?。?01kb
- 論文作者:潛繼成,張文良
- 作者單位:
- 更新時(shí)間:2020-10-30
- 下載次數(shù):次
實(shí)用第一/智慧密集導(dǎo)航工具設(shè)計(jì)潛繼成張文良摘要:以一個(gè)實(shí)例介紹C++在Vega Prime中導(dǎo)航工具的設(shè)計(jì)與實(shí)現(xiàn)。準(zhǔn)備工作包括導(dǎo)航工具位圖準(zhǔn)備、熱區(qū)數(shù)據(jù)定義,通過(guò)導(dǎo)航類、自定義消息處理過(guò)程、熱區(qū)位置判斷、功能執(zhí)行等實(shí)現(xiàn)導(dǎo)航工具所有功能。關(guān)鍵詞:導(dǎo)航工具;位困;熱區(qū)透明的位圖,之所以采用透明位圖主要是為了避免顯示導(dǎo)航工1引言具位圖時(shí)遮蓋了其下面顯示的內(nèi)容,格式可采用PNG格式。.所謂導(dǎo)航工具是指在窗口中顯示、在指定區(qū)域中可響應(yīng)用如圖2 (a)所示。戶操作的圖形交互工具,操作包括圖形滾動(dòng)、縮放、旋轉(zhuǎn)、改變視角等,典型應(yīng)用實(shí)例如圖1所示。導(dǎo)航工具在地圖瀏覽、三維視景等實(shí)際應(yīng)用系統(tǒng)中有廣泛的應(yīng)用。以Vega Prime三維+視景中的導(dǎo)航工具設(shè)計(jì)為例,來(lái)展示導(dǎo)航工具開(kāi)發(fā)技術(shù)。中(叫導(dǎo)航工具位圈(B)然區(qū)尺寸圈2導(dǎo)航工具位圈與熱區(qū)尺寸魯江2.2 熱區(qū)定義導(dǎo)航工具熱區(qū)定義是設(shè)置位圖尺寸、指定熱區(qū)位置和尺寸等,將有關(guān)數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)文件中。例如叮將導(dǎo)航位圖加載到Adobe Photoshop中,打開(kāi)標(biāo)尺,可以查看位圖的尺寸、指定熱區(qū)的位置和尺寸,如圖2 (b)所示,指定AB矩形為熱區(qū),其位置和尺寸可根據(jù)標(biāo)尺查出。定義圖中6個(gè)熱區(qū)的數(shù)據(jù)文件團(tuán)1 導(dǎo)航工具應(yīng)用實(shí)例(單位為像索):2準(zhǔn)備工作853281位圈尺寸(長(zhǎng)、寬)導(dǎo)航工具一般是在位圖上定義幾個(gè)可操縱的區(qū)域,稱之為30 05530 1/左邊熱區(qū)左上角位置、 右下角位置熱區(qū),當(dāng)鼠標(biāo)移動(dòng)到熱區(qū)中時(shí),鼠標(biāo)改變成指定形狀,如手形3055585 右邊熱區(qū)左上角位置、右下角位置0303055 1上邊熱區(qū)左 上角位置、右下角位重(b),表示為可操作的區(qū)域,在該區(qū)城內(nèi)點(diǎn)鼠標(biāo)鍵執(zhí)行用戶定553085 55 /下邊熱區(qū)左上角位置、 右下角位置義的功能。準(zhǔn)備工作主要是進(jìn)行位圖準(zhǔn)備、熱區(qū)定義。中國(guó)煤化工斌、右下角位重2.1 位圖準(zhǔn)備一文量、右下角位重導(dǎo)航工具位圖一般可使用二維繪圖軟件繪制生成,轉(zhuǎn)換成MYH.CNMHGe66電腦墻程技巧與維護(hù)2010. 15圖形圖像處理.....HIC. AND IMAGE eE...N.........................................&myright,&mobottoml/讀上邊熱區(qū)參數(shù)數(shù)據(jù)3程序加載up .eft=myleft:up.top =mytop;up right =myright;up.以上準(zhǔn)備工作完成之后,需要將導(dǎo)航工具和熱區(qū)定義數(shù)據(jù)bottom=mybottom;fscanf (fp,"%d %d % d % dn',&mylef,&mytop,加載到程序中,進(jìn)行鼠標(biāo)是否在熱區(qū)內(nèi)判斷。這些工作由導(dǎo)航&myright,&mybottom); /讀下邊熱區(qū)參數(shù)數(shù)據(jù)類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/讀左邊熱區(qū)參數(shù)數(shù)據(jù)C. Navigation0);//構(gòu)造函數(shù)left.left =myletf,;lf.top =mpytop:lef.right =myright;~C_ Navigation); //析構(gòu)函數(shù)left.bottom=mybottom;fscanf (fp,"%d %d % d % dNn' ,&myleft,&mytop,bool read(const char *fn://讀數(shù)據(jù)文件&myright,&mybottom); /讀右邊熱區(qū)參數(shù)數(shù)據(jù)void SetPos(int x.int y); /設(shè)置位置right.left =myleft:right.top =mytp:gh.right =void SetActualSize(int cx,int cy://實(shí)際尺寸myrigt:right.bottom=mybottom;fscanf (fp,"% d %d % d % dn",&myleft,&mytop,bool IsInUpfint mouse. xint mouse_y);&myright,&mybottom); /讀放大熱區(qū)參數(shù)數(shù)據(jù)//鼠標(biāo)是否在上面熱區(qū)內(nèi)判斷方法zoom_ jn.left=myleft;zoom_ jin.top=moytop:--;bool IsnDownint mouse. x,int mouse. _y);fscanf (fp,"% d %d %d % dn',&myleft,&mytop,//鼠標(biāo)是否在下面熱區(qū)內(nèi)判斷方法&myright,&mybottom); /讀縮小熱區(qū)參數(shù)數(shù)據(jù)bool IsInL eftint mouse. x,int mouse. y);zoom_ out.left=myleft;zoom_ out.top=mytop;/鼠標(biāo)是否在左面熱區(qū)內(nèi)判斷方法fcloselfp://關(guān)閉文件bool IsInRightit mouse x,int mouse. _y);size_ actual.cx= =size.cx;size. _actual.cy=size.cy;/鼠標(biāo)是否在右面熱區(qū)內(nèi)判斷方法return true;bool IsInZoomln(int mouse. x,int mouse. y);/鼠標(biāo)是否在放大熱區(qū)內(nèi)判斷方法return false;bool lsInZoomOut(int mouse_ x,int mouse. _y);/鼠標(biāo)是否在縮小熱區(qū)內(nèi)判斷方法3.2 進(jìn)行鼠標(biāo)是否在熱區(qū)內(nèi)判斷以鼠標(biāo)是否在上邊熱區(qū)判斷為例,來(lái)說(shuō)明判斷方法。SIZE size;//位圖尺寸bool C. Navigation:lsInUp(int mouse. x,int mouse_ .y)SIZE size. _actual; 實(shí)際顯示的尺寸int pos_ x,pos. _Y; /顯示位置1/判斷鼠標(biāo)是否在熱區(qū)的矩形區(qū)域內(nèi)RECT up;//上面熱區(qū)矩形區(qū)域定義if (mouse. x-pos. x> =up.left && mouse x- pos. X<=up.RECT down; //. 上面熱區(qū)矩形區(qū)域定義right && ..RECT left; //左 面熱區(qū)矩形區(qū)域定義return tre//在矩形區(qū)域內(nèi),則返回真RECT right; /右 面熱區(qū)矩形區(qū)域定義else return false://不在矩形區(qū)域內(nèi),則返回假RECT zoom_ jin; //放大熱區(qū)矩形區(qū)域定義RECT zoom. out;:/縮小熱區(qū)矩形區(qū)城定義3.3 位圖顯示3.1 加載熱區(qū)數(shù)據(jù)將導(dǎo)航位圖作為紋理,以導(dǎo)航工具位圖繪制矩形,因?yàn)槲粓D為透明的,顯示結(jié)果就是透明的導(dǎo)航工具條,以下是以.bool C_ Nvigation:read(const char *fn)OpenGL相關(guān)的雨數(shù)實(shí)現(xiàn)導(dǎo)航工具的繪制。FILE* fp-fopentn,t't:/:/打開(kāi)文件roid DrawNavigation(vrDrawContext *context)ifp)/文件存在nt cx,CY;/設(shè)置垂直投影模式fscanfp,"%d %dn",&cx,&y//讀位圖尺寸vrTransform:ElementProjection projectionElement;size.cx=cx;size.cy=cy;中國(guó)煤化工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:電腦編程技巧與維護(hù)201015、" 67>實(shí)用第一/智慧密集Id,&projectionElement);GET. X LPARAMIParam); /存儲(chǔ)鼠標(biāo)位置p_ _VegaPrimeApp ->m_ Mouse. y =//綁定導(dǎo)航位圖作為紋理GET_ Y_ LPARAMIParam);context->setState(m. _vr_ Navigation);/.確定導(dǎo)航工具顯示位置和尺寸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繪制導(dǎo)航位圖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/如果鼠標(biāo)在導(dǎo)航工具條的熱區(qū)內(nèi),則關(guān)glTexCoord2f(1.0f, 0.0f);1閉視點(diǎn)鼠標(biāo)操作glVertex2foriginX + width, originY);vpObserver* observer =vpObsev-gITexCoord2f(1.0f, 1.0f;er:find'myObserver' );gVerex2foriginX + width, originY + height;iflobserver)glEnd(;observer ->setStrategyEn-able( false )//如果鼠標(biāo)在熱區(qū)內(nèi),則關(guān)閉視點(diǎn)鼠標(biāo)操作如果在普通窗口中繪制,可采用CDI++繪制位圖的方法,也可實(shí)現(xiàn)透明導(dǎo)航上具條的繪制。4用戶功能break;4.1處理消息case WM_ LBUTTONUP:/鼠標(biāo)左鍵釋放在VegaPrime注冊(cè)自定義消息的處理過(guò)程(微軟消息處理{過(guò)程),以便得到鼠標(biāo)按鍵狀態(tài),判斷鼠標(biāo)如果在熱區(qū)內(nèi),設(shè)iftlp. VegaPrimeApp)置相應(yīng)標(biāo)志。LRES ULT UserMicrosoftMessageHandlerFunc (vrWindowp_ VegaPrimeApp ->b_ LButtonDown =*vrWin, HWND hwnd, UINT uMsg, WPARAM .false; /鼠標(biāo)按下標(biāo)志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//鼠標(biāo)右鍵按下::PostMessage (vrWin- ->getParent0.WM _RBUT-/打開(kāi)視點(diǎn)鼠標(biāo)操作,恢復(fù)默認(rèn)操作TONDOWN,wParam,lParam);vpObserver* observer =vpObserv-er:find'myObserver* );case WM_ LBUTTONDOWN: /鼠標(biāo)左鍵釋放if(observer)if(p VegaPrimeApp)able( true );ρ_ VegaPrimeApp ->b_ _LButtonDown =中國(guó)煤化工true//服標(biāo)按下標(biāo)志p _VegaPrimeApp - >m_ _Mouse. x =MYHCNMHG68,。 2010.15電腦螭程枝巧與維護(hù),圖形圖像處理....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//窗口尺寸變化//如果鼠標(biāo)在左邊熱區(qū),則視點(diǎn)左轉(zhuǎn)if(m_ Navigation.sInL eft(mouse_ x,mouse. y)case WM_ MOUSEMOVE://鼠標(biāo)移動(dòng)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(--)|//如果鼠標(biāo)在右邊熱區(qū),則視點(diǎn)右轉(zhuǎn)p_VegaPrimeApp->m. Navigation.IsIn-if(m_ Navigation.IsInRightmouse. x.mouse. _y)Zoomou(.- )vpObserver* observer =vpObervr:find ('myOb-:SetCursor (:LoadCursor (NULLIDC_ HANDI); server' );//鼠標(biāo)改變?yōu)槭中蝘fobserver)elsedouble rx,y,rz;observer- >getRotate( &nx, &ry, &rz );:StCursr(:LoadCursorINULLIDC_ ARROW);nx-=0.50;//鼠標(biāo)改變?yōu)榧蝟bserver->setRotate( x,ry, [2 );p_VegaPrimeApp- ->b, LButtonDown=false;}/如果鼠標(biāo)在上:邊熱區(qū),則視點(diǎn)方向上轉(zhuǎn)if(m_ Navigation.lslnUplmouse. x,mouse. _y))break; .vpObserver* observer=vpObserver:find//處理完消息之后,須調(diào)用默認(rèn)的消息處理過(guò)程("'myObserver* ); .returnvrWindow:defaultMicrosoftMessageHandlerif(observer)(wrWin, hwnd, uMsg, .);double x,y,z;4.2執(zhí)行功能observer- ->getRotate( &ux, &ry, &rz );ry+=0.50;根據(jù)鼠標(biāo)狀態(tài)和所在熱區(qū)位置,執(zhí)行用戶定義功能,可根observer->setRotate( rx, rγ, rz);據(jù)用戶的需要進(jìn)行功能定制。void ProcessNavigation)//如果鼠標(biāo)在下邊熱區(qū),則視點(diǎn)方向下轉(zhuǎn)iflb_ LButtonDown)if(m_ Navigation.lsInDown(mouse_x,mouse. _y))vpWindow* window=*vpWindow:begin0;if(window)vpObserver* observer =vpObserver:find ('myOb-RECT rect;server中國(guó)煤化工GetClientRectlwindow >etWindowl,&ret:/口尺寸YHCNMHG2010.15 ? 69/陸編程技巧與雄護(hù)、實(shí)用第一智慧密集double nx.ry,rz;observer- >getRotate( &rx. &ry, &rz );ry-=0.50;observer- ->setRotate( rx, ry, r);//如果鼠標(biāo)在放大熱區(qū),視點(diǎn)升高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 );/如果鼠標(biāo)在縮小熱區(qū),視點(diǎn)降低if (m_ Navigation.lsinZoomOut (mouse. xmouse. _y))vpObserver* observer=vpObserver:ind("myObserver' );if(observer)(b)double x,Y,Z;圖4運(yùn)行效果圉double height=0;參考文獻(xiàn)getHeightx,y,z,height;//當(dāng)前點(diǎn)離地而高度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.數(shù)據(jù)結(jié)構(gòu)C++語(yǔ)言描述.清華observer- >setTranslate(x, y, height );大學(xué)出版社,1998.(收稿日期: 2010-06-11)}5結(jié)語(yǔ)以一個(gè)的完整實(shí)例介紹了導(dǎo)航工具開(kāi)發(fā)實(shí)現(xiàn)技術(shù)。系統(tǒng)編譯運(yùn)行需要Microsoft Visual C++ .NET和Vega Prime2.01,導(dǎo)航工具在其他方面的應(yīng)用與此類似,稍加修改即可用于其他方面,系統(tǒng)運(yùn)行效果如圖4所示。稍加擴(kuò)充,即可在放大縮小熱中國(guó)煤化工區(qū)之間加入可滾動(dòng)的移動(dòng)條等。MYHCNMHG(7 20151電瞞端程技巧與維護(hù)
-
C4烯烴制丙烯催化劑 2020-10-30
-
煤基聚乙醇酸技術(shù)進(jìn)展 2020-10-30
-
生物質(zhì)能的應(yīng)用工程 2020-10-30
-
我國(guó)甲醇工業(yè)現(xiàn)狀 2020-10-30
-
石油化工設(shè)備腐蝕與防護(hù)參考書十本免費(fèi)下載,絕版珍藏 2020-10-30
-
四噴嘴水煤漿氣化爐工業(yè)應(yīng)用情況簡(jiǎn)介 2020-10-30
-
Lurgi和ICI低壓甲醇合成工藝比較 2020-10-30
-
甲醇制芳烴研究進(jìn)展 2020-10-30
-
精甲醇及MTO級(jí)甲醇精餾工藝技術(shù)進(jìn)展 2020-10-30





