C# Wiform GDI+ 模擬圖層功能


  在使用GDI+繪制圖形時,為了實現如AutoCAD那樣分層進行繪制各種類型的線,設計了一種模擬圖層實現的方法。

  實現思路:將要繪制的圖形點存放在不同的鏈表中,根據圖層的可見性,繪制不同的圖形。

  具體實現:

  一、設計圖層類

  BitMapLayer類

  字段設計

private string _name; 
private bool _isVisible;
private bool _isActive;
private Bitmap bitmap;
private List<PointF> _pointsList;
View Code

  屬性設計

/// <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; }
        }
View Code

  構造函數

public MyBitMap()
 {
 
}

 public MyBitMap(string name)
{
       this.Name = name;
 }

public MyBitMap(string name, bool IsActive)
 {
        this.Name = name;
         this.IsActive = IsActive;
 }
View Code

  二、窗體設計

  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();
}
View Code

  圖層管理中代碼:

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;
}
View Code

 

  文中不足之處,敬請各位指出,感激不盡。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM