Zmiana koloru tła wyłączonych elementów.

0

Cześć, napisałem program w c# pod net frameworka 3,5 i zastanawiam się jak zmienić kolory elementów zaznaczonych na czerwono. W internecie nic nie mogłem znaleźć, albo nie jak użyć kodu, który wklejają. Oto zdjęcie:

1234.png

Chodzi o kolor tła wyłączonego comboboxa, tekst wyłączonego checkboxa i sam kwadracik checkboxa, tak, aby nie dawało po oczach.

Dzięki.

0

To jest WinForms?
WPF?

0

Tak dokładnie - formularz Windows Forms

0

Spraw wygląda na prostą ale tak do końca nie jest potrzebujesz tak naprawdę przechwycić event odpowiadający za rysowanie i samemu narysować

        private void button1_Paint(object sender, PaintEventArgs e)
        {
            dynamic btn = (Button)sender;
            dynamic drawBrush = new SolidBrush(btn.ForeColor);
            dynamic sf = new StringFormat
            {
                Alignment = StringAlignment.Center,
                LineAlignment = StringAlignment.Center
            };
            btn.Text = string.Empty;
            e.Graphics.DrawString("Oblicz używając wymiarów X i Y", btn.Font, drawBrush, e.ClipRectangle, sf);
            drawBrush.Dispose();
            sf.Dispose();
        }

       private void button1_EnabledChanged(object sender, EventArgs e)
        {
            dynamic btn = (Button)sender;
            btn.ForeColor = btn.Enabled == false ? Color.Green : Color.Black;
        }

Minus jest taki ,że nie odwołasz się potem do button.Text no ale chyba nie powinno to być nie zbędne.

0

Cześć, próbuję uruchomić kod, lecz napotkałem kłopot.
Pokazuje się błąd:

Brak wymaganej przez kompilator składowej „Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create.

Wszedłem w Projekt -> Zarządzaj pakietami NuGet -> wyszukałem Microsoft.CSharp.dll.
Pokazuje się błąd:

Nie można zainstalować pakietu „Microsoft.CSharp 4.7.0”. Próbujesz zainstalować ten pakiet w projekcie, którego celem jest „.NETFramework,Version=v3.5”, ale pakiet nie zawiera żadnych odwołań zestawu ani plików zawartości zgodnych z tą strukturą. Aby uzyskać więcej informacji, skontaktuj się z autorem pakietu.

Znalazłem w internecie, że dynamic można użyć od NET 4.0.

0

Tak chyba prościej:

        private void textBox1_EnableChanged(object sender, EventArgs e)
        {
            textBox2.BackColor = textBox2.Enabled ? Color.Yellow : Color.Red;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox2.Enabled = !textBox2.Enabled;
        }
0

Znalazłem w internecie jak narysować CheckBox. Ma bardzo dużo opcji do konfiguracji. Autor pomysłu nie wkleił kodu i 3,5 godziny klepałem wszystko razem z nim z filmu na YouTubie, ale cóż - chciałem mieć ładnie. No pojawił się kłopot - niestety jest on bardzo wolny. Jeśli mógłby ktoś zobaczyć byłbym wdzięczny.

Są jeszcze inne niedociągnięcia:
a) zaznacza CheckBox gdy nie przekazuje w programie, że jest zaznaczony po kliknięciu na tekst (widać na filmie).
b) przydała by się opcja lub wskazówka jak dodać jeszcze kolor disabled Checkbox.

Bardzo mi się spodobała forma praktycznie dowolnego edytowania pod swoje potrzeby. Niestety tak wolna reakcja dyskwalifikuje ten cały wysiłek ;p.

Oto pliki, które wykonałem: Test.zip

.

gswidwa1 napisał(a):

Tak chyba prościej:

        private void textBox1_EnableChanged(object sender, EventArgs e)
        {
            textBox2.BackColor = textBox2.Enabled ? Color.Yellow : Color.Red;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox2.Enabled = !textBox2.Enabled;
        }

Coś nie mogę tego przełożyć na checkBox - z textBox działa fajnie - pewnie znowu coś mieszam.
Użyłem takiego kodu:

checkBox10.ForeColor = checkBox10.Enabled ? Color.Yellow : Color.Red;
0

Mój przykład działa dla wszystkich kontrolek. Pokaz kod checkboxa

0
        private void checkBox10_EnabledChanged(object sender, EventArgs e)
        {
            checkBox10.ForeColor = checkBox10.Enabled ? Color.Yellow : Color.Red;
        }

        private void comboBox1_EnabledChanged(object sender, EventArgs e)
        {
            comboBox1.BackColor = comboBox1.Enabled ? Color.Yellow : Color.Red;
        }

        private void checkBox11_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox11.Checked == false)
            {
                checkBox10.Enabled = false;
                comboBox1.Enabled = false;
            }
            else
            {
                checkBox10.Enabled = true;
                comboBox1.Enabled = true;
            }
        }

Zmienia kolor tekstu tylko dla włączonego checkBox oraz kolor tła dla włączonego combobox.
Niestety przy wyłączonych kontrolkach nic się nie zmienia i zostają domyślne ustawienia.
Dodam, że tło zmienia okej - (checkBox10.BackColor), niestety napis po wyłączeniu jest nadal czarny.

