如何在ExampleGUIStyle中使用CL_InputDialog?
在这里首先要说说CL_InputDialog用的是Window的style,而Window主要有两部分组成:
1>title bar :是存在于window pos中的子控件,位置可以设置,一般放在与Window控件(0,0)的位置
2>client window :是用于放置其它控件的子控件,一般不显视.
假如你的介面是使用ExampleGUIStyle中的代码修改过来的话,你可能会碰到下面的问题:
1.在使用InputDialog时候,Window边框很大
原因:因为在使用CL_InputDialog的时候,这个Dialog Window会重新设置Window Size,而这个时候该Dialog Window中的
Client Window(即get_client_area())并没有初始化,其值会很大.(它的初始化在默认的ExampleGUIStyle是在first_paint中进行的)
因为Client Window很大,所以看起来整个InputDialog就变得过大了.
解决方法:在CL_Window_ZZ中加入on_resize事件,并在其中设置client window的大小.
我这里的处理过程是:计算出Window Title 的大小,然后重新设置title上的button,并根据该window的size计算出client window 的size
总不能比实际的window要大吧.
2.在使用InputDialog时候,Inputbox 显视不正常
原因:因为CL_InputBox_ZZ中没有sig_get_preferred_size的事件,即没有默认的长与宽.因此长度虽然确定了,但高度默认还是零.
解决方法:在CL_InputBox_ZZ中添加sig_get_preferred_size事件,并将其默认高度设为比字体高度稍微高一些.
3.InputDialog中的控件对象添加在Window Title部分而不是在Window Client部分。
原因:在CL_Window_ZZ中的on_paint->first_paint中进新了Window控件的部分初始化,而这部分代码更改了client window的位置,
并且这个位置是以rc_main为基准的.因此尽管我们在on_resize重新设置了其client size,但在这里又失效了.
下面是部分代码:
//code start
window->get_client_area()->set_position(CL_Rect(rc_main.left, rc_main.top,
window->get_width(), window->get_height()));
first_paint = false;
//code end
解决方法:删除first_paint 中的代码,并把close button的位置设定也放在on_resize中.
其实ExampleGUIStyle中的代码相应于ClanLib中默认的GUI风格 GUIStyleSilver是经过极大简化的.
从CL_Window_ZZ中的部分初始化竟然是在on_paint中可以见到。