Feedback

C# - Den Bildschirm um Dialog herum abdunkeln/ausgrauen.

Veröffentlicht von am 07.09.2007
(3 Bewertungen)
Eine abstrakte Form-Klasse deren Ableitung einen Dialog darstellt, wobei der Bildschirm um den Dialog herum langsam ausgegraut oder verdunkelt wird (ähnlich dem Abmelde-Dialog von Windows-XP).

Properties:
- FormMoveable:
Legt fest, ob der Dialog verschoben werden kann oder nicht.
- ActiveShadowMode:
Stellt den Modus auf "Darken" oder "GreyOut" ein.
- GreyOutModeBaseColor:
Die Basisfarbe im Modus "Darken".
- TimerInitWait:
Wartezeit, bis mit dem Abdunkeln/Ausgrauen begonnen wird.
- TimerInterval:
Beeinflusst die Abdunklungs-/Ausgrauungsgeschwindigkeit.
- TimerIntervalSlowDownByOpacityFactor:
Ermöglicht eine abnemmende Geschwindigkeit.
- OpacityStep:
Beeinflusst die Abdunklungs-/Ausgrauungsgeschwindigkeit
- OpacityMax:
Maximal zu verwendende Opacity.

Methoden:
- ShowShadow:
Aktiviert den Abdunklungs-/Ausgrauungsvorgang
GFU-Schulungen  [Anzeige]

Visual Studio Team Foundation Server 2017/2015 (TFS) für Entwickler - Kompakt

Nach Teilnahme an dieser Schulung kennen Sie alle wesentlichen Funktionen des TFS für Entwickler. Sie setzen Software-Entwicklung mit dem Visual Studio Team Foundation Server erfolgreich um.

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Imaging;

namespace ShadowScreenTest
{
    public abstract class DialogShadowTopForm : Form
    {
        #region --- Fields ---
        Timer _shadowTimer = new Timer();
        Form _shadowForm = new Form();

        bool _formMoveable = false;
        ShadowMode _activeShadowMode = ShadowMode.GreyOut;
        Color _greyOutModeBaseColor = Color.Black;
        int _timerInitWait = 2000;
        int _timerInterval = 10;
        int _timerIntervalSlowDownByOpacityFactor = 150;
        Single _opacityStep = 0.05f;
        Single _opacityMax = 0.7f;
        #endregion

        #region --- Public properties ---
        public bool FormMoveable
        {
            get { return _formMoveable; }
            set { _formMoveable = value; }
        }

        public ShadowMode ActiveShadowMode
        {
            get { return _activeShadowMode; }
            set { _activeShadowMode = value; }
        }

        public Color GreyOutModeBaseColor
        {
            get { return _greyOutModeBaseColor; }
            set { _greyOutModeBaseColor = value; }
        }

        public int TimerInitWait
        {
            get { return _timerInitWait; }
            set
            {
                if (value < 0)
                    _timerInitWait = 0;
                else
                    _timerInitWait = value;
            }
        }

        public int TimerInterval
        {
            get { return _timerInterval; }
            set
            {
                if (value < 0)
                    _timerInterval = 0;
                else
                    _timerInterval = value;
            }
        }

        public int TimerIntervalSlowDownByOpacityFactor
        {
            get { return _timerIntervalSlowDownByOpacityFactor; }
            set
            {
                if (value < 0)
                    _timerIntervalSlowDownByOpacityFactor = 0;
                else
                    _timerIntervalSlowDownByOpacityFactor = value;
            }
        }

        public Single OpacityStep
        {
            get { return _opacityStep; }
            set
            {
                if (value < 0)
                    _opacityStep = 0.01f;
                else
                    if (value > 1)
                        _opacityStep = 1.0f;
                    else
                        _opacityStep = value;
            }
        }

        public Single OpacityMax
        {
            get { return _opacityMax; }
            set
            {
                if (value < 0)
                    _opacityMax = 0;
                else
                    if (value > 1)
                        _opacityMax = 1.0f;
                    else
                        _opacityMax = value;
            }
        }
        #endregion

