Laden...

Forenbeiträge von AtzeX Ingesamt 217 Beiträge

09.03.2009 - 14:48 Uhr

Danke für deine Info.
Das ist ja dann mal nicht so einfach wie ich erst dachte.

Mal sehen, ob es den Aufwand wert ist.
Momentan fehlt mir zudem auch die Zeit mich in eine solche Komplexität einzuarbeiten.

Gruß,
AtzeX

08.03.2009 - 15:06 Uhr

Hallo zusammen.

Ich hatte heute die Idee, in mein C#-Projekt einen SNMP-Server zu integrieren, damit SNMP-Monitore dessen Status abfragen können.

Leider finde ich da so gut wie nichts drüber.
Auf CodeProject gibt es etwas, was mir aber unverständlich ist.
Darüberhinaus sind bestenfalls noch kommerzielle Bibliotheken zu finden.

Ist das wirklich ein so komplexes oder wenig beachtetes Fachgebiet?

Normalerweise kann man sich immer sagen "Ich bin nicht der erste, der das machen möchte, ich mache mich mal auf die Suche", aber in diesem Fall ist das echt mau, auch hier an Board.

Kann mir da jemand weiterhelfen?

Gruß,
AtzeX

16.01.2009 - 09:12 Uhr

Hallo zusammen.

Ich habe nun in einer virtuellen Umgebung VS2008 mit SP1 installiert und meine bestehende Solution neu kompiliert.

Die resultierenden Binaries habe ich nun auf einem Produktiv-Rechner, welcher lediglich das Framework 2.0 SP1 hat laufen lassen.
Das Ganze funktioniert nun seit einem Tag ohne Probleme bzw. Nebenwirkungen.

Vielleicht hilft diese Info ja jemandem.

Gruß,
AtzeX

14.01.2009 - 19:55 Uhr

Ok, dem stimme ich zu.

Dann hoffe ich mal, dass sich niemand meldet, der selber schon schlechte Erfahrungen damit gemacht hat. 😃

14.01.2009 - 16:26 Uhr

Danke für deinen Reply.

Allerdings schrieb ich ja deshalb:

Bisher nutze ich übrigends keinerlei 'Features' des 2.0 SP1-Frameworks um mit der 2.0 RTM kompatibel zu bleiben.

Ich achte also auch bisher schon darauf ausschließlich 'Features' zu verwenden, welche von der RTM unterstützt werden (in Zukunft werde ich zur weiteren Kontrolle auch noch den entsprechenden FxCop-Regelsatz anwenden).

Das von dir erwähnte Problem kann ich doch demnach eigentlich ausschließen, oder?

Sonst sind deiner Meinung nach keine Probleme zu erwarten?

14.01.2009 - 14:00 Uhr

Alternativ wäre es auch interessant zu wissen, ob jemand KEINE Probleme mit der genannten Konstellation hat. 😃

14.01.2009 - 10:30 Uhr

Hallo zusammen.

Ich möchte gerne VS 2008 SP1 installieren.
Da wird ja nun auch das Framework 2.0 SP2 mit installiert.

Bisher habe ich mit 2.0 SP1 meine Binaries erstellt.

Meine genaue Frage ist nun, ob jemandem Probleme bekannt sind, wenn ich diese von mir unter 2.0 SP2 kompilierten Binaries auf Rechnern ausführe, auf denen nur 2.0 SP1 installiert ist.

Bisher nutze ich übrigends keinerlei 'Features' des 2.0 SP1-Frameworks um mit der 2.0 RTM kompatibel zu bleiben.

Ich bin durch das ganze 2.0 SP-Heckmeck etwas verunsichert...

Gruß,
Atze

16.01.2008 - 08:41 Uhr

Bin gerade über Linqbridge gestolpert.
Das soll den kostenlosen Einsatz von Linq in einem 2.0er Framework Projekt mit VS2008 ermöglichen.
Wie ich finde ein interessanter Aspekt.
Hat das schon jemand im Einsatz?

15.01.2008 - 22:33 Uhr

