UE4笔记_针对UI的修改以及添加新功能
举例:暴露出ScrollBox里的鼠标按下和抬起事件
首先在Build.cs中添加两个模块
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // Uncomment if you are using Slate UI 2 PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
然后创建一个C++类SNEWScrollBox
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #pragma once 2 3 #include <Widgets/Layout/SScrollBox.h> 4 5 DECLARE_DELEGATE(FOnScrollMouseButtonDown); 6 DECLARE_DELEGATE(FOnScrollMouseButtonUp); 7 8 class MYNULL_1_API NEWScrollBox : public SScrollBox 9 { 10 public: 11 virtual FReply OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; 12 virtual FReply OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; 13 14 public: 15 FOnScrollMouseButtonDown OnScrollMouseButtonDown; 16 FOnScrollMouseButtonUp OnScrollMouseButtonUp; 17 };
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include "NEWScrollBox.h" 2 3 FReply NEWScrollBox::OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) 4 { 5 FReply Ret = SScrollBox::OnMouseButtonDown(MyGeometry, MouseEvent); 6 OnScrollMouseButtonDown.ExecuteIfBound(); 7 return Ret; 8 } 9 10 FReply NEWScrollBox::OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) 11 { 12 FReply Ret = SScrollBox::OnMouseButtonUp(MyGeometry,MouseEvent); 13 OnScrollMouseButtonUp.ExecuteIfBound(); 14 return Ret; 15 }
这里只是为了重写Slate中的按键事件函数,然后在其中添加单播事件
然后创建继承UScrollBox的一个U类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #pragma once 2 3 //#include "CoreMinimal.h" 4 #include "UMG/Public/Components/ScrollBox.h" 5 #include "DJWScrollBox.generated.h" 6 7 DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnScrollMouseButtonDownEvent); 8 DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnScrollMouseButtonUpEvent); 9 10 UCLASS() 11 class MYNULL_1_API UDJWScrollBox : public UScrollBox 12 { 13 GENERATED_UCLASS_BODY() 14 public: 15 UPROPERTY(BlueprintAssignable, Category = "Button|Event") 16 FOnScrollMouseButtonDownEvent OnScrollMouseButtonDownEvent; 17 UPROPERTY(BlueprintAssignable, Category = "Button|Event") 18 FOnScrollMouseButtonUpEvent OnScrollMouseButtonUpEvent; 19 20 protected: 21 void SlateHandleMouseUp(); 22 void SlateHandleMouseDown(); 23 24 virtual TSharedRef<SWidget> RebuildWidget() override; 25 };
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include "DJWScrollBox.h" 2 #include "Components/ScrollBoxSlot.h" 3 #include "NEWScrollBox.h" 4 5 UDJWScrollBox::UDJWScrollBox(const FObjectInitializer& ObjectInitializer) 6 : Super(ObjectInitializer) 7 {} 8 9 void UDJWScrollBox::SlateHandleMouseUp() 10 { 11 OnScrollMouseButtonDownEvent.Broadcast(); 12 } 13 14 void UDJWScrollBox::SlateHandleMouseDown() 15 { 16 OnScrollMouseButtonUpEvent.Broadcast(); 17 } 18 19 TSharedRef<SWidget> UDJWScrollBox::RebuildWidget() 20 { 21 MyScrollBox = SNew(NEWScrollBox) 22 .Style(&WidgetStyle) 23 .ScrollBarStyle(&WidgetBarStyle) 24 .Orientation(Orientation) 25 .ConsumeMouseWheel(ConsumeMouseWheel) 26 .NavigationDestination(NavigationDestination) 27 .NavigationScrollPadding(NavigationScrollPadding) 28 .AnimateWheelScrolling(bAnimateWheelScrolling) 29 .WheelScrollMultiplier(WheelScrollMultiplier) 30 .OnUserScrolled(BIND_UOBJECT_DELEGATE(FOnUserScrolled, SlateHandleUserScrolled)); 31 32 for (UPanelSlot* PanelSlot : Slots) 33 { 34 if (UScrollBoxSlot* TypedSlot = Cast<UScrollBoxSlot>(PanelSlot)) 35 { 36 TypedSlot->Parent = this; 37 TypedSlot->BuildSlot(MyScrollBox.ToSharedRef()); 38 } 39 } 40 NEWScrollBox* NewScroll = static_cast<NEWScrollBox*>(MyScrollBox.Get()); 41 if (NewScroll) 42 { 43 NewScroll->OnScrollMouseButtonDown.BindUObject(this, &UDJWScrollBox::SlateHandleMouseDown); 44 NewScroll->OnScrollMouseButtonUp.BindUObject(this, &UDJWScrollBox::SlateHandleMouseUp); 45 } 46 return MyScrollBox.ToSharedRef(); 47 }
这里重写RebuildWidget() 函数,在构建完成的基础上添加绑定,这样就可以把事件传递成为动态多播
注意:
GENERATED_UCLASS_BODY() 需要手动写构造函数
GENERATED_BODY() 不需要,他会默认给创建构造函数