        #region --- Private methods ---
        private Image GrayScaleImage(Image image)
        {
            ImageAttributes imageAttributes = new ImageAttributes();

            Single[][] colorMatrixAttributes;

            // Greyscale
            colorMatrixAttributes = new Single[][]
            {
                new Single[] { 0.299f, 0.299f, 0.299f, 0, 0 },
                new Single[] { 0.587f, 0.587f, 0.587f, 0, 0 },
                new Single[] { 0.114f, 0.114f, 0.114f, 0, 0 },
                new Single[] { 0, 0, 0, 1, 0 },
                new Single[] { 0, 0, 0, 0, 1 }
            };

            ColorMatrix colorMatrix = new ColorMatrix(colorMatrixAttributes);

            imageAttributes.SetColorMatrix(colorMatrix);

            Bitmap bitmap = new Bitmap(image.Width, image.Height, PixelFormat.Format32bppArgb);

            bitmap.SetResolution(image.HorizontalResolution, image.VerticalResolution);

            Graphics graphics = Graphics.FromImage(bitmap);

            graphics.DrawImage(image, new Rectangle(0, 0, bitmap.Width, bitmap.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, imageAttributes);

            graphics.Dispose();
            imageAttributes.Dispose();

            return bitmap;
        }
        #endregion

        #region --- Protected methods ---
        // Make the form unmoveable.
        protected override void WndProc(ref Message m)
        {
            const int WM_NCHITTEST = 0x84;
            const int HTCAPTION = 0x02;
            const int HTCLIENT = 0x01;

            base.WndProc(ref m);

            if (FormMoveable) return;

            if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCAPTION)
            {
                m.Result = (IntPtr)HTCLIENT;
            }
        }
        #endregion

        #region --- Public methods ---
        public void ShowShadow ( )
        {
            _shadowForm.TopMost = true;
            _shadowForm.FormBorderStyle = FormBorderStyle.None;
            _shadowForm.Opacity = 0;

            this.Owner = _shadowForm;
            this.TopMost = true;

            _shadowForm.Show ( );

            _shadowForm.Location = Screen.GetBounds ( new Rectangle ( int.MinValue / 2, int.MaxValue / 2, int.MaxValue, int.MaxValue ) ).Location;
            _shadowForm.Size = new Size ( int.MaxValue, int.MaxValue );
            
            switch ( ActiveShadowMode )
            {
                case ShadowMode.GreyOut:
                {
                    Bitmap bitmap = new Bitmap ( _shadowForm.Width, _shadowForm.Height, PixelFormat.Format32bppArgb );
                    using ( Graphics graphics = Graphics.FromImage ( bitmap ) )
                    { 
                        graphics.CopyFromScreen ( _shadowForm.Location, new Point (0,0) , _shadowForm.Size );
                    }
                    _shadowForm.BackgroundImage = GrayScaleImage ( (Image)bitmap );
                    break;
                }
                case ShadowMode.Darken:
                    _shadowForm.BackColor = GreyOutModeBaseColor;
                    break;
            }

            _shadowTimer.Interval = TimerInitWait;
            _shadowTimer.Tick += new EventHandler ( shadowTimer_Tick );
            _shadowTimer.Enabled = true;
        } 
        #endregion

        #region --- Event handlers ---
        private void shadowTimer_Tick(object sender, EventArgs e)
        {
            _shadowTimer.Interval = TimerInterval + (int)(_shadowForm.Opacity * TimerIntervalSlowDownByOpacityFactor);

            _shadowForm.Opacity += OpacityStep;

            if (_shadowForm.Opacity >= OpacityMax)
                _shadowTimer.Enabled = false;
        }
        #endregion

        #region --- Enumerators ---
        public enum ShadowMode : int
        {
            Darken,
            GreyOut
        }
        #endregion
    }
}
Abgelegt unter Bildschirm, Dialog, Modal, verdunkeln, ausgrauen.

3 Kommentare zum Snippet

dariusarnold schrieb am 08.02.2013:
Irgendwie versteh ich es nicht..
Kann mal jemand ein Beispiel machen, wie man das verwendet??
Wenn ich eine neue DialogShadowTopForm per
DialogShadowTopForm s;
erstelle sagt er beim zuweisen der Werte der Eigenschaften zurecht: "Verwendung der nicht zugewiesenen Variablen s".
Aber man kann auch keine Instanz erstellen.??
DialogShadowTopForm s = new DialogShadowTopForm()

^^Geht auch nicht was einem aber auch Auffällt, wenn man sich die Klasse mal ansieht. Steh grad echt auf der Leitung. THX

[edit] Anders vormuliert: Mit welchem "Startwet" muss man s denn Zuweisen??
Anonymus schrieb am 08.02.2013:
Hallo.
Wie bereits im eigentlichen Artikel beschrieben ist es eine abstrakte Form-Klasse deren Ableitung einen Dialog darstellt. ;-)
Hier wurde das mal diskutiert:
http://www.mycsharp.de/wbb2/thread.php?threadid=43292
dariusarnold schrieb am 08.02.2013:
Thx für die Schnelle Antwort. :)
 

Logge dich ein, um hier zu kommentieren!