visualfc

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  42 随笔 :: 0 文章 :: 119 评论 :: 0 Trackbacks
为了测试一下GUI自动排版,照着自己的手机做了一个GUI程序界面。特此发图以留纪念。

posted on 2009-09-17 22:29 visualfc 阅读(2384) 评论(10)  编辑 收藏 引用

评论

# re: 测试GUI自动排版,发图纪念。 2009-09-17 23:45 diverger
博主说的自动排版是指类型于QT或者wxWidgets的layout的功能吗?  回复  更多评论
  

# re: 测试GUI自动排版,发图纪念。[未登录] 2009-09-18 08:17 visualfc
是的,使用了相似的layout功能来完成。  回复  更多评论
  

# re: 测试GUI自动排版,发图纪念。 2009-09-18 10:02 codespy
博主能否介绍下布局的原理呢?  回复  更多评论
  

# re: 测试GUI自动排版,发图纪念。[未登录] 2009-09-18 12:18 visualfc
如果详细讲,恐怕不只一篇文章能讲得完,在这里仅简单介绍一下实现原理。
图中的布局仅使用boxlayout来完成,如果配合space可以完成更多控制。
这个布局控制与QT和WX有所不同,其子窗口由父窗口管理,layout仅具备算法功能,因此理论上可以对窗口任意切换layout。

//代码原理如下
class xwnd
{
xwnd* first;xwnd* last;xwnd* prev;xwnd*next;
xlayout* layout;
//调用排版功能
void layout()
{
if (_layout)
_layout->layout(this);
for (xwindow* child = _first; child; child = child->_next)
{
child->layout();
}
}
};
class xwindow : xwnd;
class xframe : xwindow;
class xspace : xwindow;不生成实际的窗口,只是一个占位。

//示例如下:
xframe* frame = new xframe(_T("TEST")); //框架
frame->set_layout(xboxlayout(true));//设置HORZ_BOX
new xedit(frame,LAYOUT_FILL,xsize(100,100)); //左面的EDIT窗口
xwindow* right = new xwindow(frame); //右面的窗口做为容器
right->setlayout(xboxlayout(false)); //设置VERT_BOX
new xspace(right,LAYOUT_FILL_Y); //促使OK和CANCEL按钮置于最下
new xbutton(right,_T("OK"));
new xbutton(right,_T("Cancel"));

frame->create(); //最后生成框架窗口并显示


  回复  更多评论
  

# re: 测试GUI自动排版,发图纪念。 2009-09-20 21:47 codespy
主要的布局有两种,一种是一维的(水平盒子,垂直盒子),另一种是二维的(网格布局)。此图上的键盘布局是二维的,难道是用一维布局组合的吗?

对于“这个布局控制与QT和WX有所不同,其子窗口由父窗口管理,。。。”,
这个与Qt相同。  回复  更多评论
  

# re: 测试GUI自动排版,发图纪念。 2009-09-20 21:49 codespy
补充一下,有两张图片看不到(显示的是两个红叉)!  回复  更多评论
  

# re: 测试GUI自动排版,发图纪念。[未登录] 2009-09-21 08:01 visualfc
@codespy
我的表达可能不太准确,“这个布局控制与QT和WX有所不同,其子窗口由父窗口管理,。。。” 这段话指的是在WX和QT中使用的是 Lyaout->addWidget(child)的形式,而在此布局中则由 new child(parent)的方式来指定。
为了试验布局是否准确,此例中的键盘布局使用的也是hbox和vbox的组合。即将键盘grid看成是一个vbox和四个hbox组合。  回复  更多评论
  

# re: 测试GUI自动排版,发图纪念。[未登录] 2009-09-21 08:07 visualfc
两张图片看不到是因为原来文件名为phone..png,结果编辑时不认,又重传的phone.png。现已修正。  回复  更多评论
  

# re: 测试GUI自动排版,发图纪念。 2009-09-22 13:08 codespy
@visualfc
在Qt中布局对象没有子部件的所有权(ownership),子部件的所有权仍然归父部件。也就是说,销毁布局并不会销毁布局所管理的子部件。
对于实现二维布局算法,俺没有找到好的参考资料(估计各家的实现都不一样), 现在还没什么思路。看到博主的图片后很兴奋!不过,有的布局用一维布局组合的话会使用户的代码显得混乱,甚至组合不出来(比如类似德国纳粹标志)。  回复  更多评论
  

# re: 测试GUI自动排版,发图纪念。[未登录] 2009-09-22 13:52 visualfc
@codespy
是这样的,本质上一样,只是不同的实现方式而已。
可能的话加我gmail。visualfc at gmail.com  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理