推薦好文-Windows圖形開發入門

來源:互聯網
上載者:User

該文引自:http://www.cnblogs.com/xdesigner/archive/2008/05/23/1205422.html

本課程是Windows圖形開發入門,算是圖形開發知識掃盲,主要介紹圖形編程的一些基礎理論知識,並無配套示範原始碼。其中包括

  1. WEB資料庫開發和圖形開發的比較
  2. Windows圖形子系統基本原理
  3. 圖形裝置上下文
  4. 向量圖形和位元影像
  5. 圖形座標系統
  6. 圖形介面基本元素
  7. 使用者介面事件

    在此我假設各位具有一定的電腦軟體開發基礎,瞭解基本的電腦軟硬體知識,但對Windows圖形開發則理解模糊,不甚瞭解。因此就介紹一下Windows圖形開發的基本原理,並不涉及到實際的開發,未來的序列培訓中將以本次培訓為基礎,使用C#進行實際的Windows圖形開發示範。

WEB資料庫開發和圖形開發的比較

    現來講講WEB資料庫開發和圖形開發的比較。大家大多是搞WEB資料庫開發的,其使用者介面基本上都是依賴HTML來進行描述,其實案頭開發也是大有可為的,而案頭開發中很重要的一部分就是圖形開發。圖形開發和Web開發相比具有很大的不同,其開發思想,技術手段,調試技巧等有著很大的不同現按以下幾個方面進行簡單說明。

面向的領域

    Web資料庫編程和圖形開發存在比較大的區別,Web資料庫編程大部分是面向工程開發的,其中充滿了各種業務資料結構,商務邏輯處理。而圖形開發相對而言技術因素更多些,面向的領域比較專業和底層。對於那些想在純粹的技術上所有突破的人來說,圖形開發是一種不錯的選擇。

難度

    圖形開發比較難於學習和掌握,因此熟練掌握圖形開發的開發人員相對比較少,而且各種軟體技能培訓機構都提供對WEB資料庫開發的培訓,而提供圖形開發培訓的則很少。難就人少,人少競爭就少,因此圖形軟體開發能力就成為一種與眾不同的軟體開發能力。

與資料庫的關係

    Web資料庫應用系統比較依賴關係型資料庫,資料庫是其系統中最重要的部分。而圖形開發則偏重於使用者介面和圖形文檔輸出,因此對資料庫的依賴相對少些,很多圖形軟體的正常運行是不需要資料庫的。

軟體設計和開發

    比較複雜的圖形開發需要使用大量的軟體設計模式,有時還需要文件物件模型這種比較進階的軟體設計模型,這些複雜的軟體設計模式在常規的中小型WEB資料庫開發中使用不多,因此深入學習圖形開發將明顯的增強開發人員的軟體設計能力。

    相對於Web資料庫編程,圖形開發在開發,調試和最佳化手段上有著很大的不同,在某些情況下,圖形程式的調試是相當困難的,而圖形程式所特有的抗閃爍最佳化過程是比較艱難的,非常考驗開發人員的軟體開發能力。

應用

    在目前的公司資訊化和電子政務中,WEB資料庫開發模式佔據著主流,但圖形開發仍然具有很廣泛的應用,而且很多是比較底層的,基礎性的軟體開發。比如WEB瀏覽器,VS.NET開發環境,甚至Windows作業系統本身都是圖形開發的產品,WEB軟體中的圖表,曲線圖等HTML難於展現的使用者介面,一般也有賴於圖形編程來實現。

展望

    對於很多人來說,圖形開發是一個全新的開發領域,需要使用新的軟體設計理驗和開發模式,但圖形開發也是一個豐富多彩的世界,有著非常多的技術等待大家的探索。圖形開發雖然比較難,但仍然值得大家學習和使用。圖形開發難度大,技術含量高,是一種優質的軟體開發能力。若大家想探索新的技術領域,並獲得與眾不同的開發能力,那就可以從現在開始學習Windows圖形開發。

