在使用GDI+繪制圖形時,為了實現如AutoCAD那樣分層進行繪制各種類型的線,設計了一種模擬圖層實現的方法。
實現思路:將要繪制的圖形點存放在不同的鏈表中,根據圖層的可見性,繪制不同的圖形。
具體實現:
一、設計圖層類
BitMapLayer類
字段設計
private string _name; private bool _isVisible; private bool _isActive; private Bitmap bitmap; private List<PointF> _pointsList;
屬性設計
/// <summary> /// 名稱 /// </summary> public string Name { get { return _name; } set { _name = value; } } /// <summary> /// 可見性 /// </summary> public bool IsVisible { get { return _isVisible; } set { _isVisible = value; } } /// <summary> /// 是否可激活 /// </summary> public bool IsActive { get { return _isActive; } set { _isActive = value; } } /// <summary> /// 背景位圖 /// </summary> public Bitmap Bitmap { get { return bitmap; } set { bitmap = value; } } /// <summary> /// 點集合 /// </summary> public List<PointF> PointsList { get { return _pointsList; } set { _pointsList = value; } }
構造函數
public MyBitMap() { } public MyBitMap(string name) { this.Name = name; } public MyBitMap(string name, bool IsActive) { this.Name = name; this.IsActive = IsActive; }
二、窗體設計
2.1 主窗體設計
主窗體設置兩個Button按鈕,一個用來調用圖層管理界面,另一個用來更新界面顯示(需改進,將界面刷新設置為自動刷新)。
同時設置鼠標點擊事件,用來向圖層的數據鏈表中增加坐標點數據。

圖1 主窗體界面
(注:主窗體界面為縮小后顯示的界面,具體大小可根據實際需要進行調整,下同)
2.2 圖層管理界面設計
設置三個Button按鈕,分別用來增加圖層,刪除圖層和保存圖層設置。一個DataGridView控件,用來顯示、設置圖層屬性。

圖2 圖層管理窗體界面
另在設計公共函數及屬性,便於主窗體調用。
三、實現代碼
主窗體中代碼:
private List<MyBitMap> myBitMapList=new List<MyBitMap>(); Random r = new Random(); Random r1 = new Random(); // 打開圖層管理界面 private void btnLayerManager_Click(object sender, EventArgs e) { LayerDialog ld = new LayerDialog(myBitMapList); if (ld.ShowDialog() != DialogResult.OK) { myBitMapList=ld.GetLayerList(); RefreshDraw(); } } // 主窗體加載是操作 private void Form1_Load(object sender, EventArgs e) { MyBitMap myBitmap = new MyBitMap("Default"); myBitmap.Bitmap = new Bitmap(this.Width, this.Height); myBitmap.PointsList = new List<PointF>(); myBitMapList.Add(myBitmap); } // 更新界面 private void btnDrawBitMap_Click(object sender, EventArgs e) { RefreshDraw(); } // 鼠標點擊事件 private void Form1_MouseClick(object sender, MouseEventArgs e) { for (int i = 0; i < myBitMapList.Count; i++) { if (myBitMapList[i].IsActive) { myBitMapList[i].PointsList.Add(new PointF(e.X,e.Y)); } } } // 更新界面實現代碼 private void RefreshDraw() { Graphics g = this.CreateGraphics(); List<MyBitMap> noVisibleList = new List<MyBitMap>(); List<MyBitMap> VisibleList = new List<MyBitMap>(); int isvisible = 0; for (int i = 0; i < myBitMapList.Count; i++) { if (myBitMapList[i].IsVisible) { isvisible++; VisibleList.Add(myBitMapList[i]); } else noVisibleList.Add(myBitMapList[i]); } g.Clear(this.BackColor); for (int i = 0; i < VisibleList.Count; i++) { if (VisibleList[i].PointsList.Count > 0) g.DrawLines(new Pen(Color.Red, 1), VisibleList[i].PointsList.ToArray()); } g.Dispose(); }
圖層管理中代碼:
List<MyBitMap> myBitMapList; public LayerDialog( List<MyBitMap> bitMapList) { InitializeComponent(); myBitMapList = new List<MyBitMap>(); myBitMapList.AddRange(bitMapList); SetDataGrid(); } private void LayerDialog_Load(object sender, EventArgs e) { } private static int count=1; private void btnAdd_Click(object sender, EventArgs e) { MyBitMap bitmap = new MyBitMap("圖層"+count.ToString()); bitmap.Bitmap = new Bitmap(this.Width, this.Height); bitmap.PointsList = new List<PointF>(); myBitMapList.Add(bitmap); count++; dataGridView1.DataSource = null; SetDataGrid(); } private void SetDataGrid() { dataGridView1.DataSource = myBitMapList; dataGridView1.Columns[0].HeaderText = "Layer Name"; dataGridView1.Columns[1].HeaderText = "Visible"; dataGridView1.Columns[2].HeaderText = "Active"; dataGridView1.Columns[3].Visible = false; } private void btnDelete_Click(object sender, EventArgs e) { if (dataGridView1.DataSource != null) { myBitMapList.RemoveAt(dataGridView1.CurrentRow.Index); dataGridView1.DataSource = null; SetDataGrid(); } } private void btnSave_Click(object sender, EventArgs e) { int active = 0; for (int i = 0; i < myBitMapList.Count; i++) if (myBitMapList[i].IsActive) active++; if (active > 1) MessageBox.Show("只能有一個圖層可以被激活!"); else Close(); } public List<MyBitMap> GetLayerList() { List<MyBitMap> tmpList = myBitMapList; return tmpList; }
文中不足之處,敬請各位指出,感激不盡。
