Witam,
napisałem klasę, której zadaniem jest przechowywanie informacji (dokładniej: bitmap) o historii działań na kontrolce PictureBox. Jednakże klasa nie funkcjonuje zupełnie poprawnie.
Klasa działa w ten sposób, że po narysowaniu figury zostaje przesłana kopia bitmapy na stos, po narysowaniu kolejnej figury, na stos zostaje wysłana kolejna bitmapa. I teraz, gdy klikniemy przycisk Cofnij na kontrolce zostaje wyświetlona poprzednia bitmapa, gdy klikniemy kolejny raz, druga w kolejności (od wierzchołka stosu) bitmapa zostanie przesłana na ekran.
-
Prosiłbym o udzielenie rad, jak poprawić tę klasę. Konkretnie problemem jest to że przy pierwszym kliknięciu przycisku cofnij nic się nie dzieje (wiem nawet czemu - bitmapa na stosie jest tą którą aktualnie widzimy na ekranie), oraz kolejny problem to to że klasa gubi bitmapy podczas wielokrotnego cofanie / rysowania, po prostu jeśli coś narysujemy a już wcześniej cofaliśmy to odtworzy się zbyt daleka bitmapa.
-
Gdzie należy wstawić funkcję która wysyła bitmapy na stos. Obecnie mam ją podpiętą do zdarzenia onMouseUp kontrolki PictureBox, jednak nie wiem czy to dobry pomysł.
-
Czy można zaimplementować to w inny (lepszy, łatwiejszy) sposób ? Np. bez obsługi stosu.
Przedstawiam kawałki kodu:
public class Historia // klasa do obsługi operacji Cofnij/Ponów
{
private const int max = 5;
private Bitmap aktualnyObraz;
private Stack stosCofania;
private Stack stosPonawiania;
private bool czyCofano;
public Historia()
{
stosCofania = new Stack();
stosPonawiania = new Stack();
czyCofano = false;
}
public void Przechowaj(Bitmap obraz)
{
if (!czyCofano)
stosCofania.Push(obraz);
}
public Bitmap Cofaj()
{
if (stosCofania.Count > 0)
{
czyCofano = true;
aktualnyObraz = (Bitmap)stosCofania.Pop();
stosPonawiania.Push(aktualnyObraz);
czyCofano = false;
}
return aktualnyObraz;
}
public Bitmap Ponawiaj()
{
if (stosPonawiania.Count > 0)
{
aktualnyObraz = (Bitmap)stosPonawiania.Pop();
}
return aktualnyObraz;
}
public bool CzyMoznaCofac
{
get
{
return (stosCofania.Count > 0 ? true : false);
}
}
public bool CzyMoznaPonawiac
{
get
{
return (stosPonawiania.Count > 0 ? true : false);
}
}
}
}
private void cofnijToolStripMenuItem_Click(object sender, EventArgs e)
{
zapisanyStanObrazu = historia.Cofaj();
grafika = Graphics.FromImage(zapisanyStanObrazu);
pictureBox.Image = (Image)zapisanyStanObrazu;
pictureBox.Refresh();
cofnijToolStripMenuItem.Enabled = historia.CzyMoznaCofac;
}
private void ponówToolStripMenuItem_Click(object sender, EventArgs e)
{
zapisanyStanObrazu = historia.Ponawiaj();
grafika = Graphics.FromImage(zapisanyStanObrazu);
pictureBox.Image = (Image)zapisanyStanObrazu;
pictureBox.Refresh();
ponówToolStripMenuItem.Enabled = historia.CzyMoznaPonawiac;
}
private void pictureBox_MouseUp(object sender, MouseEventArgs e)
{
mouseUpLocation = e.Location;
if (rysuje)
{
grafika = Graphics.FromImage(zapisanyStanObrazu);
grafika.SmoothingMode = SmoothingMode.AntiAlias;
switch (paletaNarzedzi.dajNarzedzie())
{
// ...kod
}
historia.Przechowaj((Bitmap)pictureBox.Image); /////// <- TUTAJ WYSYŁAM NA STOS
grafika.Save();
// cofanie.Wyslij(zapisanyStanObrazu);
// pictureBox.Image = zapisanyStanObrazu;
rysuje = false;
cofnijToolStripMenuItem.Enabled = true;
}
}