231 Aufrufe
Gefragt in Anwendungen(Java,C++...) von

Hi Leute,

ich bin am Verzweifeln mit meiner Anwendung (soviel zur sinnfreien Einleitung). Es geht darum, dass ich ein Informationslaufband erstellt habe. Das funktioniert soweit auch alles. Der Knackpunkt, an dem ich echt nicht weiterkomme, ist das Ansprechen des Close-Buttons während das Laufband mittels einer Schleife durchläuft.

Da ich eine Endlosschleife verwende, legt diese sich über alle sonstigen Funktionen. Ich verwende Threads, welche aber auch nicht wirklich angesprochen werden. Hier der Quellcode (arbeite übrigens mit Visual C# 2017):

using System;
using System.Windows.Forms;
using System.Threading;

namespace Laufband
{
    public partial class Form1 : Form
    {
        private delegate void SafeCallMarquee(string msg);
        private delegate void SafeCallCancelProgram();
        private Thread thread1 = null;
        private Thread thread2 = null;

        public Form1()
        {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            thread2 = new Thread(() => CancelProgram());

            thread2.Start();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach(Screen s in Screen.AllScreens)
            {
                if(s.DeviceName == @"\\.\DISPLAY2") // Ein zweiter Bildschirm existiert
                {
                    Width = s.Bounds.X; // erst die Gesamtbreite des ersten Bildschirms speichern,
                    Left = s.Bounds.X; // dann auf den zweiten Bildschirm um denselben Wert nach Rechts verschieben
                    label1.Left = s.Bounds.X;
                    button1.Left = s.Bounds.X - 27;
                    button1.BringToFront();
                }
                else
                {
                    Width = Screen.PrimaryScreen.Bounds.X;
                    button1.Left = Screen.PrimaryScreen.Bounds.X - 27;
                    label1.Left = s.Bounds.X;
                }
            }
        }

        private string Msg { get; set; }

        private void Form1_Shown(object sender, EventArgs e)
        {
            thread1 = new Thread(() => Marquee("DIES IST KEINE ÜBUNG!"));

            thread1.Start();
        }

        private void Marquee(string msg)
        {
            if (label1.InvokeRequired)
                Invoke(new SafeCallMarquee(Marquee), new object[] { msg });

            label1.Text = msg;

            while (true)
            {
                Thread.Sleep(10);
                label1.Left -= 1;

                Console.WriteLine(label1.Right);

                if (label1.Right == 0) // das gesamte Label ist nicht mehr zu sehen
                    label1.Left = Width; // setze das Label wieder in Ausgangsposition

                Update();
            }
        }

        private void CancelProgram()
        {
            if (button1.InvokeRequired)
                Invoke(new SafeCallCancelProgram(CancelProgram));

            Application.Exit();
        }
    }
}

Kann mir jemand sagen, wo genau mein Fehler ist und wie ich den Button angesprochen bekommen?

LG und schönes Wochenende

RabaukenHauke

Deine Antwort

Dein angezeigter Name (optional):
Datenschutz: Deine Email-Adresse benutzen wir ausschließlich, um dir Benachrichtigungen zu schicken. Es gilt unsere Datenschutzerklärung.
Anti-Spam-Captcha:
Bitte logge dich ein oder melde dich neu an, um das Anti-Spam-Captcha zu vermeiden.
...