熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C# GDI+繪圖高級編程

2013-11-13 10:33:46  來源: .NET編程 

  一般來說Windows的一個優點(實際上是現代操作系統的優點)是它可以讓開發人員不考慮特定設備的細節例如不需要理解硬盤設備驅動程序只需在相關的NET類中調用合適的方法就可以編程讀寫磁盤上的文件這個規則也適用於繪圖計算機在屏幕上繪圖時把指令發送給視頻卡問題是市面上有幾百種不同的視頻卡大多數有不同的指令集合功能如果把這個i考慮在內在應用程序中為每個視頻卡驅動程序編寫在屏幕上繪圖的特定代碼這樣的應用程序就根本不可能編寫出來這就是為什麼在Windows最早的版本中有Windows Graphical Device Interface(GDI)的原因

       GDI+提供了一個抽象層隱藏了不同視頻卡之間的區別這樣就可以調用Windows API函數完成指定的任務了GDI還在內部指出在運行特定的代碼時如果讓客戶機的視頻卡完成要繪制的圖形GDI還可以完成其他任務大多數計算機都有多個顯示設備監視器打印機GDI成功的使應用程序所使用的打印機看起來與屏幕一樣如果要打印某些東西而不是顯示他們只需告訴系統輸出設備是打印機再用相同的方式調用相同的Windows API函數可以

      可以看出DC(設備環境)是一個功能非常強大的對象在GDI下所有的繪圖工作都必須通過設備環境完成DC甚至可用於不涉及在屏幕或其他硬件設備上繪圖的其他操作例如在內存中修改圖像

      GDI開發人員提供了一個相當高級的API但它仍是一個基於舊Windows API並且有C語言風格函數的API所以使用起來不是很方便GDI+在很大程度上是GDI和應用程序之間的一層提供了更直觀基於繼承性的對象模型盡管GDI+基本上是GDI的一個包裝器但Microsoft已經能通過GDI+提供新的功能了並宣稱他又一些性能方面的改進

GDI+命名空間
    (不說了自己看去吧!!!)
設備環境和Graphics對象
       GDI使用設備環境(DC)對像識別輸出設備DC對象存儲特定設備的信息並把GDI API函數調用轉換為要發送給設備的命令還可以通過DC對象確定對應的設備有什麼功能(如打印機是彩色還是黑白的)如果要求設備完成它不能完成的任務設備對象就會檢測到並采取措施
       DC對象不僅可以硬件還可以用作到Windows的一個橋梁例如如果Windows知道只有一小部分應用程序窗口需要重新繪制DC就可以捕獲和撤銷在該地區外的繪圖工作因為DC與Windows的關系非常密切通過Dc來工作就可以用其他方式簡化代碼

       繪制圖形
       下面舉例來說明如何在應用程序的主窗口中繪圖DisplayAtStartup
       創建一個C# 應用程序並在啟動窗體時在構造函數中繪制它這並不是在屏幕上繪圖的最佳方式這個示例並不能在啟動後按照需要重新繪制窗體這樣只是不必作太多的工作就可以說明一些問題
        首先把窗體的背景色設置為白色如果使用設計視圖設置背景色系統會自動添加代碼
       
        private void InitializeComponent()
        {
               thisAutoScaleBaseSize = new SystemDrawingSize();
               thisBackColor = SystemDrawingColorWhite;
               thisClientSize = new SystemDrawingSize();
               thisName = Form;
               thisText = Form;
        }

       接著給Form構造函數添加代碼使用窗體的CreateGraphics()方法創建一個Graphics對象其中包括繪圖時需要的使用的Windows DC創建的DC即與顯示設備相關也與窗口相關

       public Form()
       {
              InitializeComponent();
             
              Graphics dc = thisCreateGraphics();
              thisShow();
              Pen bluePen = new Pen(ColorBlue);
              dcDrawRectangle(bluePen);    //矩形
              Pen redPen = new Pen(ColorRed);
              dcDrawEllipse(redPen);        // 橢圓
       }
      

       然後調用Show()方法顯示窗口必須讓窗口立即顯示因為在其顯示之前不能作任何工作(沒有繪圖的地方)
       最後顯示一個矩形和橢圓注意其中坐標(xy)表示從窗口的客戶區域左上角向右的X個像素

  向下的Y個像素
      (其中DrawRectangle()和DrawEillipse()這兩個函數前面已經講過不再重復了)

       上面程序窗體如果最小化再恢復繪制好的圖形就不見了如果在該窗體上拖動另一個窗口使之只遮擋一部分圖形再把該窗口拖離這個窗體臨時被遮擋的部分就消失了只剩下一半橢圓或矩形了!原因是如果窗體的一部分被隱藏了Windows通常會立即刪除與其中顯示的內容相關的所有信息在窗口的某一部分消失時那些像素也就丟失了(即Windows釋放了保存這些像素的內存)
       但要注意窗口的一部分被隱藏了當它檢測到窗口不再被隱藏時就請求擁有該窗口的應用程序重新繪制其內容這個規則有一些例外窗口的一小部分被擋住的時間比較短(顯示菜單時)一般情況下應用程序就需要在以後重新繪制它
       由於本示例把繪圖代碼放在Form的構造函數中故不能在啟動後再次調用該構造函數進行重新繪制


From:http://tw.wingwit.com/Article/program/net/201311/14002.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.