程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c# GDI+簡單繪圖(四)(2)

c# GDI+簡單繪圖(四)(2)

編輯:關於C語言

實現繪圖工具的功能

為了讓代碼藕合度小點,稍許用了些設計模式,因為不是很會,所以代碼還是有點亂亂的,嘿嘿!關於繪圖工具的這些功能塊全部寫在了DrawTools這個類裡.那麼在主窗體中,只需要調用這個類來完成繪制就行了,而不需要過多的涉及到具體的繪圖代碼。繪圖工具這個類提供的主要工具就是:鉛筆、橡皮、直線、矩形、圓形、實心矩形、實心圓形。關於這些功能塊的代碼,並不難,只要大家對認真看過前幾篇內容,那應該都看得懂。

這裡要注意以下幾點:

1.如何防止記錄不必要的繪圖過程中的痕跡?

這個問題在第三篇中有提到過,大家不妨先去看看那一篇。為了讓代碼看起來可讀性高點,我設置了兩個Image變量,finishingImg用來保存繪圖過程中的痕跡,orginalImg用來保存已完成的繪圖過程和初始時的背景圖片。

2.這個類如何與主窗體進行通信?

當然如果直接將這些功能塊寫在主窗體中自然沒有這個問題。但是那樣代碼會顯得很混雜,如果只是工具代碼出現問題就需要改整個項目。我在這裡通過定義方法和屬性,讓主窗體通過給屬性賦值將畫板畫布以及顏色什麼的信息傳給這個工具類,然後通過調用相應的工具方法來使用這些工具。

3.關鍵屬性

要想讓這些工具能正常使用,必須傳遞給他以下幾樣東西:目標畫板(也就是picturebox),繪圖顏色,原始畫布。

實現菜單功能

這裡就需要我們對文件的操作有一點了解,大家可以去查一下相關資料。

難點主要就是“打開”這個菜單項的實現

我們要實現將打開後的圖片在修改後重新保存就必須讓文件在打開後就能關閉,否則就會因為文件打開而無法覆蓋原文件。就會導致編譯時彈出“GDI  一般性錯誤”。所以根據網上其它朋友的做法就是先將打開的圖片通過GDI+將圖片畫到另一個畫布上,然後及時關閉打開的圖片和用來繪制該圖片的畫板。詳見http://www.wanxin.org/redirect.PHP?tid=3&goto=lastpost

private void openPic_Click(object sender, EventArgs e)
    {
      OpenFileDialog ofd = new OpenFileDialog();//實例化文件打開對話框
      ofd.Filter = "JPG|*.jpg|Bmp|*.bmp|所有文件|*.*";//設置對話框打開文件的括展名
      if (ofd.ShowDialog() == DialogResult.OK)
      {
        Bitmap bmpformfile = new Bitmap(ofd.FileName);//獲取打開的文件
        panel2.AutoScrollPosition = new Point(0,0);//將滾動條復位
        pbImg.Size = bmpformfile.Size;//調整繪圖區大小為圖片大小
        reSize.Location = new Point(bmpformfile.Width, bmpformfile.Height);//reSize為我用來實現手動調節畫布大小用的
        //因為我們初始時的空白畫布大小有限,"打開"操作可能引起畫板大小改變,所以要將畫板重新傳入工具類
        dt.DrawTools_Graphics = pbImg.CreateGraphics();
        Bitmap bmp = new Bitmap(pbImg.Width, pbImg.Height);
        Graphics g = Graphics.FromImage(bmp);
        g.FillRectangle(new SolidBrush(pbImg.BackColor), new Rectangle(0, 0, pbImg.Width, pbImg.Height));//不使用這句話,那麼這個bmp的背景就是透明的
        g.DrawImage(bmpformfile, 0, 0,bmpformfile.Width,bmpformfile.Height);//將圖片畫到畫板上
        g.Dispose();//釋放畫板所占資源
        //不直接使用pbImg.Image = Image.FormFile(ofd.FileName)是因為這樣會讓圖片一直處於打開狀態,也就無法保存修改後的圖片
        bmpformfile.Dispose();//釋放圖片所占資源
        g = pbImg.CreateGraphics();
        g.DrawImage(bmp, 0, 0);
        g.Dispose();
        dt.OrginalImg = bmp;
        bmp.Dispose();
        sFileName = ofd.FileName;//儲存打開的圖片文件的詳細路徑,用來稍後能覆蓋這個文件
        ofd.Dispose();
      }
    }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved