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()  不需要,他會默認給創建構造函數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM