zorgg@nudnik
Home / 2007 / 04 / 05 / entry # 231

Immediate Mode GUI

05.04.2007 21:01
Обычно, создание элемента графического пользовательского интерфейса (GUI) — например, кнопки — выглядит, в упрощённом виде, так (псевдокод):


void MyButtPushed();

void OnInit()
{
m_SomeButton = new GuiButton( 10, 10, «Click Me» )
m_SomeButton->SetOnClick( MyButtPushed );
m_Desktop.AddChild( m_SomeButton );
}

void OnRelease()
{
m_Desktop.RemoveChild( m_SomeButton );
delete m_SomeButton;
}

void MyButtPushed()
{
GuiMessageBox( «It hurts.», BUTT_OK );
}

…ну и, кроме этого, где-то на невидимом для нас уровне происходит обновление состояния, отрисовка и т.п. — если GUI организован достаточно хорошо, то это прозрачно для конечного кодера.

Это всё, до определённой меры, здорово, но немного напрягает общим количеством… даже не знаю, как точнее выразиться — скажем, сугубо утилитарного кода. То есть, инициализации, освобождения, привязки событий, и всего такого. В общем, того, чего в идеальном мире быть не должно. В идеальном мире всё выглядит как-то так:

void TheLoop()
{
if ( button( «Push Me», 10, 10 ) )
{
GuiMessageBox( «Ouch!», BUTT_OK );
}
}

Ну, а вот здесь — подборка ссылок на IMGUI — подход, который пытается быть немного ближе к вышеупомянутому идеальному миру.

Понятно, что такая концепция будет накладывать некоторые ограничения на возможности GUI (да и вообще вызывает ряд нехороших вопросов, в особенности в том, что касается реализации) — но почитать, я думаю, будет всё равно интересно. Так, или иначе, а подход имеет право на жизнь — как минимум в rapid prototyping и RAD.

 ::