c#畫圖后怎樣撤銷一步代碼怎么寫啊
uj5u.com熱心網友回復:
滑鼠按下和抬起之間的所有滑鼠移動的坐標都放在一個陣列里,將這個陣列放到一個集合里,撤銷時,洗掉這個集合的最后一個陣列uj5u.com熱心網友回復:
命令模式,命令模式可以撤銷uj5u.com熱心網友回復:
可參看drawtool,大概就是存盤每次動作的所有圖形,當撤銷時即恢復到上一次動作存盤的圖形
uj5u.com熱心網友回復:
保存每一步!uj5u.com熱心網友回復:
對的,保存每一步,當你撤銷的時候,把最后一步 popup 出 step stack,然后從頭到尾把所有的操作再畫一遍uj5u.com熱心網友回復:
記錄步驟串列,取消上一次步驟資料,重畫~uj5u.com熱心網友回復:
能說說具體邏輯是什么樣的么。
1、將原始圖片拷貝一份,對拷貝圖進行繪圖,每次繪圖都保存。
2、開始撤銷,將保存的繪圖步驟,最后一步刪掉。
3、將原始圖片再拷貝一份,對拷貝圖進行繪圖,將之前保存的步驟遍歷一遍。
……
想問下,是這個邏輯么?
我現在有一個類似的情況,就是按照這個邏輯做的,非常卡。
場景如下:
有一個圖片,我要實作選區功能,就要在圖片上,畫一個虛線的矩形。
而我希望滑鼠移動的時候,實時重繪圖片上的選區大小。
這時候,我滑鼠每移動一點,都要復制一張原圖,在復制圖上畫一個矩形。
滑鼠才移動幾十個像素,圖片就復制了幾十張了。
雖然有釋放操作,不用擔心記憶體問題,但是畫板上感覺非常卡。
具體代碼如下, 求指點:
private void picboxTotal_MouseMove(object sender, MouseEventArgs e)
{
//選中區域畫虛線矩陣
if(e.Button == MouseButtons.Left && this.picboxTotal.Image != null)
{
//將起始和結束坐標重組,找出左上角的起始坐標和右下角的結束坐標
Point startPoint = new Point(Math.Min(downStart.X, e.Location.X), Math.Min(downStart.Y, e.Location.Y));
Point endPoint = new Point(Math.Max(downStart.X, e.Location.X), Math.Max(downStart.Y, e.Location.Y));
//選中區域大小
Size selectedSize = new Size(Math.Abs(downStart.X - e.Location.X), Math.Abs(downStart.Y - e.Location.Y));
//起始坐標大于0,結束坐標小于圖片大小,也就是圖內
if (startPoint.X >= 0 && startPoint.Y >= 0
&& endPoint.X < this.PicTotalBitmap.Size.Width
&& endPoint.Y < this.PicTotalBitmap.Size.Height)
{
// 移動超過2個像素
if (selectedSize.Width > 2 && selectedSize.Height > 2)
{
//拷貝一份圖片,不污染原圖
Image tempImage = (Image)this.PicTotalBitmap.Clone();
//創建作圖區域
Graphics graphic = Graphics.FromImage(tempImage);
//創建畫筆,準備用虛線畫選中區域
Pen p1 = new Pen(Color.Black, 1);
p1.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
//選中區域的坐標
Rectangle selectedRect = new Rectangle(startPoint, selectedSize);
graphic.DrawRectangle(p1, selectedRect);
//將圖片顯示
this.picboxTotal.Image.Dispose();
this.picboxTotal.Image = tempImage;
//釋放資源
graphic.Dispose();
}
}
}
}
uj5u.com熱心網友回復:
做圖一般有兩種辦法:1、使用鏈表保存每一步的繪圖指令,重繪的時候,所有的繪圖指令執行一遍。這種方式,只需要把鏈表最后的指令洗掉即可。
2、位圖保存。重繪時,調取保存的位圖。這個,把最后保存的位圖洗掉,使用上次保存的位圖即可。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/144148.html
標籤:C#