Windows圖形子系統基本原理

    Windows作業系統具有最明顯的特點是具有圖形化使用者介面,這種技術大大改善了使用者體驗,使得大量的普通使用者能方便的學習和使用Windows作業系統,這是微軟取得巨大成功的一個重要因素。

    Windows作業系統針對圖形開發也提供了強大的編程介面,使得開發人員可以方便的在Windows上面開發具有專業效果的圖形化使用者介面軟體。在Windows以前,開發人員要實現圖形化使用者介面,則需要具備相當多的電腦硬體知識,電腦軟體業界在圖形化使用者介面方面進展緩慢,而Windows則提供了一個很方便的圖形開發平台,使得大量的圖形化使用者介面軟體迅速湧現,從而推動了電腦軟體業界整體快速發展。

    Windows作業系統中包含了一個圖形子系統,專門用於管理各種圖形輸出裝置,包括顯示器,印表機,繪圖器等。由於Windows系統啟用保護模式,應用程式沒有許可權直接存取電腦硬體,因此都必須調用Windows的圖形子系統來操作圖形裝置。就是Windows環境形軟體的基本原理。

    Windows提供了一個GDI32.DLL,稍微瞭解圖形開發的都知道這個DLL,它包含了大部分的Windows的圖形子系統的API函數。各種開發語言,包括VB,VC,C#,Delphi等等都能調用這些API函數來進行圖形開發。

    Windows通過這些API獲得應用系統的圖形操作請求後,內部進行一番處理,然後根據靶心圖表形硬體調用相應的裝置驅動程式。

    若應用系統請求在顯示器上顯示圖形,則Windows會首先設定電腦顯存,然後忙其他事,而顯卡中有一個獨立的處理器能自主訪問顯存,根據其中的資料來設定顯示器中顯示的內容。顯卡是固定每過一段時間訪問顯存,重新整理顯示器,因此它有一個頻率的參數。比如它的頻率是50HZ,則它是每20毫秒訪問顯存,重新整理顯示器。顯卡自己有處理器來進行這樣的操作,這種操作算是硬體操作,其過程不受作業系統的感知和控制。理解這個原理,對理解和消除使用者介面閃爍有著很大的協助。

    若應用系統請求進行列印輸出,則Windows首先將列印樣式輸出到列印任務隊列中,然後調用印表機驅動程式進行文檔的列印,由於具有列印任務隊列,因此多個軟體可同時進行列印輸出,而不必等待印表機硬體空閑。在Windows2000或更高版本的Windows作業系統中,有一個名為”Print Spooler”的服務,該服務就是用於管理列印任務隊列的,若該服務停止,則系統即使串連了印表機也不能進行列印輸出。

圖形裝置上下文

    在瞭解了Windows圖形子系統的基本原理後,我們可以開始瞭解Windows圖形開發了,在Windows圖形開發中有一個很重要的概念就是-圖形裝置上下文。

控制代碼

    對Windows編程有所瞭解的應該知道,WindowsAPI是一個個C語言樣式的函數,應用程式訪問大部分的作業系統資源是通過一種叫控制代碼的整數類型資料。例如程式訪問檔案,網路資源,圖片,建立表單等等都會事先調用API函數獲得一個控制代碼,控制代碼可以理解成系統資源的唯一編號,應用程式應當好好儲存這個控制代碼,妥善利用,不用時一定要使用API函數釋放掉。

圖形裝置上下文控制代碼

    應用軟體進行圖形操作時也得使用API函數申請一個圖形裝置上下文控制代碼,以後所有的圖形操作都是針對這個控制代碼來進行的,應用軟體完成圖形操作後一定要使用API釋放這個圖形裝置上下文控制代碼。

    圖形裝置上下文是一種抽象概念,不限制到具體硬體,因此Windows內部可以在這個抽象概念上大做文章,圖形裝置上下文控制代碼可以指向顯示器,也可以指向印表機或其他圖形硬體,這個過程對應用軟體是透明的,因此應用系統在此基礎上能比較容易的實現所見即所得 (WYSIWYG)功能。可以做到一份圖形作業碼,既可以向電腦螢幕輸出圖形,也可以控制印表機輸出圖形,這方便了圖形開發。

軟體設計模式

    這種抽象概念應用到不同的具體應用,是一種軟體設計模式。比如在C#中有一個抽象類別 System.IO.Stream , 它表示一個抽象的流的概念,而.NET架構中在這個抽象概念的流上面實現了各種具體的流,比如針對檔案,HTTP資源,記憶體等等。應用軟體只要編寫代碼將資料儲存到抽象的流中,則同一份代碼,可以同時將資料儲存到本地檔案,HTTP檔案,FTP檔案或記憶體中。這方便了程式的開發和擴充。

