Zmiana przezroczystości obrazka. Rozjasnianie buttona

0

No więc chciałem, by po najechaniu na button, on powoli się rozjasniał. I zrobiłem sobie taki kod, tylko robią się problemy, bo tych buttonów u mnie jest bardzo dużo - jest to gra Saper.
Fragmenty kodu odpowiedzialne za rozjaśnianie:

Bitmap[] obrazki = new Bitmap[255]; 

//W Form_Load następujące rzeczy sie dzieja:
for (int i = 0; i < obrazki.Length; i++)
            {
                obrazki[i] = SetOpacity(Properties.Resources.button, i);
            }

//teraz funkcja o której mowa

public Bitmap SetOpacity(Bitmap img, int opacity) // ta funkcja troche "trwa" dlatego zrobiłem sobie tablice 255 elementow z gotowymi obrazkami
        {
            Bitmap b = new Bitmap(img.Width, img.Height);
            for (int i = 0; i < img.Width; i++)
            {
                for (int j = 0; j < img.Height; j++)
                {
                    b.SetPixel(i, j, Color.FromArgb(opacity, img.GetPixel(i, j)));
                }
            }

            return b;
        }

//a teraz eventy najechania na przyciski
private void button_MouseEnter(object sender, EventArgs e)
        {
            Button b = (Button)sender;
            if (b.Text == "")
            {
                b.ForeColor = Color.Black;
                for (int i = 0; i < 255; i++)
                {
                    b.Image = obrazki[i];
                    b.Refresh();
                    //System.Threading.Thread.Sleep(10);
                    
                }
            }
        }
        private void button_MouseLeave(object sender, EventArgs e)
        {
            Button b = (Button)sender;
            b.ForeColor = Color.White;
            b.Image = null;
            b.Refresh();
        }

 

No i problem jest taki, że nie wiem jak spowolnić ten proces rozjaśniania. Widać linijkę Thread.Sleep() ale ona zawiesza wątek. Czy powinienem zrobić osobny wątek który będzie odpowiadał za rozjaśnianie? I tam dać Thread.Sleep() żeby spowolnić?

Edit: proszę jeszcze o ocenę tego sposobu zmiany przezroczystości i ewentualne sugestie, jak inaczej to rozegrać

1

Wydaje mi się, że za bardzo kombinujesz. Może tak lepiej? Bez zbędnych rzeczy:

            Image img = Image.FromFile("...");
            Bitmap bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics graphics = Graphics.FromImage(bitmap);
            ColorMatrix cmatrix = new ColorMatrix();
            cmatrix.Matrix33 = 0.3f;
            ImageAttributes imageAttributes = new ImageAttributes();
            imageAttributes.SetColorMatrix(cmatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
            graphics.DrawImage(img, new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                0, 0, img.Width, img.Height, GraphicsUnit.Pixel, imageAttributes);
            pictureBox1.Image = bitmap;
            graphics.Dispose();

            // from http://howtoideas.net/how-to-set-image-opacity-using-c
0

Dzięki, to faktyczne ułatwienie, jeszcze przytoczę drugie pytanie:
No i problem jest taki, że nie wiem jak spowolnić ten proces rozjaśniania. Widać linijkę Thread.Sleep() ale ona zawiesza wątek. Czy powinienem zrobić osobny wątek który będzie odpowiadał za rozjaśnianie? I tam dać Thread.Sleep() żeby spowolnić?

0

Można, a można i w Timerze. A ty robisz rozjaśnianie w sensie z czarnego aż do pojawienia się właściwego obrazka czy przezroczystość?

0

Timer z System.Threading czy System.Timers?
A co do Twojego pytania, to mam w buttonie BackgroundImage, a na tym się pojawia (efekt przejścia) Image.

ed. użyłem w końcu jeszcze innego, bo Windows.Forms.Timer'a :D nie miałem pojęcia że tyle ich jest.

1

W sumie każdy jest praktycznie taki sam. Jak używasz tak ot, to estetyczniej jest wziąć ten z System.Timers, jak na WinForms, wstawiasz poprzez kreator to System.Windows.Forms.

1

Jeśli jeszcze nie jest za późno, to proponuję przejście z WinForms na WPF - sam pisałem podobną aplikację z przeźroczystością i mogę Cię w 100% zapewnić, że w WPF zrobisz to szybciej, lepiej i będzie ładniej wyglądało.

0

Dziwnie to wygląda. Jakby pisane w xml'u. To ma mi zastąpić WinForms?
I drugie pytanie, czy nauka tego przybliży mnie do pisania aplikacji webowych, bo takich też pisać bym się chciał nauczyć?

Aa, i jesli mozesz zapodaj jakis screen z Twojej aplikacji w WPF.

0
ubuntuser napisał(a)

Dziwnie to wygląda. Jakby pisane w xml'u. To ma mi zastąpić WinForms?

Owszem, może.

I drugie pytanie, czy nauka tego przybliży mnie do pisania aplikacji webowych, bo takich też pisać bym się chciał nauczyć?

I tak, i nie.

0

A do robienia UI polecacie edytor w Visual Express? Bo Expression Blend jest płatny, więc nie użyję.
W ogóle cały ten XAML mnie przeraża. Wygląda strasznie nieobiektowo.

0
ubuntuser napisał(a)

W ogóle cały ten XAML mnie przeraża. Wygląda strasznie nieobiektowo.

Uważasz, że jedna metoda, która tworzy dziesiątki obiektów i ustawia im dziesiątki właściwości wygląda "obiektowo"? A tak jest w WinFormsach.
W XAMLu od razu widać strukturę powstającego GUI. A poza tym, przecież nie trzeba go pisać ręcznie, nie?

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