查看: 2180|回复: 5

如何设置osgWidget::Widget相对于屏幕右下角的位置啊?

[复制链接]

该用户从未签到

发表于 2011-10-2 18:13:11 | 显示全部楼层 |阅读模式
本帖最后由 x_wp 于 2011-10-2 18:51 编辑

用osgWidget来做HUD,将logo图片显示在屏幕右下角,可以通过如下代码来实现:
  1. ……………………
  2. osgWidget::Box boxHUD = new osgWidget::Box( "HUD", osgWidget::Box::HORIZONTAL, true );
  3. osgWidget::Widget logoWidget = new osgWidget::Widget( "Logo", 40.0f, 40.0f );
  4. boxHUD->setAnchorHorizontal( osgWidget::Window::HA_RIGHT );
  5. boxHUD->setAnchorVertical( osgWidget::Window::HA_BOTTOM );
  6. logoWidget->setImage( "Images/osg64.png" );
  7. ……………………
复制代码

这样的确可以将logo放置到屏幕右下角,但我想的是让logo与屏幕右边界和下边界保持一定的距离,于是改为了:
  1. ……………………
  2. osgWidget::Box boxHUD = new osgWidget::Box( "HUD", osgWidget::Box::HORIZONTAL, true );
  3. osgWidget::Widget logoWidget = new osgWidget::Widget( "Logo", 40.0f, 40.0f );
  4. boxHUD->setAnchorHorizontal( osgWidget::Window::HA_RIGHT );
  5. boxHUD->setAnchorVertical( osgWidget::Window::HA_BOTTOM );
  6. boxHUD->setOrigin( 10.0f, 10.0f );
  7. logoWidget->setImage( "Images/osg64.png" );
  8. ……………………
复制代码

可是“boxHUD->setOrigin( 10.0f, 10.0f );”这一句没起作用啊,试了一下,如果不setAnchorHorizontal和setAnchorVertical,这一句就起作用。
请问如何设置osgWidget::Widget相对于屏幕右下角的位置呢?

补充一点:在改变窗口大小的时候希望这个Widget始终位于右下角,并与右下角保持一定的距离。

该用户从未签到

 楼主| 发表于 2011-10-2 20:22:37 | 显示全部楼层
看了一下 src\osgWidget\Window.cpp,在void Window::update()中发现:
  1. …………
  2.     // We only honor ANCHOR requests on topmost Windows, not embedded ones.
  3.     if((_vAnchor != VA_NONE || _hAnchor != HA_NONE) && !_parent && _wm) {
  4.         if(_vAnchor == VA_TOP) y = _wm->getHeight() - _height.current;
  5.         else if(_vAnchor == VA_CENTER) y = osg::round(_wm->getHeight() / 2.0f);
  6.         else if(_vAnchor == VA_BOTTOM) y = 0.0f;

  7.         if(_hAnchor == HA_LEFT) x = 0.0f;
  8.         else if(_hAnchor == HA_CENTER) x = osg::round((_wm->getWidth() - _width.current)/ 2.0f);
  9.         else if(_hAnchor == HA_RIGHT) x = _wm->getWidth() - _width.current + _visibleArea[2];

  10.         xy.set(x, y);
  11.     }
  12. …………
复制代码
可以看到只要设置了_vAnchor或_hAnchor,y或x都被直接计算,而且当设置了VA_BOTTOM或HA_LEFT后,y或x被分别直接设置为0;当然boxHUD->setOrigin( 10.0f, 10.0f );就不会起作用啦!看来得另外想办法了!
个人觉得,如果这里有一个类似于“页边距”的变量就好了,默认设为0,当需要的时候可以按需要设置大小,就可以使Widget与边框保持所需的距离了,这样一来在某些特殊的场合,可以显得美观一点。

该用户从未签到

 楼主| 发表于 2011-10-3 08:59:15 | 显示全部楼层
自己解决了,按照上面的思路,写了一个HUDBox继承自osgWidget::Box,添加float _xMargin, _yMargin两个变量,增加了一个函数setMargin(const float xMargin, const float yMargin)用于设置变量,主要重写了void Window::update()函数,其实也就是把原来的void Window::update()函数复制过来,在楼上的if语句中添加对_xMargin、_yMargin的处理就OK啦。

该用户从未签到

发表于 2011-10-8 12:10:18 | 显示全部楼层
binggo~~~~~~~

该用户从未签到

发表于 2016-4-16 15:01:38 | 显示全部楼层
高手啊。我现在的一个问题是在box中创建widget后,启动应用程序,不显示或者显示不正常。当你拖动一下窗体标题栏或最大化最小化后,widget都显示正常了。汗,不晓得怎么办!

该用户从未签到

发表于 2016-4-16 15:01:42 | 显示全部楼层
高手啊。我现在的一个问题是在box中创建widget后,启动应用程序,不显示或者显示不正常。当你拖动一下窗体标题栏或最大化最小化后,widget都显示正常了。汗,不晓得怎么办!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表