向量圖形和位元影像

概念

    圖形開發中有兩個重要的概念就是向量圖形和位元影像。

    所謂向量圖形,就是使用平面幾何中的點線面等抽象概念來描述圖形。而位元影像是採用大量的密集像素二維數組來描述圖形的。

    對於電腦來說,向量圖複雜,但資料量小,可無級縮放;而位元影像顯示過程簡單,但資料量大,放大時顯示效果差。

例子

    我們的電腦中存在很多向量圖和位元影像的例子。例如Flash是比較典型的向量圖軟體,它產生的圖形檔案.swf檔案小,放大時顯示品質有保障;而Windows畫圖板是操作位元影像的,產生的圖形檔案.bmp檔案大,放大時顯示品質差。

    還比如Windows字型。Windows字型有位元影像字型和TrueType字型,位元影像字型是基於位元影像概念的,而TrueType字型是基於向量圖形的。目前大部分字型是TrueType字型,我們可以設定這種字型的樣式,大小,使用TrueType字型的文本即使顯示得非常大,其文本輪廓線條還是很清晰的。目前少數字型是位元影像字型,最常見的是Windows記事本預設使用的Fixedsys字型,這種字型放大顯示時存在明顯的鋸齒。列印輸出品質不高。

圖形座標系統

卡笛爾直角座標

    描述和顯示向量圖形時需要一個座標系統,目前採用卡笛爾座標,也就是具有X-Y軸的直角座標。圖形中每個圖形元素都由若干個X-Y座標值和寬度高度值來確定。比如一個點用一對XY值來確定位置,而一個線段用兩個XY值來定位,而矩形用一個XY值和寬度高度值來定位。而圓或橢圓則用一個外切矩形來確定。

度量單位

    座標系還需要指定度量單位,度量單位可以採用厘米,英寸。對於圖形化使用者介面軟體很多時候採用像素單位。

    厘米,英寸等是抽象的度量單位,圖形採用這種抽象單位度量則是絕對準確的。而像素度量單位是和圖形硬體相關的,一般情況下,顯示器像素長度是96個像素一英寸,而印表機則是幾百個甚至上千個像素一英寸。因此相同的圖形,若採用像素大小,則在顯示器中顯示和實際列印的大小相差是很大的。在這種情況下應當採用抽象的厘米和英寸等度量單位,這樣才能做到所見即所得 (WYSIWYG)。

    在.NET中已經考慮到了這種情況,枚舉類型 System.Drawing.GraphicsUnit 就列出了一些標準的座標度量單位。

座標轉換-Matrix(駭客帝國?)

    座標系還可以轉換,轉換類型主要有平移,旋轉和縮放。平移是指座標原點(XY值都為0的點)上下左右移動,而座標度量單位等屬性不改變;旋轉是指座標系整體的以原點為中心,順時針旋轉一定的角度;而縮放則是將X軸或Y軸方向進行縮小或放大,X方向和Y方向的縮放可以是獨立的。

    大家都知道電影《駭客帝國》,這個電影的英文名為Matrix,.NET架構也提供了一個Matrix,它就是座標轉換對象,使用方便。它內部是一個3X3的矩陣,座標系的平移旋轉和縮放是通過一種矩陣運算來實現的。使用座標轉換對象,.NET程式可以很方便的實現某些特效,比如文本的垂直顯示,文本的展開或壓縮顯示等等。

圖形介面基本元素

    我們進行的大部分圖形開發是操作向量圖形的。在平面幾何中,向量圖形是有點線面組成的。因此一個個點,線或面就是向量圖形的基本元素。實際圖形開發中,主要的圖形介面基本元素有文本,直線段,矩形,橢圓(包括正圓),橢圓弧(包括圓弧),還有一些其他曲線。基本的繪圖操作有繪製線條和填充地區。使用上述方法就能繪製出絕大多數的圖形。

    在Windows圖形化使用者介面中,使用最多的圖形基本元素是文本和矩形。各種表單,控間,其輪廓都是矩形。文本可以是單行,多行,可分為靠左對齊,置中對齊和靠右對齊等等。繪製文本和矩形是最簡單最基本的圖形操作。

