티스토리 뷰

C#

C#: OverlayDialog (불투명한 배경의 Dialog)

개태형님 2021. 9. 21. 17:16

WinForm을 하다보면 일반적인 Dialog가 아니라, Overlay 형태의 Dialog가 필요한 상황이 생긴다.

MainForm에 팝업창이 하나 뜨는 Dialog가 아닌, MainForm과 Dialog 사이에 불투명한 레이어가 생기고, 그 위에 Dialog를 올리는 방식이다.

 

아래 스크린샷 처럼 실제 적용된 모습을 보면 이해가 쉬울것이다.

(타이틀, 메뉴명은 모종의 이유로 삭제. Overlay Dialog의 형태만 보라.)

 

해당 기능은 아래와 같은 방식으로 구현된다.

1. 불투명 배경으로 사용될 OverlayForm 추가

2. OverlayForm 위에 올라올 Dialog 추가

3. MainForm에서 OverlayForm을 띄우고, OverlayForm에서 Dialog를 띄움

4. Dialog의 DialogResult를 OverlayForm에서 받고, MainForm에 전달

 

 

구현 코드는 아래와 같다.

1. OverlayForm

    public partial class OverlayDialog : Form
    {
        private OverlayDialog(Form parent, double opacity)
        {
            FormBorderStyle = FormBorderStyle.None;
			
            // 불투명 색상
            BackColor = Color.Black;
			
            // 불투명 정도, 0에 가까울수록 투명
            Opacity = opacity;
			
            ShowIcon = false;
            ShowInTaskbar = false;
            StartPosition = FormStartPosition.Manual;
            Size = parent.ClientSize;
            Location = parent.PointToScreen(Point.Empty);
        }

        public static DialogResult ShowDialog(Form parent, Form dialog, double opacity = 0.65)
        {
            var background = new OverlayDialog(parent, opacity);
            background.MdiParent = parent.MdiParent;
            background.Show();

            dialog.StartPosition = FormStartPosition.CenterParent;
            DialogResult result = dialog.ShowDialog(background);
            background.Close();
            return result;
        }
    }

2. MainForm 에서의 호출

	using (var dialog = new LoginDialog())
	{
		// this : Overlay밑에 깔릴 Form (MainForm)
		// dialog : Overlay위에 올라갈 Dialog
		if (OverlayDialog.ShowDialog(this, dialog) != DialogResult.OK) return;

		var user = dialog.LoginUser;
		// Do Something...
	}

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday