GDI程式設計小結

2021-08-31 00:21:26 字數 3234 閱讀 2593

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

圖形裝置介面(gdi)是乙個可執行程式,它接受windows應用程式的繪圖請求(表現為gdi函式呼叫),並將它們傳給相應的裝置驅動程式,完成特定於硬體的輸出,象印表機輸出和螢幕輸出。gdi負責windows的所有圖形輸出,包括螢幕上輸出畫素、在印表機上輸出硬拷貝以及繪製windows使用者介面。也就是windows的圖形程式設計。

一、gdi體系結構

1、 

gdi32.dll匯出的函式

gdi提供幾百個windows程式中可以呼叫的函式。這些函式大多數是從win32的子系統dll gdi32.dll中匯出的。視窗管理模組uer32.dll是使用gdi函式的大使用者,它用gdi函式來繪製選單、圖示、滾動條、標題欄和每個視窗的框架等細節內容。有一些繪圖函式從user32.dll匯出,提供給應用程式。僅windows2000 gdi32.dll就匯出了543個入口點。與devstudio一起發行的dumpbin工具是乙個簡單的工具,能列出模組匯出的函式。下面就是由dumpbin gdi32.dll /export 產生的部分內容:

abortdoc
abortpath
addfontmemresourceex
addfontresourcea
addfontresourceexa
addfontresourceexw
addfontresourcetracking
addfontresourcew
anglearc
animatepalette
anylinkedfonts
arc
arcto
具體檢視:

2、  

gdi函式分類

gdi的功能太多了,所以我們需要一種辦法對win32 gdi api的函式分類,以便理解gdi的結構,msdn庫將gdi api分成17個領域,清楚地描述了gdi的功能。

(1)位圖:處理建立、繪製裝置相關位圖(ddb)、裝置無關位圖(dib)、dib段、畫素和區域填充的函式。

(2)畫刷:處理建立、修改gdi畫刷物件的函式。

(3)剪裁:處理裝置上下文可繪製區域的函式。

(4)顏色:調色盤管理。

(5)座標和變換:處理對映模式、裝置座標對映邏輯和通用變換矩陣的函式。

(6)裝置上下文:建立裝置上下文,查詢、設定其屬性,及選擇gdi物件的函式。

(7)填充形狀:繪製閉合區域及其週線的函式。

(8)字型和文字:在系統中安裝和列舉字型,並用它們繪製文字字串的函式。

(9)直線和曲線:繪製直線、橢圓曲線和貝賽爾曲線的函式。

(10)元檔案:處理windows格式的元檔案或增強型元檔案的生成和回放的函式。

(11)多顯示監視器:允許在乙個系統中使用多個顯示監視器的函式。這些函式實際上是從uer32.dll匯出的。

(12)畫圖和繪圖:負責繪圖訊息管理和視窗已繪圖區域的函式。其中一些函式實際上是從uer32.dll匯出的。

(13)路徑:負責將一系列直線和曲線組成名為路徑的gdi物件,並用它來繪製的函式。

(14)畫筆:處理直線繪製屬性的函式。

(15)列印和列印池:負責將gdi繪圖命令傳送到硬拷貝裝置(如行式印表機和繪圖儀)並平滑地管理這些任務的。列印池函式是由win32列印池提供的,包括幾個系統提供的dll和銷售自定義的模組。

(16)矩形:user32.dll提供的處理rect結構的函式。

(17)區域:負責用區域gdi物件描述乙個點集的函式,並對該點集進行操作。

還有一些沒有文件記載的函式。有一些gdi函式在ddk中說明,還一些沒有文件記載但系統dll使用的函式,另處還有一些函式則沒有用過。下面是這些函式的粗略分類:

使用者模式印表機驅動程式。

opengl。

eudc。

其他系統dll支援。

其他沒有文件記載的函式。

3、 

gdi物件控制代碼

32位的gdi控制代碼由8位未知的高位、1位堆物件標記、7位物件型別資訊和高4位是0的16位索引組成。借助7位物件型別資訊,可以確定裝置上下文、區域、位圖、調色盤、字型、畫刷、加強型圖元檔案、畫筆和擴充套件畫筆。

4、gdi物件型別

gdi物件表

typedef struct

gditablecell;

(1)pkernel指向頁面池:對每個有效gdi物件,pkernel從不為空,並且值總是唯一的。因此看起來對每個gdi物件有乙個相應的資料結構,這個資料結構只能從核心模式**訪問,甚至不能從gdi32.dll直接訪問。對於不同程序的物件,從pkernel的值中看不出明顯區分區域來。pkernel指向的物件起始位址是0xe1000000,根據《inside windows nt》,起始位址是0xe1000000的區域一般是被稱為「頁面池」的可分頁系統的記憶體堆。

(2)ncount 是乙個部分選擇計數器:在windows 2000下,ncount總是零,就是說未使用。但在windows nt 4.0中,某些gdi物件用了它。為了理解ncount的意義,我們試著將物件控制代碼選入和取消乙個或多個裝置上下文中,觀察選入和取消是否能根據ncount值的變化而成功。

(3)nprocess使得gdi控制代碼繫結到程序:如果程式想使用另乙個程序的gdi物件控制代碼,win32 api呼叫一般會失敗。gditablecell中的nprocess欄位就是這種現象背後的原因。對於庫存(stock)物件,如getstockobject(black_pen),nprocess被置為零。對於使用者程序建立的其他gdi物件,nprocess是建立程序的程序識別符號。

有了這個字段,gdi就會很容易地檢查當前程序識別符號是否和gdi物件的nprocess欄位一致,目的是強制物件控制代碼不能在另乙個程序中訪問的規則。

根據微軟的文件,程序終止時,由該程序建立的所有gdi物件會被釋放。如果你想知道這是怎樣實現的,我們現在有一點線索了。gdi只需搜尋gdi物件表並刪除有指定程序識別符號的物件。

(4)nupper:再次檢查控制代碼:我們發現gdi物件表入口的nupper欄位是4位元組gdi物件控制代碼的高兩個位元組的完全拷貝——對gdi物件控制代碼進行錯誤檢查是低成本的冗餘校驗。

(5)ntype:內部物件型別:ntype的低位元組通常和hgdiobj中的是7位型別資訊相同,高位位元組通常是零。

(6)puser指向使用者模式資料結構。

gdi物件型別列表:

5、gdi函式大致分類

裝置上下文函式(如getdc、createdc、deletedc)、 畫線函式(如lineto、polyline

GDI 程式設計

image和bitmap類概述 gdi 的image類封裝了對bmp gif jpeg png tiff wmf windows元檔案 和emf 增強wmf 影象檔案的調入 格式轉換以及簡單處理的功能。而bitmap是從image類繼承的乙個影象類,它封裝了windows點陣圖操作的常用功能。例如,...

GDI程式設計

一 gdi 相關概念 1 gdi graphics device inte ce 圖形裝置介面,是乙個應用程式與輸出裝置之間的中介。它提供了一套函式庫,這些函式在不同的輸出裝置上輸出圖形和文字。一方面,gdi 向應用程式提供乙個與裝置無關的程式設計環境,另一方面,它又以裝置相關的格式和具體的裝置打交...

GDI 程式設計

最近在學習vc mfc學習 就所學記錄下筆記 1 新增gdiplus.h檔案 通常在標頭檔案檔案中新增 如下 include include using namespace gdiplus 2 新增gdiplus.lib連線 方法一 直接在stdafx.h檔案中新增 pragma comment l...