Diskuze: Vykreslení loga přes User Control
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 18 zpráv z 18.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
co myslíš? Jako Windows Forms Application
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.
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()));
SplashScreen splashScreen = new SplashScreen(ClientSize, c, t1, im, t2);
Co tam znamená to "im"
Dobrý už mi to došlo
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.FillRectangle(new SolidBrush(background), 0, 0, size.Width,
size.Height); (jakej význam tam ná ten SolidBrush a co to je)
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
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
název uživatelského prvku, který si mi naprogramoval (ještě jednou děkuju)
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í?
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
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);
}
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);
}
}
}
Zobrazeno 18 zpráv z 18.