金桥科普  
设为首页 关于我们 邮箱登录
科普聚焦时代科技科普生活科学技术自然科学航空航天科技博览历史考古电脑IT
您现在的位置: 首页 >> 科普频道 >> 电脑游戏 >> 文章详情
OpenGL GUI教程(一)

akinggw inoware 2006-09-11

OpenGL GUI教程(一)

 

作者:Ionware

译者:akinggw

 

欢迎来到我的GUI系列文章的第一篇。我从一个非常高的角度更新了他们,这样是为了便于你喜欢上她并且能很快明白。

她是一个OPENGL GUI,只需要OPENGL去渲染她的组件和建立纹理/材质,但从某种意义上说她并不依赖与OPENGL

 

目录

l        简介

l        类定义和结构

l        画一个东东

l        处理输入

l        下载

 

简介

 

什么是GUI?图形用户界面。正确,还有什么?好的,让我们看一下标准的WINDOWS。她像什么?就像一个带边框,颜色和纹理的简单的多边形。因此,假设我们的GUI也将是一个2D多边形(四边形)。那我们需要怎样做呢?让我们看一下。

 

类定义和结构

 

我们的第一个类,是的,CGUIElement,是其它控制的基础。我们将以后为它添加更多的功能。让我们看一下这个类:

 

class CGUIElement: public CXMLResource,public CdoubleList<CGUIElement *>

{

   CREATOR(CGUI);

   CREATOR(CGUIBorder);

Public:

   CGUIElement();

   Virtual ~CGUIElement();

 

   Virtual void Initialize();

   Virtual int Create(CGUIElement *pParent,tRect WidgetRect,Ctexture *pTexture = NULL,Cmaterial *pMaterial = NULL,bool bBorder = false);

   Virtual int LoadXML(TiXmlNode *pDateNode,Cstring strFilename);

   Virtual int SaveXML(TIXmlNode *pDateNode,Cstring strFilename);

  

   Virtual void Draw();

   Virtual void Destroy();

   Virtual void ProcessMessages();

   Virtual void ProcessMessage(tGUIMessage& Message);

   Virtual int Resize(tRect& NewRect);

   Virtual int OnKeyDown(UINT uiKeyCode);

   Virtual int OnKeyUp(UINT uiKeyCode);

   Virtual int OnMove(UINT x,UINT y);

   Virtual int OnMouseMove(UINT x,UINT y);

   Virtual int OnLMouseDown(UINT x, UINT y);

   Virtual int OnLMouseUp(UINT x, UINT y);

   Virtual int OnRMouseDown(UINT x,UINT y);

   Virtual int OnRMouseUp(UINT x,UINT y);

   UINT GetWidth();

   Void SetWidth(UINT uiWidth);

   UINT GetHeight();

   Void Setheight(UINT uiHeight);

   CGUIElement *GetChild(UINT uiIndex);

   CGUIElement *GetChild(eGUIControlType eWidgetType);

   CGUIElement *GetChild(TiXmlElement *pXMLElement);

   UINT GetChildCount();

   Void RemoveChild(CGUIElement *pChild);

   Void HideSiblings(int iDeep = -1);

   Void ShowSiblings(int iDeep = -1);

   Void SetZOrder(UINT uiZOrder);

   UINT GetZOrder();

   Bool Visible();

   void Hide();

   void Show();

  

   CGUIElement *GetParent();

   Void Setparent(CGUIElement *pParent);

   Void SetTexture(Ctexture *pTexture);

   Ctexture *GetTexture();

   Void SetMaterial(Cmaterial *pMaterial);

   Cmaterial *GetMaterial();

   Void SetTexCoord(UINT uiIndex,float U,float V);

   Tvertex2f& GetTexCoord(UINT index);

   CGUI *GetGUI();

   Void SetRect(tRect& NewRect);

   TRect& GetRect();

   Void SetGUI(CGUI *pGUI);

   EGUIControlType& GetType();

   Void SetType(eGUIControlType eWidgetType);

   Void SetFlag(eGUIFlag eFlag,bool bSet);

   Bool IsFlagSet(eGUIFlag eFlag);

   Bool IsChild(CGUIElement *pElement);

   Bool IsAutoCalc();

   Void SetAutoCalc(bool bAutoCalc);

   Virtual bool IsOfType(eEntityType eType);

   Cstring GetElementType();

      #ifdef GUI_USE_ACTIVE_INACTIVE
  bool IsActive() { return m_bActive; };
  void Activate() { m_bActive = true;};
  void Deactivate() {m_bActive = false;};
#endif
 
protected:
 #ifndef GUI_USE_ACTIVE_INACTIVE
  Cmaterial *m_pMaterial;                  //组件的材质指针
 #elif
  COLORREF m_ActiveColor;                  //材质活动的颜色
  COLORREF m_InactiveColor;                //材质静止的颜色
  Bool m_bActive;                          //材质是活动或静止
 #endif
  //组件的关键参数
  eGUIControlType m_eControlType;          //组件的类型
  bool m_bAutoCalc;                        //自动计算标志:用于很多方面
  CGUIElement *m_pParent;                  //父亲组件
  CGUI *m_pGUI;                            //根GUI
  DWORD m_dwFlags;                        //组件标志
  Ctexture *m_pTexture;                   //组件的纹理指针
  Tvertex2fm_texCoord[4];                 //组件的纹理坐标
  Bool m_bVisible;                        //组件的可视标志

};

 

这段代码显示的结构如下:

http://openglgui.sourceforge.net/images/gui_tut1_img1.jpg

 

是的,这是一个非常大的类,她是我们一切的基础,因此,现在我们看一下她的功能函数。

首先,我们需要初始化一个组件,这个完全可以在构造函数中完成,但是我选择在Initialize()函数中完成她。

正如你所看到的,我们有自己的消息处理类,因此每个类都有自己的消息处理函数ProcessMessages()在每次画的时候处理它,并且寻找与她相关的消息。例如,按下一个按钮后会出现一个下拉菜单,你是否会选择她其中的一个选项。

每个组件也有一个导入/保存函数,但是并不需要每次都重写她。相反,我们使用一个通用的类去保存她的组件参数,然后在根结点时保存整棵树的参数。同样,我们也有自己的键盘/鼠标处理函数。

 

整个GUI的结构如下:

 

http://openglgui.sourceforge.net/images/gui_tut1_img2.jpg

 


  发表评论 写信给编辑 关闭窗口
同栏目内容
· 瑞典在网游中开设虚拟大使馆 2007-06-06
· 魔兽争霸3秘籍(魔兽无敌秘籍) 2007-03-28
· 动画DirectDraw之旅(1) 2006-09-04
· DDraw,DInput编程 2006-09-04
· DirectDraw编程基础 2006-09-04
· 全屏模式 2006-09-04
相关内容
近期主推
西藏发现青藏高原最大冰川群
·西藏发现青藏高原最大冰川群
·中日: "月亮女神"携手"嫦娥"
·行星大碰撞砸死恐龙催生人类
·美研制会飞汽车定价9万美元
·美国教授设计出自适应机器人
·银河系可能有20多个黑洞
近期热门
英海域惊现大龙虾为普通龙虾5倍
·英海域惊现大龙虾为普通龙虾5倍
·新物种金蛙体表有剧毒
·我国嫦娥工程计划测量月球
·精神病药物可治多种癌症
·视觉震撼:来自海底的精灵
·能删除不良记忆的药物诞生
近期焦点
广西发现罕见溶洞钟乳石有30万年
·广西发现罕见溶洞钟乳石有30万年
·澳大利亚惊现“卡布基诺”海滩
·美国"彩色"瀑布夜幕下震撼游人
·地球上究竟有多少个物种
·英国探险家北极游泳破纪录
·世界之最 世上最小的动物
金桥科普是一个公益性栏目,内容由作者提供或摘自互联网,其目的是向广大网民普及科学技术知识。如果您发现本网站转载或摘编了您拥有著作权的作品,请通知我们(电话:023-63659911),我们立即删除。
关于我们 | 网站地图 | 用户注册 | 广告客户 | 招聘信息 | 业务信息
Copyright@2006-2009 JQInfo.com,WONDER. All Rights Reserved
重庆科技咨询中心.重庆网得信息技术有限公司.版权所有
Email:webmaster@jqinfo.com
重庆数据通信局提供网络带宽. 渝ICP备05002327号