這裏的答案顯然是肯定的。在GDI +中,你只需直接畫上一個位圖緩存,所以如果你想撤銷之前的繪圖操作,你可以做的事情之一(取決於問題和性能的複雜性):
的先前狀態的簡單的解決辦法是有2位圖(類似的東西,通常被稱爲雙緩衝)。一個當前顯示(並且包含最終狀態)和一個僅用於預覽。預覽之一始終是第一個的副本 - 只需進行當前修改即可。
這個簡單的實施,使基本算法:
- 開始與兩個位圖(空白但相同的大小),如果用戶繪製一條線始終使位圖的副本[命名爲A和B],
- A有B和第B得出 - 如果用戶完成後再行做B的副本,在A和再次顯示乙
- - 顯示乙
所以總是顯示預覽位圖,這僅僅是一個修改位圖原來的一個。
這裏是C#示例性編程代碼(假設所有的事件連接和預覽位圖,B,是圖片框本身(這是剛剛命名pictureBox1這裏):
Bitmap bmp;
bool isDrawing;
Point previous;
void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
isDrawing = true;
previous = e.Location;
}
void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
isDrawing = false;
}
void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (isDrawing)
{
using (Graphics g = Graphics.FromImage(bmp))
{
double wf = (double)bmp.Width/(double)pictureBox1.Width;
double hf = (double)bmp.Height/(double)pictureBox1.Height;
g.ScaleTransform((float)wf, (float)hf);
g.DrawLine(Pens.Black, e.Location, previous);
}
pictureBox1.Refresh();
previous = e.Location;
}
}
該代碼會做只需按下鼠標左鍵,即可顯示從一個點到另一個點的直線。