Zmiana koloru przycisku po wciśnięciu dowolnego przycisku z klawiatury.

0

Witam, mam za zadanie napisać program który zmienia kolor przycisku po naciśnięciu dowolnego klawisza na klawiaturze. Wiem tylko jak przypisać dany klawisz. Ale jak zrobić aby kolor zmieniał się po dowolnym klawiszu???

private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Q)
            {
                button1.BackColor = Color.Red;               
            }
       }
1
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    button1.BackColor = Color.Red;               
}
0

Dziękuje, a jeżeli mam teraz 10 przycisków i każdy z nich ma zmieniać kolor po kolei?

2

Ciężko mi wywróżyć jak to wygląda na UI/w kodzie u Ciebie, zakładając że masz np. 10 przycisków nazwanych button1, button2 itd., możesz je wrzucić do jakiejś wspólnej kolekcji i przy każdym naciśnięciu klawisza zmieniać kolor następnego.

private List<Button> Buttons = new List<Button> { button1, button2, .... button10 };
private int _currentButton = 0;

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    Buttons[_currentButton].BackColor = Color.Red;
    _currentButton = (_currentButton + 1) % Buttons.Count;
}
0

Tak, dokładnie o to właśnie mi chodziło. dziękuje :)

I się pojawił kolejny problem, mam te przyciski sztuk 10 nazwane po kolei button1 button2...button10. A w kodzie ich nie widzi??
screenshot-20200605134051.png


screenshot-20200605134230.png

0

Racja, my bad. Tak jak jest napisane w komunikacie błędu, inicjalizator pola nie może odwoływać się do niestatycznego pola (button1...10 jest polem instancji klasy, a nie polem statycznym). Przenieś inicjalizację tej kolekcji np. do konstruktora.

0

var allButtons = this.Controls.Cast<Control>().Where(c => c.GetType() == typeof(Button));

            foreach(var button in allButtons)
            {
                button.BackColor = Color.Red;
            }
0
teo215 napisał(a):
var allButtons = this.Controls.Cast<Control>().Where(c => c.GetType() == typeof(Button));

A dlaczego nie po prostu?

var allButtons = this.Controls.OfType<Button>()
0

Dobrze tylko pisałem aby się kolory przycisków zmieniały po kolei a nie wszystkie naraz, mam obecnie tak:
screenshot-20200607110305.png

0
  • Możesz dodać sleep po każdej zmianie ale to zabije UI thread
  • Możesz dodać timer który będzie co Tick wykonywał zmianę koloru
  • Możesz dodać background worker i przenieść do niego obecna logikę.
0

Zmiana ma być po każdym naciśniętym klawiszu, nie po czasie.

0

Wrzucić do tabeli i zwiekszać counter o jeden po osiagnieciu max restartowac.

0

Podpowiesz jakby to miało wyglądać?
screenshot-20200607130340.png
nie bardzo wiem jak to ma być
screenshot-20200607131747.png

1

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        Random random = new Random();
        readonly IList<Button> buttonsOnForm;
        int indexOfButton;
        public Form1()
        {
            InitializeComponent();
            buttonsOnForm = this.Controls.OfType<Button>().ToList();
            indexOfButton = 0;
        }

        private Color GetRandomColor()
        {
            return Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255));
        }

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (indexOfButton >= buttonsOnForm.Count) indexOfButton = 0;

            buttonsOnForm[indexOfButton].BackColor = GetRandomColor();

            indexOfButton++;
        }
    }
}
0

Dziękuje :) A gdybym chciał zmodyfikować kod i dodać zmianę kolorów po kolei od wartości 0 do 255. Na przykład jasno zielony, ciemnozielony , zielony,,,,itd. w pętli przez wszystkie kolory.??

1

Tu masz dwie inne strategie


        private Color GetNextColor()
        {
            var sizeOfSingleStep = 255 / buttonsOnForm.Count;
            var currentColor = indexOfButton * sizeOfSingleStep;
            return Color.FromArgb(currentColor, currentColor, currentColor);
        }

        private Color GetStaticColor()
        {
            var listOfDefinedColors = new List<Color> { Color.Green, Color.DarkGreen, Color.LightGreen, Color.GreenYellow };
            return listOfDefinedColors[ indexOfButton % listOfDefinedColors.Count ];
        }
0

Ok dodałem pierwszą opcję, tylko nie wiem dlaczego teraz przestało zapętlać tą zmianę kolorów, zmienia się 10 odcieni danego koloru i koniec.a powinno wrócić na początek i zmieniać je dalej

[] screenshot-20200607151624.png
screenshot-20200607151654.png

0

Jeżeli prześledzisz kod programu to zobaczsz że dla pierwszego elementu będa wartosci
0. Color.FromArgb(0,0,0) <-Czarny

  1. Color.FromArgb(X,X,X)
  2. Color.FromArgb(X2,X2,X*2)
    ...
    Ostatni Color.FromArgb(255,255,255) <-Biały

Tutaj już więcej nie pomogę bo to tylko kwestia własnej kreatywności jaka strategie dobrać:

static int GetNextColorCounter = 0;
        private Color GetNextColor()
        {
            var sizeOfSingleStep = 255 / buttonsOnForm.Count - 1;
            var currentColor = (GetNextColorCounter % (buttonsOnForm.Count - 1)) * sizeOfSingleStep;

            GetNextColorCounter++;

            return Color.FromArgb(0, currentColor, 0);
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1