0
        private void button1_Paint(object sender, PaintEventArgs e)
        {
            Button btn = (Button)sender;
            SolidBrush drawBrush = new SolidBrush(btn.ForeColor);
            StringFormat sf = new StringFormat
            {
                Alignment = StringAlignment.Center,
                LineAlignment = StringAlignment.Center
            };
            btn.Text = string.Empty;
            e.Graphics.DrawString("Oblicz używając wymiarów X i Y", btn.Font, drawBrush, e.ClipRectangle, sf);
            drawBrush.Dispose();
            sf.Dispose();
        }

       private void button1_EnabledChanged(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            btn.ForeColor = btn.Enabled == false ? Color.Green : Color.Black;
        }

Po prostuj użyj kodu który ci podałem tylko wyrzuć dynamic pisałem na szybko z palca więc nie wiem czy zadziała

0

Dzięki! Coś zadziałało - drobny problem z tekstem tylko.

        private void checkBox10_Paint(object sender, PaintEventArgs e)
        {
            CheckBox btn = (CheckBox)sender;
            SolidBrush drawBrush = new SolidBrush(btn.ForeColor);
            StringFormat sf = new StringFormat
            {
                Alignment = StringAlignment.Center,
                LineAlignment = StringAlignment.Center
            };
            btn.Text = " ";
            e.Graphics.DrawString("TEEEEEESTTTT", btn.Font, drawBrush, e.ClipRectangle, sf);
            drawBrush.Dispose();
            sf.Dispose();
        }

        private void checkBox10_EnabledChanged(object sender, EventArgs e)
        {
            CheckBox btn = (CheckBox)sender;
            btn.ForeColor = btn.Enabled == false ? Color.Green : Color.Red;
        }

Załączam plik CheckBox.cs z paczki Test.zip. CheckBox.cs

0

Musiałbym dokładnie sprawdzić jak się rysuje cheackboxy ale można też zastosować mały trick zamiast wyłączać cheackboxa można po prostu wyłączyć mu zaznaczanie

 checkBox1.AutoCheck = false;

Nie wiem na ile cię takie rozwiązanie satysfakcjonuje.

0

A tak z ciekawości: nie chcesz przerobić ten projekt na wpf? Jest tam dużo więcej opcji i wszystko jest w sumie "lepsiejsze". W tym to co chcesz uzyskać to kilka linijek kodu
Dla zachęty:

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <CheckBox Content="Mój checkbox">
            <CheckBox.Style>
                <Style TargetType="{x:Type CheckBox}">
                    <Setter Property="Foreground" Value="Red"/>
                    <Style.Triggers>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="#FFADADAD"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </CheckBox.Style>
        </CheckBox>
    </Grid>
</Window>

Enabled:
screenshot-20210905221503.png
Disabled:
screenshot-20210905221607.png

p.s. Naprawdę warto. Jak gdzieś utkniesz zawsze możesz wrócić tutaj z pytaniem ;D

0

Wolałbym zostać już przy bieżącej formie. Dostałem taką wskazówkę na jednym z zagranicznych forów:

Replace the IsChecked Field with a public Property. In the setter, 
call a virtual method (say OnCheckedChanged) to invoke a custom event handler (say CheckedChanged). 
Handle this event in your implementation to do whatever you need whenever the check state changes.

Czy ktoś rozumie o co chodzi? :)

0

Generalnie jest to do zrobienia ale jest troszkę dłubania i zgadywania (pewnie da się to też policzyć) ale po kolei na początku tak jak już pisałem musisz zrobić taką funkcję

   private void checkBox1_EnabledChanged(object sender, EventArgs e)
        {
            CheckBox checkbox = (CheckBox)sender;
            
            checkbox.ForeColor = checkbox.Enabled ? Color.Yellow : Color.Red;
        }

Następnie też jak ci wcześniej pisałem musisz namalować sobie twojego checkBoxa ale tu niestety nie jest lekko łatwo i przyjemnie bo to dosyć złożona w rysowaniu kontrolka

 private void checkBox1_Paint(object sender, PaintEventArgs pevent)
        {
            pevent.Graphics.Clear(BackColor);

            using (SolidBrush brush = new SolidBrush(checkBox1.ForeColor))
                pevent.Graphics.DrawString("Oblicz używając wymiarów X i Y", Font, brush, 27, 4);

            Point pt = new Point(10, 0);
            Rectangle rect = new Rectangle(pt, new Size(16, 16));

            pevent.Graphics.FillRectangle(Brushes.Beige, rect);

            if (checkBox1.Checked)
            {
                using (SolidBrush brush = new SolidBrush(Color.Blue))
                using (Font wing = new Font("Wingdings", 18f))
                    pevent.Graphics.DrawString("ü", wing, brush, 3, -2);
            }
            pevent.Graphics.DrawRectangle(Pens.DarkSlateBlue, rect);

            Rectangle fRect = ClientRectangle;

            if (Focused)
            {
                fRect.Inflate(-1, -1);
                using (Pen pen = new Pen(Brushes.Gray) { DashStyle = DashStyle.Dot })
                    pevent.Graphics.DrawRectangle(pen, fRect);
            }
        }

U mnie wygląda to tak
screenshot-20210917204345.png

A po dezaktywizacji
screenshot-20210917204410.png

Nie wygląda to idealnie ale sam musisz sobie to wystylować bo to tylko kwestia zabawy a ja zarobiony człowiek jestem ;)

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