Avatar
GunSpawn
Redaktor
Avatar
GunSpawn:

Zdravím všechny,
potřebuju poradit jak vykreslit logo přes User Control tak, aby tam 1-2 vteřiny byla černá obrazovka, potom by se postupně vykreslilo logo a potom zase zmizelo. Celkem by to trvalo tak 10-12 vteřin.
Dík všem GunSpawn

Odpovědět 31.8.2014 16:41
Save early, save often, save everything, everywhere, everytime.
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na Jan Vargovský
GunSpawn:

co myslíš? Jako Windows Forms Application

Editováno 31.8.2014 17:25
Nahoru Odpovědět 31.8.2014 17:25
Save early, save often, save everything, everywhere, everytime.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na GunSpawn
Jan Vargovský:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Color c = Color.Red;
        int t1 = 2;
        Image im = Image.FromFile("Untitled.png");
        int t2 = 4;
        SplashScreen splashScreen = new SplashScreen(ClientSize, c, t1, im, t2);

        this.ShowSplashScreen(splashScreen);
    }
}

public static class SplashScreenExtenstion
{
    public static void ShowSplashScreen(this ContainerControl control, SplashScreen splashScreen)
    {
        PictureBox pb = new PictureBox() { Size = control.Size };
        int time = 0;
        pb.Paint += (o, e) =>
            {
                splashScreen.Draw(e.Graphics, time);
            };
        control.Controls.Add(pb);
        System.Timers.Timer t = new System.Timers.Timer(1000);
        t.Elapsed += (o, e) =>
            {
                if (time >= splashScreen.TotalTime)
                {
                    t.Dispose();
                    pb.Invoke(new Action(() => control.Controls.Remove(pb)));
                }
                pb.Invoke(new Action(() => pb.Refresh()));
                time++;
                //Debug.WriteLine(time);
            };
        t.Start();
    }
}

public class SplashScreen
{
    private Size size;
    private Color background;
    private Image image;
    private int t1, t2;

    public int TotalTime
    {
        get { return t1 + t2; }
    }

    public SplashScreen(Size size, Color background, int t1, Image image, int t2)
    {
        this.size = size;
        this.background = background;
        this.image = image;
        this.t1 = t1;
        this.t2 = t2;
    }

    public void Draw(Graphics g, int time)
    {
        if (time < t1)
            g.FillRectangle(new SolidBrush(background), 0, 0, size.Width, size.Height);
        else if (time >= t1 && time <= TotalTime)
            g.DrawImage(image, 0, 0, size.Width, size.Height);
    }
}

Asi by to šlo zredukovat na méně řádků a udělat to jednodušeji, kdyžtak ti to dá aspoň nápad jak to realizovat.

Editováno 31.8.2014 18:21
 
Nahoru Odpovědět  +1 31.8.2014 18:18
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

Jak na to koukám tak tam to uprav takhle

if (++time >= splashScreen.TotalTime)
{
    t.Dispose();
    pb.Invoke(new Action(() => control.Controls.Remove(pb)));
}
pb.Invoke(new Action(() => pb.Refresh()));
 
Nahoru Odpovědět  +1 31.8.2014 18:22
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na Jan Vargovský
GunSpawn:

SplashScreen splashScreen = new SplashScreen(Cli­entSize, c, t1, im, t2);

Co tam znamená to "im"

Dobrý už mi to došlo

Editováno 31.8.2014 18:28
Nahoru Odpovědět 31.8.2014 18:28
Save early, save often, save everything, everywhere, everytime.
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na Jan Vargovský
GunSpawn:

Díky moc, že si mi až takhle pomohl
a mám pár otázek
1)pb.Paint += (o, e) => "a tohle" t.Elapsed += (o, e) => "a tohle" pb.Invoke(new Action);(co to dělá)
2)g.FillRectan­gle(new SolidBrush(bac­kground), 0, 0, size.Width, size.Height); (jakej význam tam ná ten SolidBrush a co to je)

Nahoru Odpovědět 31.8.2014 18:36
Save early, save often, save everything, everywhere, everytime.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na GunSpawn
Jan Vargovský:
  1. Annonyní metoda, lambda výraz, předání vykonání metody do daného vlákna
  2. Normální vytvoření instance na typ Brush, který po tobě chce ta metoda, nemůžu vytvořit new Brush(...), protože ta třída je abstraktní.
 