Vielleicht probierst du einmal diese Vorabversion:
ankhsvn.tigris.org/servlets/ProjectDocumentList?folderID=9289

Gruß,
AtzeX

14.01.2008 - 20:13 Uhr

Das hört sich ja schon einmal sehr vielversprechend an.
Danke bis hierhin schon einmal. 👍

@blauerblubb:
Warum 2005 deinstallieren?
Nun, ich versuche meinen Rechner immer möglichst schlank zu halten.
Und nun neben 2005 noch so einen Brummer drauf...
Obwohl, naja, ich lasse es mir mal durch den Kopf gehen.

@FZelle, wonka:
Mit den Solutionfiles war ja schon mal ein klasse Tipp.

@FZelle:
Ich verwende AnkhSVN. Das ist ja auch 'fast fertig' für 2008. Zumindest soll eine 'RC' schon gut funktionieren.
Ansonsten kann ich ja immer noch erst einmal mit TortoiseSVN arbeiten.

Edit:
Wer einen Blick auf AnkhSVN mit VS2008 werfen möchte:
ankhsvn.tigris.org/servlets/ProjectDocumentList?folderID=9289

14.01.2008 - 17:26 Uhr

Hallo.

Ich habe gelesen, dass man mit dem Visual Studio 2008 auch weiterhin 2.0er Framework Projekte erstellen/bearbeiten kann.

Bevor ich nun VS2005 deinstalliere und VS2008 installiere, würde ich gerne einmal in die Runde fragen, ob jemand schon Erfahrungen damit gesammelt hat?
Klappt das reibungslos?

Vielleicht interessiert es ja noch weitere Entwickler und der ein oder andere schreibt man ein Sätzchen dazu?
Wäre klasse.

P.S.:
Mir persönlich geht es primär um C#-Windows-Applikationen, -Class-Libraries und -Konsolen-Applikationen. ASP nutze ich nicht.

Gruß und Danke im Voraus
AtzeX

22.10.2007 - 14:17 Uhr

Hallo,

ich habe bei einem Rechner das Problem, dass die Opacity-Eigenschaft eines Windows Forms sich leider so verhält, dass sie, sobald ein Wert < 1.0 gesetzt wird (z.B. 0.5), das Form komplett unsichtbar schaltet.
Die Anwendung ist definitiv noch da und arbeitet weiter.
Ich habe dazu extra einen großen Button auf dem Form platziert, mit dem ich das Form wieder sichtbar machen kann:

private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("Current opaticy (before): " + this.Opacity.ToString());
    if (this.Opacity == 1)
        this.Opacity = 0.9f;
    else
        this.Opacity = 1f;
}

Ich tippe auf den Grafikkartentreiber, aber leider finde ich nicht heraus, woran das liegt, bzw. wo ich es parametrisieren könnte.
Es sieht so aus, als wenn die Darstellung nur 0 oder 1 kennt.

Oder ist es eine Option des Windows Desktops?

Hat jemand eine Idee?

22.10.2007 - 10:37 Uhr

Ctrl-X
Allerdings hast du sie dann auch in der Zwischenablage.

Gruß,
AtzeX

21.10.2007 - 14:11 Uhr

Du könntest in dem Zusammenhang auch hier nachlesen:
Ersatz für multiple Vererbung?

Gruß,
AtzeX

21.10.2007 - 00:38 Uhr

Da Mehrfachvererbung nicht möglich ist, bleibt ja nur es über ein Interface zu implementieren.

25.09.2007 - 13:23 Uhr

Danke euch für die Antworten.

@herbivore:

Aber MS benutzt die genannten Exceptions selbst und verwendet "value" als Namen des Arguments. Meinst du den Wert von "value", oder das Literal?
Ich habe bisher immer den Namen der Property als Namen des Arguments verwendet.

@retnug:
Ob man sich den Wolf sucht, hängt doch von der Aussagekraft der Exception-Message ab. Wenn man diese detailliert genug aufbaut, sollte das doch kein Problem sein.

25.09.2007 - 12:23 Uhr

Hallo.

Mir stellt sich gerade die Frage, ob es praktikabel ist, eine "ArgumentException", "ArgumentNullException" bzw. "ArgumentOutOfRangeException" auch in einem Setter zu verwenden?

Oder gibt es da eine passendere Exception, welche ich nicht gefunden habe/kenne?

"value" ist ja eigentlich kein 'Argument' im klassischen Methoden-Sinne...

25.09.2007 - 10:59 Uhr

Original von herbivore
Hallo AtzeX,

Mich wundert es, dass noch keiner NOD32 genannt hat.
tztztz, noch keiner, das klingt so, als hätten schon zwanzig Leute ihre Favoriten geschrieben, ohne das NOD32 darunter wäre. Vor dir hat nur einer [EDIT]ok, zwei[/EDIT] überhaupt konkrete Produkte genannt. Da nimmt es nicht Wunder, dass das eine oder andere Produkt noch nicht genannt wurde.

Abgesehen natürlich von der Produktliste in dem Zitat in meinem Post oben, in dem NOD32 auftaucht. 🙂

herbivore

Hehehe, ist halt so: Wer erst mal NOD32 schätzen gelernt hat, wundert sich, dass es nicht sofort aus aller Munde sprudelt. 😉

24.09.2007 - 14:52 Uhr

Mich wundert es, dass noch keiner NOD32 genannt hat.
Ich habe es in der Firma und auch privat lizensiert.
Es belasted den Rechner fast gar nicht, und hat gute bis sehr gute Erkennungsraten.
Support und Updates sind auch erstklassig.

Gruß,
AtzeX

16.09.2007 - 10:54 Uhr

Da kann und muss ich leider uneingeschränkt zustimmen.

15.09.2007 - 21:09 Uhr

Mit einem selbstdefinierten Event, den deine Businesslogic (die DLL) auslöst, welchen das HauptForm aboniert und entsprechend mit einem FehlerForm reagiert, welches z.B. den Eventparameter übergeben bekommt. 😉

15.09.2007 - 16:22 Uhr

Nur zur Info, falls es jemanden interessiert.

Ich habe mir nun dieses Buch gekauft Pro .NET 2.0 Windows Forms and Custom Controls in C#

Das ist echt klasse!

Und den Sourcecode gibts für Interessierte im genannten Link auch zum Download.

Gruß,
AtzeX

15.09.2007 - 16:17 Uhr

@svenson:
Ich habe den alten Thread noch mal ausgegraben um etwas nachzulesen.
Sag mal, hättest du evtl. ein Beispiel anhand des oben geposteten Codes, wie du dort noch das Factory-Pattern implementieren würdest?
Mit fehlt noch das 'klick' im Hirn.

Danke im Vorraus,

AtzeX 😉

15.09.2007 - 10:00 Uhr

Da fällt mir spontan die "Aspektorientierte Programmierung" ein.
Allerdings habe ich da auch noch nichts mit gemacht.
Suche doch mal an Board danach. 😉

13.09.2007 - 13:57 Uhr

Du musst dir eine (wenn du magst versteckte) Textmarke im 'normalen' Bereich des Dokuments erstellen.
Dann erstellst du dir ein berechnetes Feld in der Fußzeile, welches auf das Erstgenannte verweist.

Gruß,
AtzeX

11.09.2007 - 14:59 Uhr

Aus der Hüfte geschossen würde ich sagen, du musst

this.ShowDialog();

aufrufen.

Gruß,
AtzeX

Edit:
Ist aber eigentlich auch der falsche Ansatz von dir.
Du willst doch den Dialog weiterhin angezeigt bekommen, nur dass du ihn mit DialogResult.* auswerten kannst, oder?

Also bleibt in meiner Klasse alles beim Alten.

Du musst lediglich dein abgeleitetes Form überarbeiten:

Vorrausgesetzt sind zwei Buttons deren Namen du unten sehen kannst.

