Bug表现

在UE4 4.23版本,实现自定义控件时,继承了RetainerBox,发现当内部包裹子控件时,先编辑器面板选中子物体,发现选中位置有偏移。

位置偏移
当窗口缩放时,选中框位置

发现当窗口最小化时,偏移位置更加明显,感觉这个选中框跟整个window的位置有关了。

定位问题

使用UE4工具“控件反射器”,定位到UI编辑器页面是在源码"SDesignerView.cpp"中

查找头文件,发现有个关键函数“DrawSelectionAndHoverOutline”此函数就是画出Slate控件选中边框的关键函数。

看看此函数具体实现为:

对选中SelectedSlateWidget,

调用“FDesignTimeUtils::GetArrangedWidgetRelativeToWindow(Widget, ArrangedWidget)”

然后生成SelectionGeometry,并根据此Geometry生成SelectionZone也就是选中框范围,根据SelectionZone的4个顶点调用FSlateDrawElement::Makelines画出选中控件的边缘框。

推测是原因Widget的Geometry错误。 FDesignTimeUtils::GetArrangedWidgetRelativeToWindow此函数的计算方法不对,导致返回的Geometry有误差。

跟踪此方法:

GetArrangedWidgetRelativeToWindow作用是,通过传入的Widget通过FindWidgetWindow找到它的最上层WidgetWindow,然后通过最上层window计算传入Widget的Geometry。

通过断点调试,CanvasPanel和RetainerBox子物体选中时函数执行状况。发现问题:

正确的Window
错误的Window

正确的情况下,FindWidgetWindow会找到传入Widget的最外层Window,但是在RetainerBox中,它返回了一个SVirtualWindow,它是SRetainerWidget内部的Window,并非最外层Window,导致计算的Geometry出错了

修改方法

修改"DesignTimeUtils.cpp"中的GetArrangedWidgetRelativeToWindow方法,根据传入的Widegt,循环找到最外层的正确方法,如下

修改方法

在38行,增加一个循环找到最外层Window的方法,赋值给WidegetWindow。修改后RetainerBox的选中框能正确显示了

后续

在UE4官方GitHub源码库中了解到,之前也有其他开发者报告了此问题,后续官方会在4.24中修复,官方会用一个更好的方法进行修复。

https://github.com/EpicGames/UnrealEngine/pull/6402

RetainerBox DrawSelectionAndHoverOutline SelectionZone Incorrect in DesignerView

vb checkbox选中和不选中_UE4 4.23 RetainerBox 选中框位置不正确相关推荐

  1. jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中

    例:将多个选中的checkbox的值组装成一个字符串 <script type=text/javascript> function addMem(){ //var followers = ...

  2. jquery radio取值,checkbox取值,select取值,radio选中,

    jquery radio取值,checkbox取值,select取值,radio选中, var item = $('input[@name=items][@checked]').val(); 获取se ...

  3. javascript 获取光标所选中的内容并插入到另一个文本框中(兼容ie和ff)

    项目中正好用到 做下笔记方便以后查找 ie获取光标的位置使用document.selection.createRange() 火狐下使用document.getElementById(id).sele ...

  4. vue.js 默认选中select_vue select二级联动第二级默认选中第一个option值的实例

    当二级联动比如选择国家的时候,希望选中一个国家的时候后面城市默认选中第一个城市,则给国家的select加一个@change事件就可以了 所在区域 {{item.country}} {{item}} d ...

  5. jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关...

    http://www.cnblogs.com/xlfj521/archive/2008/01/29/1057375.html 获取一组radio被选中项的值 var item = $('input[@ ...

  6. react antd Table 选中某一行,其它行也被选中了

    问题描述: 使用react_antd_design 中的Table组件,渲染的结果如下: 但是现在出现的问题是当我选中其中的一行,其他的行也变成了选中的状态,无法实现选中单行 这当然不是我们想要的结果 ...

  7. vue.js 默认选中select_vue.js 解决v-model让select默认选中不生效的问题

    笔者今天在开发中遇到一个看起来很神奇的问题,平时编辑的页面我们select下拉选框利用vue.js 的v-model来实现自动选中,今天无论如何都选不中,后来经过很久的复查和大神的一句话终于解决这个这 ...

  8. php 判断radio选中哪个,jquery如何判断单选按钮radio是否选中

    jquery判断单选按钮radio是否选中的方法:1.加载页面的时候获取id,代码为[var fs=$("#"+id).val()]:2.点击按钮的时候获取id,代码为[var i ...

  9. html select设置不选中的值,如何定义 select 默认不选中任何值

    http://www.cnblogs.com/greatverve/archive/2010/02/03/1662565.html 本来以为jQuery("#select1").v ...

最新文章

  1. Java程序员月薪20k的涨薪秘籍:培训班java找不到工作
  2. 华北水利水电大学计算机研究生调剂,2018年华北水利水电大学硕士研究生相关专业接受调剂公告...
  3. Linux安装Oracle11G
  4. HALCON示例程序crystal.hdev通过局部阈值处理和区域处理提取六角形晶体
  5. order by 影响效率么_提升开发效率N倍的20+命令行神器
  6. android cpu负载 工具,计算Android中进程的CPU使用率
  7. Python 爬虫---(6) beautifulSoup 库的使用
  8. 机器学习从入门到进阶✅
  9. linux 之学习路线
  10. Cisco Webex share screen 显示黑屏解决方法
  11. 3.5mm 音频接口类型说明
  12. coreldraw怎么改成半圆形_cdr怎么把图形修剪成指定的形状?
  13. c语言编写用户注册程序,如何用c实现登录和注册的程序?
  14. python爬取b站视频封面_我发现这个up封面确实有点东西,爬取B站视频的封面图片...
  15. 小米下拉导航栏,36kr 下拉导航栏解决方法
  16. Image Pro Plus6进行荧光分析与荧光照片合成学习笔记
  17. 服务器怎么设置自动连接wifi,笔记本无线网络连接IP地址设置(自动获取IP)
  18. 普林斯顿算法课Part2第四周作业_Boggle
  19. 瑞幸创造VC圈神话,风暴中的OYO回应,企鹅杏仁集团完成2.5亿美元融资...
  20. 均匀分布的均值及方差

热门文章

  1. 神盾局特工第四季/全集Agents Of SHIELD迅雷下载
  2. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
  3. C#中yield return用法
  4. jQuery介绍 DOM对象和jQuery对象的转换与区别
  5. PHP中的正则表达式函数preg_
  6. Delphi 对象的创建(create)与释放(free/destory)
  7. 程序员九重镜界,很老的今天刚刚翻出来
  8. [Leetcode][第99题][JAVA][恢复二叉搜索树][中序遍历]
  9. ionic android 本地存储,ionic2/3本地数据存储storage
  10. 如何去掉文章里的非关键词c++_B2B/B2C网站:文章标题如何写才能促进搜索排名...