Nahoru Odpovědět 31.8.2014 19:13
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na Jan Vargovský
GunSpawn:

Tak jsem to tam dal, vše nastavil opravil errory, funguje to, ale když chci potom načíst Menu, tak se tam nedostanu. Tady je kód tý třídy, přes kterou to volám.

public partial class HerniOkno : Form
    {
        HlavniNabidka Nabidka;
        Logo Logo;


        public HerniOkno()
        {
            InitializeComponent();
            this.ClientSize = new Size(800, 600);
            Logo = new Logo();
            Logo.Parent = this;
            Logo.Dock = DockStyle.Fill;
            Logo.Show();
            Nabidka = new HlavniNabidka();
            Nabidka.Parent = this;
            Nabidka.Dock = DockStyle.Fill;
            Nabidka.Show();
            Nabidka.PolozkaVybrana += Nabidka_PolozkaVybrana;
        }

        private void Nabidka_PolozkaVybrana(PolozkyNabidky p)
        {
            switch (p)
            {
                case PolozkyNabidky.NovaHra:
                    Nabidka.Dispose();
                    Nabidka = null;
                    HerniSvet hra = new HerniSvet(this);
                    break;
                case PolozkyNabidky.Konec:
                    Application.Exit();
                    break;
            }
        }





    public class HerniSvet
    {
        Image deska = CloveceNezlobSe.Properties.Resources.Clov_Image;
        Image kostka1 = CloveceNezlobSe.Properties.Resources.Kostka1;
        Image kostka2 = CloveceNezlobSe.Properties.Resources.Kostka2;
        Image kostka3 = CloveceNezlobSe.Properties.Resources.Kostka3;
        Image kostka4 = CloveceNezlobSe.Properties.Resources.Kostka4;
        Image kostka5 = CloveceNezlobSe.Properties.Resources.Kostka5;
        Image kostka6 = CloveceNezlobSe.Properties.Resources.Kostka6;

        Random generatorCisel = new Random();
        private int cisloKostky = 0;

        public HerniSvet(Form f)
        {
            HerniOkno = f;
            HerniOkno.Paint += PaintMapa;
        }

        Form HerniOkno;

        private void VykresliHerniPlochu(Graphics g)
        {
            g.DrawImage(deska, 0, 0);

        }

        private void HodKostkou(Graphics g)
        {
            cisloKostky = generatorCisel.Next(1, 7);
            switch (cisloKostky)
            {
                case 1:
                    g.DrawImage(kostka1, 620, 150);
                    break;
                case 2:
                    g.DrawImage(kostka2, 620, 150);
                    break;
                case 3:
                    g.DrawImage(kostka3, 620, 150);
                    break;
                case 4:
                    g.DrawImage(kostka4, 620, 150);
                    break;
                case 5:
                    g.DrawImage(kostka5, 620, 150);
                    break;
                case 6:
                    g.DrawImage(kostka6, 620, 150);
                    break;
                default:
                    MessageBox.Show("Něco se stalo špatně.");
                    Application.Exit();
                    break;
            }
        }

        private void PaintMapa(object sender, PaintEventArgs e)
        {
            VykresliHerniPlochu(e.Graphics);
            HodKostkou(e.Graphics);
        }
    }
    }
}

V menu je akorát Nová hra a konec

Editováno 31.8.2014 19:32
Nahoru Odpovědět 31.8.2014 19:32
Save early, save often, save everything, everywhere, everytime.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na GunSpawn
Jan Vargovský:

Nechápu co máš za problém...

 
Nahoru Odpovědět 31.8.2014 19:42
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na Jan Vargovský
GunSpawn:

Po tom vykreslení toho loga se nezobrazí menu, zatím jsem to upravil takhle:
Logo.Show();
Logo.Hide(); //tohle jsem přidal
Nabidka = new HlavniNabidka();

ale teď zas nejde to logo, tak jestli by se nedal přidat ten čas, co se vykresluje to logo do argumentů (to vlastně nejde) nebo někam jinam, nebo nějak jinak upravit

Editováno 31.8.2014 19:52
Nahoru Odpovědět 31.8.2014 19:51
Save early, save often, save everything, everywhere, everytime.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na GunSpawn
Jan Vargovský:

Nevím co je nějaké tvoje Logo.

 
Nahoru Odpovědět 31.8.2014 19:56
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na Jan Vargovský
GunSpawn:

název uživatelského prvku, který si mi naprogramoval (ještě jednou děkuju)

Nahoru Odpovědět 31.8.2014 20:00
Save early, save often, save everything, everywhere, everytime.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na GunSpawn
Jan Vargovský:

To logo je právě děláno tak, že na to nepotřebuješ žádný vlastní usercontrol. Trošku jsem koukal na hierarchii těch controlů a můžeš si tam změnit http://pastebin.com/nAY6JQcs.

Pak si můžeš kdekoliv zavolat, aby se ti tam zobrazilo to logo, i kdyby to mělo být na textboxu nebo i labelu. Ty to asi budeš používat na nějaký ten Form.

Btw, k té tvojí chybě, to se ti nezobrazí nějaké tvoje věci nebo co je špatně, co ti tam chybí?

Editováno 31.8.2014 20:22
 
Nahoru Odpovědět 31.8.2014 20:20
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na Jan Vargovský
GunSpawn:

jo používám to jako Form, jde o to, že se buď zobrazí logo, a pak je jen černé pozadí a nebo to jede normálně, ale bez loga

Nahoru Odpovědět 31.8.2014 20:28
Save early, save often, save everything, everywhere, everytime.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na GunSpawn
Jan Vargovský:

Můžeš ukázat tu třídu Logo? Já to dělal tak, že to nemusíš maskovat za nějaký usercontrol. Jen bys udělal

public HerniOkno()
         {
             InitializeComponent();
             this.ClientSize = new Size(800, 600);
             Nabidka = new HlavniNabidka();
             Nabidka.Parent = this;
             Nabidka.Dock = DockStyle.Fill;
             Nabidka.Show();
             Nabidka.PolozkaVybrana += Nabidka_PolozkaVybrana;
             SplashScren sc = new SplashScreen(...);
             this.ShowSplashScreen(sc);
         }
Editováno 31.8.2014 20:34
 
Nahoru Odpovědět  +1 31.8.2014 20:32
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na Jan Vargovský
GunSpawn:
public partial class Logo : UserControl
    {
        public Logo()
        {
            InitializeComponent();
            this.ClientSize = new Size(800, 600);
            Color c = Color.Black;
            int t1 = 2;
            this.BackColor = Color.Black;
            int t2 = 4;
            Image logo = CloveceNezlobSe.Properties.Resources.Logo;
            SplashScreen splashScreen = new SplashScreen(ClientSize, c, t1, logo, t2);

            this.ShowSplashScreen(splashScreen);
        }

    }
    public static class SplashScreenExtenstion
    {
        public static void ShowSplashScreen(this ContainerControl control, SplashScreen splashScreen)
        {
            PictureBox pb = new PictureBox() { Size = control.Size };
            int time = 0;
            pb.Paint += (o, e) =>
            {
                splashScreen.Draw(e.Graphics, time);
            };
            control.Controls.Add(pb);
            System.Timers.Timer t = new System.Timers.Timer(1000);
            t.Elapsed += (o, e) =>
            {
                if (++time >= splashScreen.TotalTime)
                {
                    t.Dispose();
                    pb.Invoke(new Action(() => control.Controls.Remove(pb)));
                }
                pb.Invoke(new Action(() => pb.Refresh()));
                time++;
                //Debug.WriteLine(time);
            };
            t.Start();
        }
    }

    public class SplashScreen
    {
        private Size size;
        private Color background;
        private Image image;
        private int t1, t2;

        public int TotalTime
        {
            get { return t1 + t2; }
        }

        public SplashScreen(Size size, Color background, int t1, Image image, int t2)
        {
            this.size = size;
            this.background = background;
            this.image = image;
            this.t1 = t1;
            this.t2 = t2;
        }

        public void Draw(Graphics g, int time)
        {
            if (time < t1)
                g.FillRectangle(new SolidBrush(background), 0, 0, 800, 300);
            else if (time >= t1 && time <= TotalTime)
                g.DrawImage(image, 0, 150, 800, 300);
        }
    }
}
Nahoru Odpovědět 31.8.2014 20:39
Save early, save often, save everything, everywhere, everytime.
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na Jan Vargovský
GunSpawn:

Už to funguje, konečně. Dík za pomoc.

Nahoru Odpovědět 31.8.2014 20:50
Save early, save often, save everything, everywhere, everytime.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.