Har endnu en gang brug for jeres hjælp, skal have lavet en windows app. hvor der er tre bokse med rød, gul, grøn også en knap der kan gøre så den først bliver grøn med første tryk og på det andet tryk gul og sidste rød, og det skal den så kunne fortsætte med, hvis nogen bare kan give mig et godt hint eller lignende, ved ikke lige hvordan jeg skal bære mig ad.
Prøv først at tænke dig en klasse der repræsenterer selve trafiklyset. Tænk over hvordan det skal _opføre_ sig, og hvordan det skal _se ud_.
F.eks. hvis man kalder en metode (Shift()?), så skal lyset skifte fra en (eller flere) farve(r) til en anden, alt efter hvordan status er. Er lyset rødt, og metoden Shift kaldes, skal den gule lampe også tændes. Er Lyset rødt/gult og metoden shift kaldes, skal den røde og gule slukkes og den grønne tændes. Osv.
Nu kan vi så se, at selve signalet kan have 4 status. rødt, rødt/gult, grønt, gult. (en oplagt mulighed til en enum - som man evt. kunne udstille som en readonly property) :)
Hvordan skal det så se ud? Tjoeh.. Du kunne starte med at nedarve fra klassen Control. Så har du en masse basisfunktionalitet for selve kontrollen. Så kan du jo overveje om det skal være horisontalt eller vertikalt. (Eller om det skal kunne indstilles separat) Del højden op i tre dele. Den øverste tredjedel bruger du til at tegne en rød fyldt cirkel i, den midterste til at tegne en gul fyldt cirkel i og den sidste nederste tredjedel til at tegne en grøn fyldt cirkel i. Alt efter hvordan status i signalet er (som du jo ved ud fra den property vi talte om ovenfor), tegner du de cirkler du skal i den override'de OnPaint(..) metode.
Ok - nu skulle du vist have nok til at komme i gang? Ellers må du lige prøve at skrive, hvad du behøver mere.
Mange tak for forklaringen, meget af det er jeg med på, men er ikke ligefrem en haj til c#, så er nok nød til at se noget kode for at kunne forstå sammenhængen.
Her har jeg prøvet at lave et hurtigt eksempel. Jeg tror ikke du finder det meget simplere :)
En enum TrafficLightStatus som bruges til at beskrive status på trafiklyset. En klasse TrafficLight, som repræsenterer et trafiklys. En klasse TestForm som bruges til at teste TrafficLight-kontrollen.
using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms;
namespace B.Testing {
public enum TrafficLightStatus { Red, RedYellow, Green, Yellow }
public class TrafficLight : Control {
private TrafficLightStatus status;
public TrafficLightStatus Status { get { return status; } }
public void Shift() { if (status == TrafficLightStatus.Yellow) { status = TrafficLightStatus.Red; } else { status++; } Invalidate(); }
protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, SystemColors.ControlDark, ButtonBorderStyle.Dotted); if (status == TrafficLightStatus.Red || status == TrafficLightStatus.RedYellow) { DrawRedLight(e.Graphics); } if (status == TrafficLightStatus.Yellow || status == TrafficLightStatus.RedYellow) { DrawYellowLight(e.Graphics); } if (status == TrafficLightStatus.Green) { DrawGreenLight(e.Graphics); } }
public static void Main() { Application.Run(new TestForm()); } } }
/B :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.