private void DialogShadowTopFormTest_Load(object sender, EventArgs e)
{
	FormMoveable = false;
	ActiveShadowMode = ShadowMode.GreyOut;
	GreyOutModeBaseColor = Color.Black;
	TimerInitWait = 2000;
	TimerInterval = 10;
	TimerIntervalSlowDownByOpacityFactor = 150;
	OpacityStep = 0.05f;
	OpacityMax = 0.7f;

	ShowShadow();
}

private void uxButtonOk_Click(object sender, EventArgs e)
{
	this.DialogResult = DialogResult.OK;
	this.Close();
}

private void uxButtonCancel_Click(object sender, EventArgs e)
{
	this.DialogResult = DialogResult.Cancel;
	this.Close();
}

Aufgerufen wird dein Dialog dann z.B. so:
(vorrausesetzt dein abgeleitetes Form heißt "DialogShadowTopFormTest")

DialogShadowTopFormTest dialogShadowTopFormTest = new DialogShadowTopFormTest();
MessageBox.Show(dialogShadowTopFormTest.ShowDialog().ToString());

Mit der MessageBox kannst du den Rückgabewert direkt anzeigen lassen.

Gruß,
AtzeX

11.09.2007 - 14:58 Uhr

Ja, da hast du wiederum Recht.
Wenn ich in Byte konvertiere geht ja (je nach ursprünglicher Kodierung) 0-1 Byte verloren.

Ok, lassen wir das.

Die Aussage 16bit Unicode reicht mir.

[Off-Topic]
Das erinnert mich daran, das selbst VB6 das intern so verwaltet hat.
[/Off-Topic]

Gruß,
AtzeX

11.09.2007 - 12:36 Uhr

Hi herbivore.

Was du testest ist aber was anderes, nämlich in welchem Encoding deine Quelltext-Datei gespeichert ist.

Das kann eigentlich nicht sein, denn ich habe das Projekt geschlossen (die gesamte IDE) dann die Form1.cs mittels eines Editors in UTF-8 konvertiert und dann das Projekt neu geladen.
Demnach müssten nun ja bei der Verwendung des "UTF-8"-encodings die Umlaute richtig sein, oder?

Sind sie aber nicht...

11.09.2007 - 11:38 Uhr

Hallo.

Ich habe die Tage ein Codepage-Konvertierungsproblem gehabt.

Dies hat mich zu der Frage gebracht, wie das .Net Framework Strings intern ablegt.

Zum testen habe ich mal ein paar Zeilen Code verfasst:

            byte[] byteArray = { (byte)'ä', (byte)'ö', (byte)'ü', (byte)'ß' };

foreach (EncodingInfo encodingInfo in Encoding.GetEncodings())
{
        Encoding encoding = Encoding.GetEncoding(encodingInfo.CodePage);
        string s = encoding.GetString(byteArray);
        listBox1.Items.Add(String.Format("{0} --- {1} --- {2}\n", s, encoding.CodePage, encoding.EncodingName));
}

Nun gibt es jedoch mehrere Encodings die 'passen'.
Zumindest ist der Code für die Zeichen "äöüß" gleich.

Das hat mir nur leider keine Antwort gegeben.

Wisst ihr, wie .Net intern seine Strings ablegt?

Gruß,
AtzeX

07.09.2007 - 15:24 Uhr

Beschreibung:

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

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
    }
}

Schlagwörter: Bildschirm, Dialog, Modal, verdunkeln, ausgrauen

07.09.2007 - 14:18 Uhr

Ich veröffentliche diese GERNE auch hier.
Hatte ich ja weiter oben schon angefragt, nur dass ich dachte es wäre nicht von Interesse, da ja diesbezüglich kein Feedback kam.
😉

Mach' ich dann heute noch.

Gruß,
AtzeX

07.09.2007 - 12:51 Uhr

@dechavue:
Ich habe meine Klasse mal bei dotnet-snippets.de veröffentlicht.

Hast du was dagegen, wenn ich deine Änderungen bzgl. des Mehrschirm-Aspekts mit aufnehme?
Momentan habe ich ihn rausgelassen.

