• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zmiana obrazka buttona do momentu kliknięcia innego

VPS Starter Arubacloud
+1 głos
119 wizyt
pytanie zadane 19 kwietnia 2023 w C# przez Mati336 Użytkownik (560 p.)

Witam!  Wykonałem przycisk z wykorzystaniem opcji hover i leave według tego poniższego schematu:

private void btnIncome_MouseHover(object sender, EventArgs e)
        {
            this.btnIncome.Image = Properties.Resources.income_btn_hover;
            this.Cursor = Cursors.Hand;

        }


private void btnIncome_MouseLeave(object sender, EventArgs e)
        {
            this.btnIncome.Image = Properties.Resources.income_btn_normal;
            this.Cursor = Cursors.Arrow;
        }

i działa ok.

I teraz mam menu wykonane  takich buttonów. I zależy mi aby button który został wciśnięty był inny (inny image) do momentu jak nie wcisnę innego buttona. Da się to jakoś wykonać ?

 

 

1 odpowiedź

+1 głos
odpowiedź 20 kwietnia 2023 przez VBService Ekspert (255,320 p.)
edycja 20 kwietnia 2023 przez VBService

Proponuje przypisać jedno zdarzenie Click do wszystkich button-ów w menu i posłużyć się zmienną, która będzie "pamiętać" ostatnio kliknięty button.

Prosty przykład (zmiana koloru tła - zamiana na Properties.Resources ... leży już w Twojej gestii smiley)

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private static Button menu_last_clicked;
        
        public Form1()
        {
            InitializeComponent();

            /*
            button1.Click += new EventHandler(menuButton_Click);
            button2.Click += new EventHandler(menuButton_Click);
            button3.Click += new EventHandler(menuButton_Click);
            button4.Click += new EventHandler(menuButton_Click);
            */

            foreach (Button button in new Button[] { button1, button2, button3, button4 })
            {
                button.Click += new EventHandler(menuButton_Click);
            }
        }

        private void menuButton_Click(object sender, EventArgs e)
        {
            Button menu_current_clicked = (Button)sender;

            Color color = Color.Transparent; // domyślny gdy niekliknięty
            if (menu_last_clicked != null) menu_last_clicked.BackColor = color;

            switch (menu_current_clicked.Name.ToString())
            {
                case "button1": color = Color.Gold; break;
                case "button2": color = Color.Red; break;
                case "button3": color = Color.ForestGreen; break;
                case "button4": color = Color.BlueViolet; break;
            }

            menu_current_clicked.BackColor = color;
            menu_last_clicked = menu_current_clicked;
        }
    }
}

 

komentarz 20 kwietnia 2023 przez VBService Ekspert (255,320 p.)

Analogicznie możesz przypisać też jedno zdarzenie MouseHover i MouseLeave wink

 

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private static Button menu_last_clicked;
        
        public Form1()
        {
            InitializeComponent();

            foreach (Button button in new Button[] { btnIncome, button2, button3, button4 })
            {
                button.Click += new EventHandler(menuButton_Click);
                button.MouseHover += new EventHandler(menuButton_MouseHover);
                button.MouseLeave += new EventHandler(menuButton_MouseLeave);
            }
        }

        private void menuButton_Click(object sender, EventArgs e)
        {
            Button menu_current_clicked = (Button)sender;

            ...
            menu_last_clicked = menu_current_clicked;
        }

        private void menuButton_MouseHover(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
            Button button = (Button)sender;

            Image image;
            switch (button.Name.ToString())
            {
                case "btnIncome": image = Properties.Resources.income_btn_hover; break;
                ...
            }
            if (image != null) button.Image = image;
        }

        private void menuButton_MouseLeave(object sender, EventArgs e)
        {
            Cursor = Cursors.Default;
            Button button = (Button)sender;

            Image image;
            switch (button.Name.ToString())
            {
                case "btnIncome": image = Properties.Resources.income_btn_normal; break;
                ...
            }
            if (image != null) button.Image = image;
        }
    }
}

 

komentarz 27 kwietnia 2023 przez Mati336 Użytkownik (560 p.)

