首頁>技術>

注意:GitHub上提供了完整的示例專案,網址為:https://github.com/DevExpress-Examples/how-to-display-a-custom-button-on-an-overlay-form

概述

Overlay Form是一個半透明的啟動螢幕,他在後臺執行緒中執行並覆蓋控制元件或表單來防止對其進行訪問,Overlay Form僅包含一個等待指示器。

本示例演示如何顯示:

等待指示器下方的百分比標籤;一個自定義按鈕,該按鈕終止已處理的任務並關閉Overlay Form。實現細節

您可以按以下方式自定義Overlay Form圖形:

從OverlayWindowPainterBase類繼承它;重寫Draw方法;將建立的物件作為引數傳遞給SplashScreenManager.ShowOverlayForm方法。

本示例使用OverlayImagePainter和OverlayTextPainter物件(OverlayWindowPainterBase後代),它們實現了影象和文字的繪製邏輯,並且您可以使用它們的屬性來自定義影象和文字。

OverlayImagePainter物件在Overlay Form的頂部中心繪製一個自定義影象,並處理該影象上的單擊。 您可以指定以下屬性:

Image - 正常狀態下的影象;HoverImage - 處於懸停狀態的圖片;ClickAction - 單擊影象時執行的操作。

OverlayTextPainter物件在等待指示器下方繪製一個自定義標籤,您可以指定以下屬性:

Text - 標籤文字;Font - 文字字型(預設使用Tahoma,18);Color - 文字顏色(預設為黑色)。

OverlayWindowCompositePainter物件在OverlayImagePainter和OverlayTextPainter物件中組成繪圖邏輯,該複合繪製器作為引數傳遞給SplashScreenManager.ShowOverlayForm方法。

顯示Overlay Form時執行的操作是使用.Net Framework類庫(任務並行庫(TPL))中可用的可取消任務來實現的。

OverlayTextPainter.CalcTextBounds — 返回一個矩形,該矩形指定標籤的位置;OverlayImagePainter.CalcImageBounds — 返回一個矩形,它指定按鈕的位置。

每次需要重新繪製疊加表單時(例如,當用戶調整重疊控制元件的大小時),都會呼叫這些方法,drawArgs方法引數包含繪製覆蓋圖所需的資訊。本示例使用以下屬性:

C#

using DevExpress.Utils.Extensions;using DevExpress.XtraSplashScreen;class OverlayImagePainterEx : OverlayImagePainter {public OverlayImagePainterEx(Image image, Image hoverImage = null, Action clickAction = null) : base(image, hoverImage, clickAction) { }protected override Rectangle CalcImageBounds(OverlayLayeredWindowObjectInfoArgs drawArgs) {int indent = 10;return Image.Size.AlignWith(drawArgs.Bounds).WithY(indent).WithX(drawArgs.Bounds.Width - Image.Height - indent);}}class OverlayTextPainterEx: OverlayTextPainter {protected override Rectangle CalcTextBounds(OverlayLayeredWindowObjectInfoArgs drawArgs) {Size textSz = CalcTextSize(drawArgs);return textSz.AlignWith(drawArgs.Bounds).WithY(drawArgs.ImageBounds.Top - textSz.Height);}}public partial class Form1 : RibbonForm {//..OverlayTextPainter overlayLabel;OverlayImagePainter overlayButton;public Form1() {//...this.overlayLabel = new OverlayTextPainterEx();this.overlayButton = new OverlayImagePainterEx(buttonImage, hotButtonImage, OnCancelButtonClick);InitializeComponent();}async void OnRunTaskItemClick(object sender, ItemClickEventArgs e) {//...//Pass the created descendants to the SplashScreenManager.ShowOverlayForm method.IOverlaySplashScreenHandle overlayHandle = SplashScreenManager.ShowOverlayForm(contentPanel, customPainter: new OverlayWindowCompositePainter(overlayLabel, overlayButton));//...}}

VB.NET

Imports DevExpress.XtraSplashScreenImports DevExpress.Utils.ExtensionsFriend Class OverlayImagePainterExInherits OverlayImagePainterPublic Sub New(ByVal image As Image, Optional ByVal hoverImage As Image = Nothing, Optional ByVal clickAction As Action = Nothing)MyBase.New(image, hoverImage, clickAction)End SubProtected Overrides Function CalcImageBounds(ByVal drawArgs As OverlayLayeredWindowObjectInfoArgs) As RectangleDim indent As Integer = 10Return Image.Size.AlignWith(drawArgs.Bounds).WithY(indent).WithX(drawArgs.Bounds.Width - Image.Height - indent)End FunctionEnd ClassFriend Class OverlayTextPainterExInherits OverlayTextPainterProtected Overrides Function CalcTextBounds(ByVal drawArgs As OverlayLayeredWindowObjectInfoArgs) As RectangleDim textSz As Size = CalcTextSize(drawArgs)Return textSz.AlignWith(drawArgs.Bounds).WithY(drawArgs.ImageBounds.Top - textSz.Height)End FunctionEnd ClassPartial Public Class Form1Inherits RibbonForm'...Private overlayLabel As OverlayTextPainterPrivate overlayButton As OverlayImagePainterPublic Sub New()'...Me.overlayLabel = New OverlayTextPainterEx()Me.overlayButton = New OverlayImagePainterEx(buttonImage, hotButtonImage, AddressOf OnCancelButtonClick)InitializeComponent()End SubPrivate Async Sub OnRunTaskItemClick(ByVal sender As Object, ByVal e As ItemClickEventArgs) Handles biRunTask.ItemClick'...'Pass the created descendants to the SplashScreenManager.ShowOverlayForm method.Dim overlayHandle As IOverlaySplashScreenHandle = SplashScreenManager.ShowOverlayForm(contentPanel, customPainter:=New OverlayWindowCompositePainter(overlayLabel, overlayButton))'...End Sub

下圖說明了生成的佈局。

14
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • LeetCode7.翻轉整數-C語言與python的異同點