先阅读MyGUI sample 记录并总结
主要内容如下:
1、创建窗口,并相应按钮
2、响应各种事件的详细方法
3、窗口的创建、查找和删除
-------------------------------
创建窗口的skin:
<Child type="Button" skin="WindowCaption" offset = "3 0 -6 30" align = "HStretch Top" name = "Caption"> <Property key="Scale" value = "1 1 0 0"/> </Child>
创建窗口:
MyGUI::WindowPtr window = MyGUI::Gui::getInstance().createWidget<MyGUI::Window>("WindowCSX", x, y, 390, 300, MyGUI::Align::Default, "Overlapped"); window->eventWindowButtonPressed += MyGUI::newDelegate(this, &DemoKeeper::notifyWindowPressed);
动作响应:(函数为啥有2个参数,传参数怎么弄的)
void DemoKeeper::notifyWindowPressed(MyGUI::Window* _widget, const std::string& _name) { MyGUI::WindowPtr window = _widget->castType<MyGUI::Window>(); if (_name == "close") window->destroySmooth(); else if (_name == "minimized") { // hide window and show button in your taskbar } else if (_name == "maximized") { // maximized window } }
应用委托,必须有一个信号。( 特殊窗口已经定义的信号,需要查询说明文档。)
定义事件信号:
/** Event : Mouse button pressed and released.\n signature : void method(MyGUI::Widget* _sender) @param _sender widget that called this event */ EventHandle_WidgetVoid eventMouseButtonClick;
委托函数在相同类中(委托函数中只有一个参数):
class Test { public: void mousePressed(MyGUI::Widget* _widget) { // ... } void main() { MyGUI::Button* button = mGUI->createWidget<MyGUI::Button>("Button", 10, 10, 300, 26, MyGUI::Align::Default, "Main"); button->eventMouseButtonClick = MyGUI::newDelegate(this, &Test::mousePressed); } }
其他还可以:
——委托函数在不同的类中:
button->eventMouseButtonClick = MyGUI::newDelegate(this, &Child::mousePressed);
——委托函数是全局函数:
button->eventMouseButtonClick = MyGUI::newDelegate(mousePressed);
——委托函数是静态函数:
button->eventMouseButtonClick = MyGUI::newDelegate(Test::mousePressed);
一、创建(手动的):
——创建一个没有父窗口的窗口
MyGUI::Gui::getInstance().createWidget<MyGUI::widget_type>("skin_name", x, y, w, h, MyGUI::Align, "layer_name"[, "widget_name"]); MyGUI::Gui::getInstance().createWidgetReal<MyGUI::widget_type>("skin_name", x_r, y_r, w_r, h_r, MyGUI::Align, "layer_name"[, "widget_name"]);
——创建一个有父窗口的窗口
parent_ptr->createWidget<MyGUI::widget_type>("skin_name", x, y, w, h, MyGUI::Align [, "widget_name"]); parent_ptr->createWidgetReal<MyGUI::widget_type>("skin_name", x_r, y_r, w_r, h_r, MyGUI::Align [, "widget_name"]);
其中:
align的值在align table中可以找到。
layer_name 在standard layers.中可以找到。
二、查找
——查找一个窗口(例如按钮)
MyGUI::Button* button = MyGUI::Gui::getInstance().findWidget<MyGUI::Button>("button_name");
——不关心窗口类型的查找
MyGUI::Widget* any_widget = MyGUI::Gui::getInstance().findWidgetT("widget_name");
三、删除窗口
删除窗口需要从widget_ptr中获得的指针,然后代码:
MyGUI::Gui::getInstance().destroyWidget(widget_ptr);
如果没有指针,需要通过窗口名称查找:
MyGUI::Widget* widget = MyGUI::Gui::getInstance().findWidgetT("widget_name"); MyGUI::Gui::getInstance().destroyWidget(widget);