OpenGL交互——菜单控制(基础教程)
生活随笔
收集整理的這篇文章主要介紹了
OpenGL交互——菜单控制(基础教程)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
相關單詞:entry有“條目,項目,賬目,詞目,詞條的含義”,一般含義“進入,入口,門口”。
?????????????????????? ??GLUT教程 ?????????????????????????? ?彈出式菜單基礎 彈出式菜單(像點鼠標右鍵出來的菜單那樣的)也是GLUT的一部分,雖然它不能實現我們經常看到的windows系統彈出式菜單的所有的功能,但是它也有很大的作用。給一個程序增加菜單提供了一個比鍵盤更簡單的方法來和程序交互,選擇不同選項,而不用去記那些按鍵。 我們首先要做的是創建菜單,創建菜單函數glutCreateMenu的原型如下: int glutCreateMenu(void (*func)(int value)); 參數: func:為新建的菜單處理菜單事件的函數名。 這個函數的返回值是菜單的標識符(menu identifier)。 我們的程序中,我們可以想加多少菜單就加多少菜單。對每個菜單我們要指定一個回調函數,而且我們可以指定相同的函數。下面為菜單增加一些條目(出來個空菜單也沒什么用)。 使用的函數是glutAddMenuEntry: void glutAddMenuEntry(char *name,int value); 參數: name:菜單名稱的字符串。 value:當你選擇菜單里的一項后,這個值就返回給上面的glutCreateMenu里調用的函數。 這個函數根據函數名來看,就是給菜單里添加條目的,可以一直添加(這里有個順序,自己實驗下就明白了的)。 好了現在有了一個彈出式菜單。但還有最后一件事要做,就是把菜單和一個鼠標鍵連接起來(attach)。因為我們必須指定菜單怎么出現,使用GLUT你可以在按下一個鼠標按鍵后讓菜單顯示,函數是glutAttachMenu: void glutAttachMenu(int button); 參數: button: 一個整數,指定菜單和哪個鼠標鍵關聯起來。 botton 可以去下面的值; GLUT_LEFT_BUTTON GLUT_MIDDLE_BUTTON GLUT_RIGHT_BUTTON 下面就是一個應用了上面所有函數的例子。 ... ... void createGLUTMenus() { ? ???????? int menu; ? ???????? // 創建菜單并告訴GLUT,processMenuEvents處理菜單事件。 ???????? menu = glutCreateMenu(processMenuEvents); ???????? ???????? //給菜單增加條目 ???????? glutAddMenuEntry("Red",RED); ???????? glutAddMenuEntry("Blue",BLUE); ???????? glutAddMenuEntry("Green",GREEN); ???????? glutAddMenuEntry("White",WHITE); ???????? ???????? // 把菜單和鼠標右鍵關聯起來。 ???????? glutAttachMenu(GLUT_RIGHT_BUTTON); } 注意RED,BLUE,GREEN,和WHITE必須定義為整數,再就是你必須為每個選單(菜單里的條目)定義不同的value, 下面我們寫處理菜單事件的函數。我們將使用我們的菜單來設置三角形的顏色。函數如下: void processMenuEvents(int option) { ??????? //option,就是傳遞過來的value的值。 ???????? switch (option) { ???????????????? case RED : ????????????????????????? red = 1.0; ????????????????????????? green = 0.0; ????????????????????????? blue = 0.0; break; ???????????????? case GREEN : ????????????????????????? red = 0.0; ????????????????????????? green = 1.0; ????????????????????????? blue = 0.0; break; ???????????????? case BLUE : ????????????????????????? red = 0.0; ????????????????????????? green = 0.0; ????????????????????????? blue = 1.0; break; ???????????????? case WHITE : ????????????????????????? red = 1.0; ????????????????????????? green = 1.0; ????????????????????????? blue = 1.0; break; ???????? } } 剩下來的就是把我們的createGLUTMenus函數放到main函數里。下面的代碼就是當前的main函數。 void main(int argc, char **argv) { ???????? glutInit(&argc, argv); ???????? glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); ???????? glutInitWindowPosition(100,100); ???????? glutInitWindowSize(320,320); ???????? glutCreateWindow("SnowMen"); ???????? glutDisplayFunc(renderScene); ???????? glutIdleFunc(renderScene); ???????? glutReshapeFunc(changeSize); ? ???????? //調用我們的函數來創建菜單 ???????? createGLUTMenus(); ? ???????? glutMainLoop(); } VC工程可以在這里下載(glut7.zip)。 下面我們還來看兩個函數,第一個允許我們斷開鼠標按鍵和一個菜單的關聯。前面我們用glutAttachMenu來在鼠標和菜單間建立關聯,但我們有時候需要斷開這種關聯。完成這個工作的函數是glutDetachMenu。函數原型如下: void glutDetachMenu(int button); 參數: button:要斷開的鼠標按鍵。 Button的取值和glutAttachMenu一樣。因此,要是我們想斷開關聯我們可以這樣: ... ??????? glutDetachMenu(GLUT_RIGHT_BUTTON); ??????? ... 最后,如果你想恢復被菜單使用了的資源,我們可以銷毀(destroy)它,相應的函數是glutDestroyMenu,它的原型如下: void glutDestroyMenu(int menuIdentifier); 參數: menuIdentifier:要銷毀的菜單的標識符,它必須和函數glutCreateMenu返回的值相同。 好了,到這里你已經知道了基本的在GLUT中建立菜單。 (稍微看下后,再自己看看源代碼,估計就懂了,再自己寫程序時也無意識的用用菜單功能,就基本上會了。??? 那個標識符很重要的,別忘了。 原文地址:http://www.lighthouse3d.com/opengl/glut/index.php?10)總結
以上是生活随笔為你收集整理的OpenGL交互——菜单控制(基础教程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于OPENGL的各个变换的顺序
- 下一篇: OpenGL教程——GLUT初始化