使用者介面事件

    大部分的圖形化使用者介面需要響應使用者介面事件來實現互動式使用者體驗,使用者介面事件主要包括表單重繪事件,滑鼠鍵盤事件,定時器事件,OLE拖拽事件等等,其中最重要的就是表單重繪事件和滑鼠鍵盤事件了。

    Windows底層使用Windows訊息的方式嚮應用程式通知各種事件,而.NET架構封裝了這些訊息處理,並提供了一些可擴充的編程介面來方便進行事件響應編程。比如我們可以掛上控制項的MouseDown事件,也可以重寫控制項的OnMouseDown方法來處理滑鼠按鍵按下事件。

表單重繪事件

    使用者介面事件中必須處理的事件是表單重繪事件。Windows是多任務作業系統,它允許顯示器上同時顯示多個表單,於是表單之間不可避免的發生覆蓋。一個表單的部分或全部可能被覆蓋和重新顯示。當控制項由被遮蓋到顯示時,應用軟體需要重新繪製控制項的使用者介面。

    ,表單2覆蓋了表單1,此時我的控制項有一部分被覆蓋了,當使用者佈建了表單1靠前顯示時,我的控制項原先被表單2覆蓋的部分給顯示出來了,此時形成了一個剪下矩形,程式需要重新繪製我的控制項的使用者介面,很顯然,程式只需要繪製剪下矩形所包括的部分,其他的部分就不需要顯示,這樣我們就能使用這個剪下矩形來最佳化我們的程式,減少圖形繪製工作量。

    我的控制項不需要判斷什麼時候由於表單重新顯示時要重新繪製使用者介面,Windows作業系統會判斷這種情況,然後通過訊息通知我的控制項要重新繪製使用者介面,而且在通知的時候就告訴了剪下矩形的位置和大小。

    在..NET平台上,.NET架構已經封裝了底層的訊息處理,並提供了Paint事件或OnPaint方法的編程介面。我們需要掛靠控制項的Paint事件,或者重寫OnPaint方法來重新繪製使用者介面。在這個事件中系統提供兩個參數,一個是圖形繪製對象Graphics,另外一個是名為ClipRectangle的剪下矩形對象,也就是要重新繪製地區的邊框。ClipRectangle是最佳化圖形繪製操作的基礎。

滑鼠事件

    大部分情況下使用者要求能使用滑鼠操作來進行處理,此時圖形軟體必須響應使用者的滑鼠操作來進行某些處理,在C#圖形軟體開發中,我們需要響應控制項的滑鼠事件,我們需要掛靠控制項的MouseDown或重寫OnMouseDown方法來處理滑鼠按鍵按下事件,使用MouseMove或重寫OnMouseMove方法來處理滑鼠移動事件,使用MouseUp事件或重寫OnMouseUp方法來處理滑鼠按鍵鬆開事件。

鍵盤事件

    使用者也經常要求能使用鍵盤來進行操作,比如對於文字編輯器,使用者需要使用鍵盤來輸入大量的文本字元,移動游標等等。此時圖形軟體必須響應使用者的鍵盤操作來進行某些處理,在C#圖形軟體開發中,我們需要響應控制項的鍵盤事件,我們需要使用KeyDown或重寫OnKeyDown方法來處理鍵盤按鍵按下事件,使用KeyUp事件或重寫OnKeyUp方法來處理鍵盤按鍵鬆開事件,使用KeyPress或OnKeyPress方法來處理鍵盤字元事件。

其他事件

    在C#中我們還可以處理其他的事件,比如我們在表單中放置了一個定時器控制項,則我們可以處理它的定時器事件來固定的每隔一段時間進行操作。我們從Windows資源管理員中拖拽一個檔案到我們的程式中,我們可以響應控制項的OLE拖拽事件來接受拖拽過來的檔案的資料。

    通過各種各樣的事件,我們就可以實現圖形化使用者介面的各種動態操作特性。這樣就維持了圖形軟體的正常運行,並提供了互動的使用者體驗。

小結

    本次課程主要是說明了Windows圖形開發的基本原理,圖形開發的一些理論知識。圖形開發是一個很大的話題,其理論知識涉及很廣泛,對此本次課程無法一一說明,在未來的培訓中,將開始使用C#來實踐圖形開發,並在開發過程中補充說明其中涉及到的各種軟體開發知識。

    大家若打算認真學習圖形開發,可以發揮主觀能動性,多多自我學習和相互學習。大家用慣了ASP.NET,對圖形編程有些陌生,從下一次課程開始,我們將一起去發現C#圖形開發。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.