国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Windows編程入門-設(shè)備環(huán)境句柄

2019-11-08 02:14:19
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
設(shè)備環(huán)境(也被稱為DC)實(shí)際上是GDI內(nèi)部維護(hù)的一個(gè)數(shù)據(jù)結(jié)構(gòu)。設(shè)備環(huán)境與特定的顯示設(shè)備(例如顯示器或打印機(jī))相關(guān)聯(lián)。對(duì)于視頻顯示,設(shè)備環(huán)境通常與屏幕上的一個(gè)特定的窗口相關(guān)聯(lián)。設(shè)備環(huán)境中的某些值是圖形“屬性”。這些屬性決定了GDI繪圖函數(shù)的工作細(xì)節(jié)。例如在TextOut函數(shù)中,設(shè)備環(huán)境的屬性決定著文本得顏色、文本背景的顏色、函數(shù)的參數(shù)x和y如何映射到窗口的客戶區(qū),以及Windows用什么字體顯示文本。程序在繪制前必須獲取一個(gè)設(shè)備環(huán)境句柄。在獲取句柄后,Windows會(huì)在內(nèi)部的設(shè)備環(huán)境結(jié)構(gòu)中填入默認(rèn)的屬性值。當(dāng)程序完成了對(duì)客戶區(qū)的繪制后,它必須釋放設(shè)備環(huán)境句柄。在程序釋放句柄之后,這個(gè)句柄不再有效并且不能再被使用。程序必須在處理同一條消息的過(guò)程中獲取句柄和釋放句柄,不能再兩條消息中間傳遞一個(gè)設(shè)備句柄。唯一的例外是通過(guò)CreateDC函數(shù)創(chuàng)建的設(shè)備環(huán)境句柄。Windows應(yīng)用程序需要在屏幕上繪圖時(shí),通常有兩種方法獲取設(shè)備環(huán)境句柄。方法一:通過(guò)BeginPaint和EndPaint函數(shù)這種方法可以在處理WM_PAINT消息時(shí)使用。這兩個(gè)函數(shù)需要兩個(gè)參數(shù):一個(gè)是窗口句柄,這是窗口消息處理過(guò)程的參數(shù);另一個(gè)是一個(gè)類型為PAINTSTRUCT結(jié)構(gòu)的變量的地址,程序通常將這個(gè)變量命名為ps,在窗口過(guò)程中定義如下:PAINTSTRUCT ps;在處理WM_PAINT消息時(shí),窗口過(guò)程首先調(diào)用BeginPaint函數(shù)。這個(gè)函數(shù)通常會(huì)擦去無(wú)效區(qū)域的背景以便繪圖。它同時(shí)還會(huì)填充ps結(jié)構(gòu)的各個(gè)字段。函數(shù)的返回值就是設(shè)備環(huán)境句柄。通常將它保存在一個(gè)名為hdc的變量中。這個(gè)變量在窗口過(guò)程中定義如下:HDC hdc;HDC數(shù)據(jù)類型定義為32位無(wú)符號(hào)整數(shù)。此后程序可以調(diào)用任何一個(gè)需要設(shè)備環(huán)境句柄的GDI函數(shù)了,例如TextOut。調(diào)用一次EndPaint函數(shù)將釋放設(shè)備環(huán)境句柄。通常,處理WM_PAINT消息的代碼如下所示:case WM_PAINT:hdc = BeginPaint(hwnd, &ps);[使用GDI函數(shù)]EndPaint(hwnd, &ps);return 0;窗口過(guò)程在處理WM_PAINT消息時(shí)必須成對(duì)地調(diào)用BeginPaint和EndPaint。如果窗口過(guò)程不處理WM_PAINT消息,WM_PAINT消息就會(huì)被傳送給Windows默認(rèn)的窗口過(guò)程DefWindowPRoc。在DefWindowProc中,WM_PAINT消息處理的代碼如下:case WM_PAINT:BeginPaint(hwnd, &ps);EndPaint(hwnd, &ps);return 0;這里除了將原來(lái)的無(wú)效區(qū)域有效化以外,在BeginPaint和EndPaint的中間不包含其他代碼。以下代碼是錯(cuò)誤的:case WM_PAINT:return 0;由于部分客戶區(qū)是無(wú)效的,Windows才會(huì)在消息隊(duì)列中放置一條WM_PAINT消息。除非調(diào)用BeginPaint和EndPaint函數(shù)對(duì)(或者ValidateRect),否則Windows不會(huì)將那個(gè)區(qū)域有效化。因此Windows將會(huì)不停的發(fā)送WM_PAINT消息,直到永遠(yuǎn)。方法二:通過(guò)BeginPaint和EndPaint函數(shù)盡管最好讓程序在處理WM_PAINT消息時(shí)才更新整個(gè)客戶區(qū),但有時(shí)也會(huì)發(fā)現(xiàn)在處理非WM_PAINT消息時(shí)繪制部分客戶區(qū)也是很有用的。有些時(shí)候,還需要設(shè)備環(huán)境句柄用作其他用途,例如獲取設(shè)備環(huán)境的信息。這時(shí)可以調(diào)用GetDC函數(shù)來(lái)獲得窗口客戶區(qū)的設(shè)備環(huán)境句柄,在使用完以后,調(diào)用ReleaseDC函數(shù)將它釋放:hdc = GetDC(hwdn);[使用GDI函數(shù)]ReleaseDC(hwnd, hdc);與BeginPaint和EndPaint類似,GetDC和ReleaseDC必須成對(duì)使用。在處理一條消息時(shí),當(dāng)調(diào)用GetDC函數(shù)后,應(yīng)該在退出窗口過(guò)程之前調(diào)用ReleaseDC。不要在處理一條消息時(shí)調(diào)用GetDC,然后在處理另一條消息時(shí)調(diào)用ReleaseDC。與從BeginPaint函數(shù)返回的設(shè)備環(huán)境句柄不同,從GetDC返回的設(shè)備環(huán)境句柄中的裁剪矩形時(shí)整個(gè)客戶區(qū)。這意味著你可以在客戶區(qū)的任意部分繪制,而不僅僅是在無(wú)效矩形里,也就是說(shuō)如果不存在無(wú)效矩形也沒(méi)有關(guān)系。與BeginPaint不同,GetDC不會(huì)將無(wú)效區(qū)域有效化。如果需要將整個(gè)客戶區(qū)有效化,可以像下面這樣調(diào)用函數(shù):ValidateRect(hwnd,NULL);通常,GetDC和ReleaseDC函數(shù)用于處理鍵盤消息(例如在字處理程序中)或者鼠標(biāo)消息(例如繪圖程序中)。使用這兩個(gè)函數(shù),程序可以在收到用戶的鍵盤或者鼠標(biāo)輸入時(shí)及時(shí)地繪制客戶區(qū),而不必為了生成WM_PAINT消息去可以使客戶區(qū)的一部分無(wú)效化。但是,即使程序在處理非WM_PAINT消息時(shí)進(jìn)行了繪制,它仍然必須收集足夠的信息以便在收到WM_PAINT時(shí)能更新顯示。另一個(gè)與GetDC類似的函數(shù)是GetWindowDC。GetDC返回的是窗口客戶區(qū)的設(shè)備環(huán)境句柄,GetWindowDC返回的則是整個(gè)窗口的設(shè)備環(huán)境句柄。例如程序可以使用從GetWindowDC返回的設(shè)備句柄在窗口的標(biāo)題欄輸出,相應(yīng)的,程序也必須要處理WM_NCPAINT(非客戶區(qū)繪制)消息。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 克山县| 环江| 河津市| 城口县| 江安县| 泰来县| 竹山县| 抚顺市| 自贡市| 永年县| 宣城市| 万年县| 宜城市| 来宾市| 托里县| 米泉市| 怀远县| 浙江省| 延边| 丰原市| 保亭| 扬州市| 米林县| 河北区| 泰和县| 龙州县| 红原县| 贡嘎县| 襄垣县| 昌图县| 长岛县| 邢台市| 宽城| 苏尼特左旗| 鄂伦春自治旗| 明星| 阜阳市| 南乐县| 成都市| 化州市| 阿坝|