UE4笔记_针对UI的修改以及添加新功能

举例:暴露出ScrollBox里的鼠标按下和抬起事件

首先在Build.cs中添加两个模块

1         // Uncomment if you are using Slate UI
2         PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
View Code

然后创建一个C++类SNEWScrollBox

 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 };
NEWScrollBox.h
 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 }
NEWScrollBox.cpp

这里只是为了重写Slate中的按键事件函数,然后在其中添加单播事件

 

然后创建继承UScrollBox的一个U类

 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 };
DJWScrollBox.h
 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 }
DJWScrollBox.cpp

这里重写RebuildWidget() 函数,在构建完成的基础上添加绑定,这样就可以把事件传递成为动态多播

注意:

GENERATED_UCLASS_BODY() 需要手动写构造函数

GENERATED_BODY()  不需要,他会默认给创建构造函数

 

posted @ 2020-04-17 13:52  小喜蛋7  阅读(852)  评论(0编辑  收藏  举报