07.09.2007 - 08:45 Uhr

Vielleicht so?

// 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;
            }
        }

Verwendet habe ich es hier und es läuft gut:
Bildschirm verdunkeln in C#

Gruß,
AtzeX

04.09.2007 - 11:15 Uhr

@svenson:
Da hast du Recht, aber das war nicht die Frage.
Es ging darum, das Invoke in der Event-auslösenden 'On-Methode' aufzurufen.
Und die hat in meinem Fall (oder in vielen denke ich) nichts mit dem Form oder einem Control zu tun, bzw. kennt diese gar nicht (ist halt die Business Logik).
Oder habe ich dich falsch verstanden?

@herbivore
"SynchronizationContext.Send/Post verwenden." schaue ich mir einmal an, das ist mir ganz neu.

04.09.2007 - 09:53 Uhr

Hi herbivore,

da muss ich mal mit einer Frage einhaken.
Ich habe es bisher auch immer so gemacht, dass ich im Form wie im Beispiel beschrieben geprüft habe, ob ein Invoke notwendig ist.
Wenn ja, habe ich ihn durchgeführt.

if (this.InvokeRequired)
{
    this.Invoke(...);
    return;
}

Aber da hatte ich auch immer den Kontext des Forms.
Wenn ich das in meiner Event-auslösenden 'On-Methode' implementiere, wie du vorschlägst, fehlt mir doch genau dieser Kontext zum UI.
Ich dachte immer, den bräuchte ich um "this.Invoke()" im korrekten Kontext aufzurufen.
Ist dem nicht so?

Gruß,
AtzeX

03.09.2007 - 13:13 Uhr

Ich bringe es nochmal hoch, um die Herren mit deutlich mehr Erfahrung als ich sie vorzuweisen habe zu fragen, ob es an der technischen Umsetzung bzw. dem technischen Style etwas zu verbessern gibt?

Ich erweitere meinen Horizont gerne und bin offen für Kritik. 😉

Gruß,
AtzeX

P.S.:
Macht es Sinn, das in die "C#-Snippets" zu bringen?

02.09.2007 - 23:48 Uhr

Aber gerne doch. Habe ich mit meinem einen Screen gar nicht drüber nachgedacht. 😉

Gruß,
AtzeX

02.09.2007 - 21:17 Uhr

Hi.

Das Thema hat mich irgendwie gepackt und ich habe mal etwas zusammengestrickt.

Eine Basisklasse:

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()
        {
            switch (ActiveShadowMode)
            {
                case ShadowMode.GreyOut:
                    {
                        Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
                        using (Graphics graphics = Graphics.FromImage(bitmap))
                        {
                            graphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size);
                        }
                        _shadowForm.BackgroundImage = GrayScaleImage((Image)bitmap);
                        break;
                    }
                case ShadowMode.Darken:
                    _shadowForm.BackColor = GreyOutModeBaseColor;
                    break;
            }

            _shadowForm.TopMost = true;
            _shadowForm.WindowState = FormWindowState.Maximized;
            _shadowForm.FormBorderStyle = FormBorderStyle.None;
            _shadowForm.Opacity = 0;

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

            _shadowForm.Show();

            _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
    }
}

und verwendet werden kann es mittels Ableitung eines Forms von der Klasse so:

.
.
.
    public partial class DialogShadowTopFormTest : DialogShadowTopForm
    {
        .
        .
        .
        private void DialogShadowTopFormTest_Load(object sender, EventArgs e)
        {
            FormMoveable = false;
            FormBorderStyle = FormBorderStyle.FixedToolWindow;

            ActiveShadowMode = ShadowMode.GreyOut;
            GreyOutModeBaseColor = Color.Black;
            TimerInitWait = 2000;
            TimerInterval = 10;
            TimerIntervalSlowDownByOpacityFactor = 150;
            OpacityStep = 0.05f;
            OpacityMax = 0.7f;

            ShowShadow();
        }
        .
        .
        .
    }
