IMGUI学习总结

来源:互联网 发布:淘宝信用值达到多少 编辑:程序博客网 时间:2024/06/07 16:11

1.GUI实现方式介绍:

目前流行的GUI有两种:RMGUI和IMGUI, RMGUI即Retained Mode GUI,代表有MFC,它的每个控件都有一个类,需要新控件时,实例化一个对象即可;IMGUI即Immediate Mode GUI,它的每个控件是个函数,非常简单,适用于游戏和其它实时帧应用程序。

1.1 RMGUI和IMGUI的实现原理:

a)在RMGUI中,应用只负责搭建场景,图形库负责定义场景元素更新场景元素绘制场景元素,保有场景元素的模型


(图1,RMGUI)

b)在IMGUI中需要定义场景元素更新场景元素搭建场景,图形库只负责绘制场景元素。


(图2,IMGUI)

图片摘自:https://msdn.microsoft.com/en-us/library/windows/desktop/ff684178(v=vs.85).aspx


2.IMGUI的一般用法

在IMGUI中每个控件都是一个函数,函数参数至少有控件ID,控件的左上角坐标。函数返回值一般为控件是否被点击。

if(button(GEN_ID, 10,20)){    button_was_pressed();}


3.IMGUI实现

3.1 控件绘制架构

每个控件都是一个函数,需要哪个控件就调用哪个函数。

和控件渲染相关的三个函数:imgui_prepare, imgui_render, imgui_finish。

a) imgui_prepare负责控件绘制前处理,清空状态。

b) imgui_render负责调用各控件函数生成控件,并对控件的点击做处理。

c)  imgui_finish负责响应一些事件。

这三个函数依次在render中调用,实现代码如下:

imgui_render(){    button(2,50,50);      if (button(4,150,150))       exit(0);}void render(){    imgui_prepare();    imgui_render();    imgui_finish();}

3.2 编写控件函数

每个控件函数至少需要完成3个任务:

a) 绘制控件

b) 事件处理

c) 状态切换

摘自:http://sol.gfxile.net/imgui/ch03.htmlint button(int id, int x, int y){  // 事件处理  if (regionhit(x, y, 64, 48))  {    uistate.hotitem = id;    if (uistate.activeitem == 0 && uistate.mousedown)      uistate.activeitem = id;  }  // 绘制  drawrect(x+8, y+8, 64, 48, 0);  // 状态切换  if (uistate.hotitem == id)  {    if (uistate.activeitem == id)    {      // Button is both 'hot' and 'active'      drawrect(x+2, y+2, 64, 48, 0xffffff);    }    else    {      // Button is merely 'hot'      drawrect(x, y, 64, 48, 0xffffff);    }  }  else  {        drawrect(x, y, 64, 48, 0xaaaaaa);  }  // If button is hot and active, but mouse button is not  // 状态判断  if (uistate.mousedown == 0 &&     uistate.hotitem == id &&     uistate.activeitem == id)    return 1;  // Otherwise, no clicky.  return 0;}


0 0