Cholera Wielkie dzięki za pomoc ale ani jedno ani drugie mi nie działa :(

W pierwszym się włączają różne kolory a przerobiłem to tak (dla uproszczenia dla dwóch buttonów):



namespace button1
{
    public partial class Form1 : Form
    {

        private static Button menu_last_clicked;
        public Form1()
        {

            InitializeComponent();
            
            foreach (Button button in new Button[] { button1, button2})
            {
                button.Click += new EventHandler(menuButton_Click);
            }
        }

        private void menuButton_Click(object sender, EventArgs e)
        {
            Button menu_current_clicked = (Button)sender;

            Image image1 = Properties.Resources.buttonblue;
            if (menu_last_clicked != null) menu_last_clicked.Image = image1;

            switch (menu_current_clicked.Name.ToString())
            {
                case "button1": image1 = Properties.Resources.buttongreen; break;
                case "button2": image1 = Properties.Resources.buttonred; break;                   
            }

            menu_current_clicked.Image = image1;
            menu_last_clicked = menu_current_clicked;
        }
    }
}

plik_c#

A w drugim mam jakiś błąd dla image:

namespace buttontestimage
{
    public partial class Form1 : Form
    {

        private static Button menu_last_clicked;
        public Form1()
        {
            InitializeComponent();

            foreach (Button button in new Button[] { btnIncome, button2 })
            {
                button.Click += new EventHandler(menuButton_Click);
                button.MouseHover += new EventHandler(menuButton_MouseHover);
                button.MouseLeave += new EventHandler(menuButton_MouseLeave);
            }
        }

        private void menuButton_Click(object sender, EventArgs e)
        {
            Button menu_current_clicked = (Button)sender;

            menu_last_clicked = menu_current_clicked;
        }

        private void menuButton_MouseHover(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
            Button button = (Button)sender;

            Image image;
            switch (button.Name.ToString())
            {
                case "btnIncome": image = Properties.Resources.income_btn_hover; break;
                case "button2": image = Properties.Resources.income_btn_color; break;
            }
            if (image != null) button.Image = image;
        }

        private void menuButton_MouseLeave(object sender, EventArgs e)
        {
            Cursor = Cursors.Default;
            Button button = (Button)sender;

            Image image;
            switch (button.Name.ToString())
            {
                case "btnIncome": image = Properties.Resources.income_btn_normal; break;
                case "button2": image = Properties.Resources.income_btn_color; break;
            }
            if (image != null) button.Image = image;
        }
    }
}

plik_c#

gdzie tu jest błąd? W jednym lub drugim? :((

 

komentarz 27 kwietnia 2023 przez VBService Ekspert (255,320 p.)

Sprawdź (ustaw dla 3 button-ów dla lepszej prezentacji)

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

namespace button1
{
    public partial class Form1 : Form
    {

        private static Button menu_last_clicked;
        public Form1()
        {
            InitializeComponent();         

            foreach (Button button in new Button[] { button1, button2, button3 })
            {
                button.Click += new EventHandler(menuButton_Click);
                // domyślnym obrazkiem jest buttonblue.png
                button.Image = Properties.Resources.buttonblue;
            }
        }

        private void menuButton_Click(object sender, EventArgs e)
        {
            Button menu_current_clicked = (Button)sender;

            Image image = null;
            if (menu_last_clicked != null) menu_last_clicked.Image = Properties.Resources.buttonblue;

            switch (menu_current_clicked.Name.ToString())
            {
                case "button1": image = Properties.Resources.buttongreen; break;
                case "button2": image = Properties.Resources.buttonred; break;
                case "button3": image = Properties.Resources.buttongreen; break;
            }

            if (image != null) menu_current_clicked.Image = image;
            menu_last_clicked = menu_current_clicked;
        }
    }
}

 

chyba, że chcesz mieć default-owy wygląd dla button-ów

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

namespace button1
{
    public partial class Form1 : Form
    {

        private static Button menu_last_clicked;
        public Form1()
        {
            InitializeComponent();         

            foreach (Button button in new Button[] { button1, button2, button3 })
            {
                button.Click += new EventHandler(menuButton_Click);
            }
        }

        private void menuButton_Click(object sender, EventArgs e)
        {
            Button menu_current_clicked = (Button)sender;

            Image image = null;
            if (menu_last_clicked != null) menu_last_clicked.Image = null;

            switch (menu_current_clicked.Name.ToString())
            {
                case "button1": image = Properties.Resources.buttongreen; break;
                case "button2": image = Properties.Resources.buttonred; break;
                case "button3": image = Properties.Resources.buttonblue; break;
            }

            if (image != null) menu_current_clicked.Image = image;
            menu_last_clicked = menu_current_clicked;
        }
    }
}

 

1
komentarz 27 kwietnia 2023 przez Mati336 Użytkownik (560 p.)
Kurcze, VBService Królu Złoty, wielkie dzięki o to mi chodziło !!!! Za nic nie mogłem sobie z tym poradzić.

Podobne pytania

0 głosów
2 odpowiedzi 770 wizyt
pytanie zadane 30 czerwca 2020 w HTML i CSS przez asdsad Początkujący (420 p.)
0 głosów
1 odpowiedź 715 wizyt
pytanie zadane 8 lutego 2016 w C# przez marioosu Dyskutant (9,260 p.)
0 głosów
0 odpowiedzi 200 wizyt
pytanie zadane 20 maja 2020 w JavaScript przez Klaudiaaa Początkujący (390 p.)

92,775 zapytań

141,703 odpowiedzi

320,560 komentarzy

62,109 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...