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

C# GDI+繪圖高級編程

編輯:關於C#

一般來說,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+提供新的功能了並宣稱他又一些性能方面的改進。

1.GDI+命名空間

(不說了,自己看去吧!!!)

2.設備環境和Graphics對象

GDI使用設備環境(DC)對像識別輸出設備。DC對象存儲特定設備的信息並把GDI API函數調用轉換為要發送給設備的命令。還可以通過DC對象確定對應的設備有什麼功能(如打印機是彩色還是黑白的)。如果要求設備完成它不能完成的任務,設備對象就會檢測到並采取措施。

DC對象不僅可以硬件還可以用作到Windows的一個橋梁。例如如果Windows知道只有一小部分應用程序窗口需要重新繪制,DC就可以捕獲和撤銷在該地區外的繪圖工作。因為DC與Windows的關系非常密切,通過Dc來工作就可以用其他方式簡化代碼。

繪制圖形

下面舉例來說明如何在應用程序的主窗口中繪圖。DisplayAtStartup

創建一個C# 應用程序並在啟動窗體時在構造函數中繪制它。這並不是在屏幕上繪圖的最佳方式,這個示例並不能在啟動後按照需要重新繪制窗體。這樣只是不必作太多的工作就可以說明一些問題。

首先把窗體的背景色設置為白色。如果使用設計視圖設置背景色,系統會自動添加代碼:

    private void InitializeComponent()
        {
               this.AutoScaleBaseSize = new System.Drawing.Size(5,13);
               this.BackColor = System.Drawing.Color.White;
               this.ClientSize = new System.Drawing.Size(292,266);
               this.Name = "Form1";
               this.Text = "Form1";
        }

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

   public Form1()
       {
              InitializeComponent();

              Graphics dc = this.CreateGraphics();
              this.Show();
              Pen bluePen = new Pen(Color.Blue,3);
              dc.DrawRectangle(bluePen,0,0,50,50);    //矩形
              Pen redPen = new Pen(Color.Red,2);
              dc.DrawEllipse(redPen,0,50,80,60);        // 橢圓
       }

然後調用Show()方法顯示窗口。必須讓窗口立即顯示,因為在其顯示之前不能作任何工作。(沒有繪圖的地方)

最後顯示一個矩形和橢圓。注意其中坐標(x,y)表示從窗口的客戶區域左上角向右的X個像素,

向下的Y個像素。

(其中DrawRectangle()和DrawEillipse()這兩個函數前面已經講過不再重復了。)

上面程序窗體如果最小化再恢復,繪制好的圖形就不見了。如果在該窗體上拖動另一個窗口,使之只遮擋一部分圖形,再把該窗口拖離這個窗體,臨時被遮擋的部分就消失了,只剩下一半橢圓或矩形了!原因是:如果窗體的一部分被隱藏了,Windows通常會立即刪除與其中顯示的內容相關的所有信息。在窗口的某一部分消失時,那些像素也就丟失了(即Windows釋放了保存這些像素的內存)。

但要注意窗口的一部分被隱藏了,當它檢測到窗口不再被隱藏時,就請求擁有該窗口的應用程序重新繪制其內容。這個規則有一些例外----窗口的一小部分被擋住的時間比較短(顯示菜單時)。一般情況下應用程序就需要在以後重新繪制它。

由於本示例把繪圖代碼放在Form1的構造函數中,故不能在啟動後再次調用該構造函數進行重新繪制。

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