첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ SplashScreenManager 클래스 : ShowOverlayForm 정적 메소드를 사용해 오버레이 폼에 커스텀 버튼 표시하기

------------------------------------------------------------------------------------------------------------------------


TestProject.zip


ImageHelper.cs

 

 

using System.Drawing;

 

using DevExpress.LookAndFeel;

using DevExpress.Skins;

using DevExpress.Utils;

using DevExpress.Utils.Drawing;

using DevExpress.Utils.Svg;

 

namespace TestProject

{

    /// <summary>

    /// 이미지 헬퍼

    /// </summary>

    public static class ImageHelper

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Public

 

        #region 이미지 생성하기 - CreateImage(imageByteArray, skinProvider)

 

        /// <summary>

        /// 이미지 생성하기

        /// </summary>

        /// <param name="imageByteArray">이미지 바이트 배열</param>

        /// <param name="skinProvider">스킨 제공자</param>

        /// <returns>이미지</returns>

        public static Image CreateImage(byte[] imageByteArray, ISkinProvider skinProvider = null)

        {

            SvgBitmap svgBitmap = new SvgBitmap(imageByteArray);

 

            return svgBitmap.Render

            (

                SvgPaletteHelper.GetSvgPalette(skinProvider ?? UserLookAndFeel.Default, ObjectState.Normal),

                ScaleUtils.GetScaleFactor().Height

            );

        }

 

        #endregion

    }

}

 

 

TaskHelper.cs

 

 

using System;

using System.Threading;

using System.Threading.Tasks;

 

namespace TestProject

{

    /// <summary>

    /// 작업 헬퍼

    /// </summary>

    public class TaskHelper : IDisposable

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field

        ////////////////////////////////////////////////////////////////////////////////////////// Private

 

        #region Field

 

        /// <summary>

        /// 취소 토큰 소스

        /// </summary>

        private CancellationTokenSource cancellationTokenSource;

 

        /// <summary>

        /// 취소 토큰

        /// </summary>

        private CancellationToken cancellationToken;

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - TaskHelper()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public TaskHelper()

        {

            this.cancellationTokenSource = new CancellationTokenSource();

 

            this.cancellationToken = cancellationTokenSource.Token;

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 시작하기 - Start(progress)

 

        /// <summary>

        /// 시작하기

        /// </summary>

        /// <param name="progress">진행 인터페이스</param>

        /// <returns>작업 태스크</returns>

        public Task<string> Start(IProgress<int> progress)

        {

            return StartInternal(progress);

        }

 

        #endregion

        #region 취소하기 - Cancel()

 

        /// <summary>

        /// 취소하기

        /// </summary>

        public void Cancel()

        {

            this.cancellationTokenSource.Cancel();

        }

 

        #endregion

 

        #region 리소스 해제하기 - Dispose()

 

        /// <summary>

        /// 리소스 해제하기

        /// </summary>

        public void Dispose()

        {

            Dispose(true);

        }

 

        #endregion

 

        ////////////////////////////////////////////////////////////////////////////////////////// Protected

 

        #region 리소스 해제하기 - Dispose(disposing)

 

        /// <summary>

        /// 리소스 해제하기

        /// </summary>

        /// <param name="disposing">해제 여부</param>

        protected virtual void Dispose(bool disposing)

        {

            if(disposing)

            {

                if(this.cancellationTokenSource != null)

                {

                    this.cancellationTokenSource.Dispose();

                }

            }

 

            this.cancellationTokenSource = null;

        }

 

        #endregion

 

        ////////////////////////////////////////////////////////////////////////////////////////// Private

 

        #region 계산하기 - Calculate(progress)

 

        /// <summary>

        /// 계산하기

        /// </summary>

        /// <param name="progress">진행 인터페이스</param>

        /// <returns>계산 결과</returns>

        private string Calculate(IProgress<int> progress)

        {

            for(int i = 0; i <= 100; i++)

            {

                Thread.Sleep(100);

 

                this.cancellationToken.ThrowIfCancellationRequested();

 

                if(progress != null)

                {

                    progress.Report(i);

                }

            }

 

            return "계산 결과";

        }

 

        #endregion

        #region 시작하기 (내부용) - StartInternal(progress)

 

        /// <summary>

        /// 시작하기 (내부용)

        /// </summary>

        /// <param name="progress">작업 인터페이스</param>

        /// <returns>작업 태스크</returns>

        private Task<string> StartInternal(IProgress<int> progress)

        {

            return Task.Run(() => Calculate(progress), this.cancellationToken);

        }

 

        #endregion

    }

}

 

 

MainForm.cs

 

 

using System;

using System.Drawing;

using System.Threading.Tasks;

 

using DevExpress.XtraBars;

using DevExpress.XtraBars.Ribbon;

using DevExpress.XtraEditors;

using DevExpress.XtraSplashScreen;

 

namespace TestProject

{

    /// <summary>

    /// 메인 폼

    /// </summary>

    public partial class MainForm : RibbonForm

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field

        ////////////////////////////////////////////////////////////////////////////////////////// Private

 

        #region Field

 

        /// <summary>

        /// 취소 버튼 일반 이미지

        /// </summary>

        private Image cancelButtonNormalImage;

 

        /// <summary>

        /// 취소 버튼 활성 이미지

        /// </summary>

        private Image cancelButtonActiveImage;

 

        /// <summary>

        /// 오버레이 텍스트 페인터

        /// </summary>

        private OverlayTextPainter overlayTextPainter;

 

        /// <summary>

        /// 오버레이 이미지 페인터

        /// </summary>

        private OverlayImagePainter overlayImagePainter;

 

        /// <summary>

        /// 작업 헬퍼

        /// </summary>

        private TaskHelper taskHelper;

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - MainForm()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public MainForm()

        {

            InitializeComponent();

 

            this.cancelButtonNormalImage = GetCancelButtonNormalImage();

            this.cancelButtonActiveImage = GetCancelButtonActiveImage();

 

            this.overlayImagePainter = new OverlayImagePainter(this.cancelButtonNormalImage,

                this.cancelButtonActiveImage, ProcessCancelButtonClick);

            this.overlayTextPainter  = new OverlayTextPainter();

 

            this.runTaskBarButtonItem.ItemClick += runTaskButton_ItemClick;

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        //////////////////////////////////////////////////////////////////////////////// Event

 

        #region 작업 실행 버튼 항목 클릭시 처리하기 - runTaskButton_ItemClick(sender, e)

 

        /// <summary>

        /// 작업 실행 버튼 항목 클릭시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private async void runTaskButton_ItemClick(object sender, ItemClickEventArgs e)

        {

            this.runTaskBarButtonItem.Enabled = false;

 

            string taskResult;

 

            IOverlaySplashScreenHandle overlayHandle = SplashScreenManager.ShowOverlayForm

            (

                this.contentPanel,

                customPainter : new OverlayWindowCompositePainter(this.overlayTextPainter, this.overlayImagePainter)

            );

 

            try

            {

                taskResult = await RunTask();

            }

            finally

            {

                SplashScreenManager.CloseOverlayForm(overlayHandle);

 

                this.runTaskBarButtonItem.Enabled = true;

            }

 

            XtraMessageBox.Show(this, taskResult, "작업 결과");

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////// Function

 

        #region 취소 버튼 일반 이미지 구하기 - GetCancelButtonNormalImage()

 

        /// <summary>

        /// 취소 버튼 일반 이미지 구하기

        /// </summary>

        /// <returns>취소 버튼 이미지</returns>

        private Image GetCancelButtonNormalImage()

        {

            return ImageHelper.CreateImage(Properties.Resources.CancelNormal);

        }

 

        #endregion

        #region 취소 버튼 활성 이미지 구하기 - GetCancelButtonActiveImage()

 

        /// <summary>

        /// 취소 버튼 활성 이미지 구하기

        /// </summary>

        /// <returns>활성 취소 버튼 이미지</returns>

        private Image GetCancelButtonActiveImage()

        {

            return ImageHelper.CreateImage(Properties.Resources.CancelActive);

        }

 

        #endregion

 

        #region 취소 버튼 클릭시 처리하기 - ProcessCancelButtonClick()

 

        /// <summary>

        /// 취소 버튼 클릭시 처리하기

        /// </summary>

        private void ProcessCancelButtonClick()

        {

            if(this.taskHelper != null)

            {

                this.taskHelper.Cancel();

            }

        }

 

        #endregion

        #region 진행 상태 변경시 처리하기 - ProcessProgressChanged(value)

 

        /// <summary>

        /// 진행 상태 변경시 처리하기

        /// </summary>

        /// <param name="value"></param>

        private void ProcessProgressChanged(int value)

        {

            this.overlayTextPainter.Text = value.ToString() + "%";

        }

 

        #endregion

 

        #region 작업 실행하기 - RunTask()

 

        /// <summary>

        /// 작업 실행하기

        /// </summary>

        /// <returns>작업 실행 태스크</returns>

        private async Task<string> RunTask()

        {

            string taskResult;

 

            this.taskHelper = new TaskHelper();

 

            try

            {

                taskResult = await this.taskHelper.Start(new Progress<int>(ProcessProgressChanged));

            }

            catch(OperationCanceledException)

            {

                taskResult = "작업이 취소되었습니다.";

            }

            finally

            {

                this.taskHelper.Dispose();

 

                this.taskHelper = null;

            }

 

            return taskResult;

        }

 

        #endregion

    }

}

 

------------------------------------------------------------------------------------------------------------------------

'DevExpress > WinForm' 카테고리의 다른 글

[DEVEXPRESS/WINFORM] AdornerUIManager 클래스 : 배지 사용하기  (0) 2019.05.06
[DEVEXPRESS/WINFORM] SplashScreenManager 클래스 : ShowOverlayForm 정적 메소드를 사용해 오버레임 폼 표시하기  (0) 2019.05.05
[DEVEXPRESS/WINFORM] CustomOverlayWindowPainter 클래스를 사용해 오버레이 폼에서 사용자 정의 그리기  (0) 2019.05.05
[DEVEXPRESS/WINFORM] AlertControl 클래스 : 알림 창 표시하기  (0) 2019.04.28
[DEVEXPRESS/WINFORM] SplashScreenManager 클래스 : ShowImage 정적 메소드를 사용해 스플래시 스크린 이미지 표시하기  (0) 2019.04.27
[DEVEXPRESS/WINFORM] SplashScreenManager 클래스 : ShowOverlayForm 정적 메소드를 사용해 오버레이 폼에 커스텀 버튼 표시하기  (0) 2019.04.27
[DEVEXPRESS/WINFORM] FluentDesignForm 클래스 사용하기  (0) 2019.04.27
[DEVEXPRESS/WINFORM] XtraForm 클래스 : MdiChildCaptionFormatString 속성을 사용해 부모 폼 제목과 MDI 자식 폼 제목 포맷 설정하기  (0) 2019.04.27
[DEVEXPRESS/WINFORM] SkinManager 클래스 : EnableMdiFormSkins 정적 메소드를 사용해 MDI 자식 폼의 타이틀바 스킨 활성화 하기  (0) 2019.04.27
[DEVEXPRESS/WINFORM] SkinManager 클래스 : EnableFormSkins 정적 메소드를 사용해 폼의 타이틀바 스킨 활성화 하기  (0) 2019.04.27
[DEVEXPRESS/WINFORM] WindowsFormsSettings 클래스 : MdiFormThickBorder 정적 속성을 사용해 MDI 자식 폼 경계 굵게 설정하기  (0) 2019.04.27
Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요