vb checkbox选中和不选中_UE4 4.23 RetainerBox 选中框位置不正确
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 选中框位置不正确的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 周杰伦官宣7月15日发新专辑冲上热搜!网
- 下一篇: 广东韶关遭遇破纪录暴雨:522.9毫米比