.
.
.

Gibt's von eurer Seite evtl. technische Umsetzungsverbesserungen?
Man lernt ja gerne nie aus. 😉

Gruß,
AtzeX

29.08.2007 - 19:37 Uhr

Mir fällte gerade auf, dass der Windows-Dialog den ganymedes meinte ja nicht nur abdunkelt, sondern die Farben 'ausgraut'.

Das geht aber nur mit Hilfe eines Screenshots, oder?

28.08.2007 - 20:22 Uhr

Auch ne gute Idee. 👍

28.08.2007 - 16:05 Uhr

Original von dechavue
Hi,

Wenn es dir nur um das Verdunkeln geht und nicht um das Einfrieren des Hintergrunds, wäre es auch möglich, eine Form (borderstyle = none) mit BackColor=Black über den Bildschirm zu legen und (für den Fade - Effekt mit einem Timer) die Opacity Eigenschaft zu verändern.

mfg dechavue

Edit: tja die Rechtschreibung

Das macht aber das gesamte Form mit allen seiner Controls durchsichtig, oder?

Er will doch sicher das ein oder andere Control auf dem Form haben, welches dann nicht durchsichtig werden soll, oder?

16.07.2007 - 10:41 Uhr

Meine Idee wäre das auch gewesen, beim einmaligen Durchlauf alles in ein Dictionary zu schieben. Dann haste es sortiert und kannst es dann in einem zweiten Durchlauf (des Dictionaries) in den Baum setzen.

Gruß,
AtzeX

18.06.2007 - 14:38 Uhr

Schade.
Eine wirklich funktionierende Simulation dessen stelle ich mir doch recht komplex vor, da man sicherlich auch die Höhe des Systrays (kann doch mehrzeilige sein, oder?) berücksichtigen muss und die Maus wohl auch nicht zu schnell darüber 'bewegen' darf, oder?

17.06.2007 - 00:19 Uhr

Hallo.

Ich muss leider manchmal hängende Prozesse externer Programme abschießen.
Da eines dieser Programme leider ein SysTray Icon hat, bleibt dieses bestehen und geht erst weg, wenn ich mit der Maus darüber fahre.

Gibt es eine Möglichkeit, das Systray auch ohne Maus zu refreshen um diese verwaisten Icons zu entfernen?

Danke im Vorraus,

AtzeX

16.06.2007 - 16:13 Uhr

Da stimme ich dir voll und ganz zu. 😉

Edit:
Sorry, habe ich unterschlagen: In DATA ist leider auch nichts enthalten.

16.06.2007 - 15:41 Uhr

Hallo zusammen.
Danke für die Replies.
Herbivore hat Recht mit seiner Aussage.

Leider hat die genannte Exception keine InnerException.

Demnach kann ich die genaue Situation nur durch Textvergleich bestimmen, oder?

15.06.2007 - 19:21 Uhr

Hallo.

Ich möchte gerne innerhalb einer Exception die ich abfange unterschiedliche Fälle (Gründe) unterschiedlich behandeln.

Zum Beispiel fange ich die Exception System.InvalidOperationException ab.

Manchmal ist die enthaltene Message "Cannot process request because the process (4711) has exited." manchmal "No process is associated with this object.".

Ich möchte diese beiden Fälle jedoch unterschiedlich behandeln.

Da bleibt mir doch nur ein Textvergleich, oder übersehe ich da etwas?

Danke im Vorraus.

Gruß,
AtzeX

31.05.2007 - 22:18 Uhr

Ich habe mir hier einen Wrapper für die LIST erstellt.
Allerdings nur mit der Möglichkeit Werte hinzuzufügen und die Liste zu iterieren.

Threadsafe Generic List. Problem mit eigenem Wrapper. Oder bessere Alternative?

Vielleicht ist es ja was für dich?

28.05.2007 - 14:11 Uhr

Ah ja, danke dir.
Ich denke jedoch, dass ich es so lasse wie geposted.
Insofern das keine gravierenden Nachteile hat?!?