Windows 圖形設(shè)備接口( Graphics Device Interface, GDI )是為與設(shè)備無關(guān)的圖形設(shè)計(jì)的,由操作系統(tǒng)屏蔽了硬件設(shè)備的差異,簡化了程序員的程序編寫工作。
???????????
設(shè)備上下文(
Device Context, DC
)
定義了一系列圖形對(duì)象及其屬性的結(jié)構(gòu),包括圖形模式及輸出。 PS : DC 一詞的翻譯上有些疑惑,不明白為什么這么叫。 context: 背景,環(huán)境,上下文
目前設(shè)備上下文有四種類型:顯示,打印,存儲(chǔ)和消息類型。
圖形對(duì)象及其屬性:
位圖,畫刷,調(diào)色板,字體,畫筆,區(qū)域
應(yīng)用程序每一次圖形操作均參照設(shè)備 上下文 中的屬性執(zhí)行, DC 可以看作是圖形的“輸出模板”。
???????????
圖形刷新
Windows 應(yīng)用程序在使用過程中,窗口大小的調(diào)整,窗口移動(dòng)或者被其它窗口覆蓋后,都必須要刷新原窗口內(nèi)用戶區(qū)顯示的內(nèi)容。但是 windows 系統(tǒng)只能在有限的幾種情況下自動(dòng)刷新。因此應(yīng)用程序必須具有及時(shí)處理刷新請(qǐng)求和刷新響應(yīng)的功能。
Windows 系統(tǒng)通常通過發(fā)送 WM_PAINT 消息將刷新請(qǐng)求傳遞給應(yīng)用程序。一般情況下,刷新有三種可能:
(1)?????
窗口移動(dòng)后的刷新
用戶區(qū)移動(dòng),窗口大小改變,滾動(dòng)條的使用等
(2)?????
被覆蓋區(qū)域的刷新
下拉式菜單關(guān)閉后需恢復(fù)被覆蓋部分,清除消息框后進(jìn)行的恢復(fù)等
(3)?????
對(duì)象穿越后的刷新
光標(biāo)穿過用戶區(qū),圖標(biāo)拖過用戶區(qū)等
Windows 系統(tǒng)為每個(gè)窗口建立了一個(gè) PAINTSTRUCT 結(jié)構(gòu),該結(jié)構(gòu)中包含了指明一個(gè)窗口被另一個(gè)窗口覆蓋的“無效區(qū)域”的最小矩形結(jié)構(gòu) RECT ,程序可根據(jù)這個(gè)矩形進(jìn)行刷新。
常用刷新方法包括:
(1)????? 保持一個(gè)顯示輸出副本,需要時(shí)重繪窗口
(2)????? 記錄發(fā)生的事件,需要時(shí)重新調(diào)用該事件
(3)????? 重新繪圖,簡單圖形常用的方法
???????????
獲取設(shè)備
上下文
獲取設(shè)備
上下文
是應(yīng)用程序輸出圖形的先決條件,常用函數(shù)有:
BeginPaint?????
響應(yīng)
WM_PAINT
消息進(jìn)行圖形刷新
GetDC??????????
非
WM_PAINT
消息驅(qū)動(dòng)時(shí)用于獲取設(shè)備
上下文
GetDCEx???????
返回指向特定窗口客戶區(qū)的整個(gè)窗口句柄,是
GetDC
的擴(kuò)展
???????????
繪圖工具與顏色
1.????????
畫筆
&
畫刷
畫筆的功能是用來畫直線和曲線,畫刷用于指定區(qū)域的填充
可以使用
CreatePen
和
CreateBrush
創(chuàng)建自定義畫筆畫刷,也或以使用
GetStockObject
函數(shù)獲取系統(tǒng)默認(rèn)的樣式。
HPEN hPen = CreatePen
(
?????? int nPenStyle,
?????? int nWidth,
?????? COLORREF rgbColor
);
????????????? HBRUSH hBrush = CreateBrush
??????????????????????????? (
?????????????????????????????????? int nHatchStyle,
?????????????????????????????????? COLORREF rgbColor
)
????????????? 畫筆畫刷不再使用時(shí)應(yīng)使用 DeleteObject 函數(shù)刪除并釋放資源
2.????????
顏色
winodws
使用宏
RGB
定義繪圖顏色
????????? RGB(nRed, nGreen, nBlue)
其中 nRed, nGreen, nBlue 分別表示紅,綠,藍(lán)的數(shù)值。
3.???????? 常用繪圖函數(shù)
(1)?????
BOOL ??? MoveToEx
{
HDC hdc,
int x, int y,
LPPOINT lpPoint?? // 存放原畫筆位置的 POINT 結(jié)構(gòu)
}
(2)?????
BOOL LineTo
{
HDC hdc,
int x, int y
}
(3)?????
BOOL Rectangle
{
HDC hdc,
int x1, int y1,???????? // 矩形左上角邏輯坐標(biāo)
int x2, int y2????????? // 矩形右下角邏輯坐標(biāo)
}
(4)?????
BOOL Polygon
{
HDC hdc,
LPPOINT lpPoints,????????????? // 包含各頂點(diǎn)坐標(biāo)的 POINT 數(shù)組
int nCount??????????????????? // 多邊形頂點(diǎn)個(gè)數(shù)
}
???????????
應(yīng)用實(shí)例
–
簡單的圖形繪制




































































































































































































































