Windows GDI和GDI+编程实例剖析(1)
生活随笔
收集整理的這篇文章主要介紹了
Windows GDI和GDI+编程实例剖析(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Windows GDI和GDI+編程實例剖析(1)
作者:宋寶華 ?e-mail:21cnbao@21cn.com
1.基本概念
GDI在Windows中定義為Graphics Device Interface,即圖形設備接口,是Windows API(Application Programming Interface)的一個重要組成部分。它是Windows圖形顯示程序與實際物理設備之間的橋梁,GDI使得用戶無需關心具體設備的細節,而只需在一個虛擬的環境(即邏輯設備)中進行操作。它的橋梁作用體現在:
(1)用戶通過調用GDI函數將邏輯空間的操作轉化為具體針對設備驅動程序的調用;
為實現圖形設備無關性,Windows 的繪圖操作在一個設備描述表上進行。用戶擁有自己的“邏輯坐標”系統,它獨立于實際的物理設備,與“設備坐標”相對應。開發Windows應用程序時,程序員關心的是邏輯坐標,我們在邏輯坐標系上繪圖,利用GDI將邏輯窗口映射到物理設備上。
(2)GDI能檢測具體設備的能力,并依據具體的設備以最優方式驅動這些設備,完成真實的顯示。
?GDI函數大致可分類為:設備上下文函數(如GetDC、CreateDC、DeleteDC)、畫線函數(如LineTo、Polyline、Arc)、填充畫圖函數(如Ellipse、FillRect、Pie)、畫圖屬性函數(如SetBkColor、SetBkMode、SetTextColor)、文本、字體函數(如TextOut、GetFontData)、位圖函數(如SetPixel、BitBlt、StretchBlt)、坐標函數(如DPtoLP、LPtoDP、ScreenToClient、ClientToScreen)、映射函數(如SetMapMode、SetWindowExtEx、SetViewportExtEx)、元文件函數(如PlayMetaFile、SetWinMetaFileBits)、區域函數(如FillRgn、FrameRgn、InvertRgn)、路徑函數(如BeginPath、EndPath、StrokeAndFillPath)、裁剪函數(如SelectClipRgn、SelectClipPath)等。
?GDI雖然使程序員得到了一定程度的解脫,但是其編程方式仍很麻煩。譬如,顯示一張位圖,程序員需要進行“裝入位圖―讀取位圖文件頭信息―啟用設備場景―調色板變換”等一連串操作。而有了GDI+,這些問題便迎刃而解了。
顧名思義,GDI+是GDI的增強版。它是微軟在Windows 2000以后操作系統中提供的新接口,其通過一套部署為托管代碼的類來展現,這套類被稱為GDI+的“托管類接口”。GDI+主要提供了以下三類服務:
(1) 二維矢量圖形:GDI+提供了存儲圖形基元自身信息的類(或結構體)、存儲圖形基元繪制方式信息的類以及實際進行繪制的類;
(2) 圖像處理:大多數圖片都難以劃定為直線和曲線的集合,無法使用二維矢量圖形方式進行處理。因此,GDI+為我們提供了Bitmap、Image等類,它們可用于顯示、操作和保存BMP、JPG、GIF等圖像格式。
(3) 文字顯示:GDI+支持使用各種字體、字號和樣式來顯示文本。
GDI接口是基于函數的,而GDI+是基于C++類的對象化的應用程序編程接口,因此使用起來比GDI要方便。
2.例程簡述
本文后續的講解都基于這樣的一個例子工程(例程的開發環境為Visual C++6.0,操作系統為Windows XP),它是一個基于對話框的MFC應用程序,包括2個父菜單:
(1)??? GDI
GDI父菜單下包括一個子菜單:
ID:IDM_GDI_DRAW_LINE ???? caption:畫線
單擊事件:在窗口繪制正旋曲線
(2)??? GDI+
DIB位圖父菜單下包括兩個子菜單:
a. ID:IDM_GDIP_DRAW_LINE ???? ???caption:畫線
單擊事件:在窗口繪制正旋曲線
b. caption:新增功能,其下又包括下列子菜單:
(ⅰ)ID:IDM_Gradient_Brush ???? caption:漸變畫刷
單擊事件:在窗口演示GDI+的漸變畫刷功能
(ⅱ)ID:IDM_Cardinal_Spline ??? caption:基數樣條
單擊事件:在窗口演示GDI+的基數樣條函數功能
(ⅲ)ID:IDM_Transformation_Matrix caption:變形和矩陣對象
單擊事件:在窗口演示GDI+的變形和矩陣對象功能
(ⅳ)ID:IDM_Scalable_Region ? caption:可伸縮區域
單擊事件:在窗口演示GDI+的可伸縮區域功能
(ⅴ)ID:IDM_IMAGE ????? caption:圖像
單擊事件:在窗口演示GDI+的多種圖像格式支持功能
(ⅵ)ID:IDM_Alpha_Blend ?? caption:Alpha混合
單擊事件:在窗口演示GDI+的Alpha混合功能
(ⅶ)ID:IDM_TEXT caption:文本
單擊事件:在窗口演示GDI+的強大文本輸出能力
后續篇章將集中在對上述菜單單擊事件消息處理函數的講解,下面的代碼是整個對話框類CGdiexampleDlg的消息映射:
BEGIN_MESSAGE_MAP(CGdiexampleDlg, CDialog)
//{{AFX_MSG_MAP(CGdiexampleDlg)
? ON_WM_SYSCOMMAND()
? ON_WM_PAINT()
? ON_WM_QUERYDRAGICON()
? ON_COMMAND(IDM_GDI_DRAW_LINE, OnGdiDrawLine)
? ON_COMMAND(IDM_GDIP_DRAW_LINE, OnGdipDrawLine)
? ON_COMMAND(IDM_Gradient_Brush, OnGradientBrush)
? ON_COMMAND(IDM_Cardinal_Spline, OnCardinalSpline)
? ON_COMMAND(IDM_Transformation_Matrix, OnTransformationMatrix)
? ON_COMMAND(IDM_Scalable_Region, OnScalableRegion)
? ON_COMMAND(IDM_IMAGE, OnImage)
? ON_COMMAND(IDM_Alpha_Blend, OnAlphaBlend)
? ON_COMMAND(IDM_TEXT, OnText)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
總結
以上是生活随笔為你收集整理的Windows GDI和GDI+编程实例剖析(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VTK修炼之道28:图像统计_灰度直方图
- 下一篇: 飞鸽传书:服务器开发系列—系统构架