生活随笔
收集整理的這篇文章主要介紹了
hdc和hwnd的区别
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? ? ? 句柄概念在WINDOWS編程中是一個(gè)很重要的概念,在許多地方都扮演著重要的角色。但由此而產(chǎn)生的句柄概念也大同小異,比如:<<Microsoft ? Windows ? 3 ? Developer's ? Workshop>>(Microsoft ? Press,by ? Richard ? Wilton)一書(shū)中句柄的概念是:在Windows環(huán)境中,句柄是用來(lái)標(biāo)識(shí)項(xiàng)目的,這些項(xiàng)目包括: ? ? ? ? ? ? *.模塊(module) ? ? ? ? ? ? *.任務(wù)(task) ? ? ? ? ? ? *.實(shí)例(instance) ? ? ? ? ? ? *.文件(file) ? ? ? ? ? ? *.內(nèi)存塊(block ? of ? memory) ? ? ? ? ? ? *.菜單(menu) ? ? ? ? ? ? *.控制(control) ? ? ? ? ? ? *.字體(font) ? ? ? ? ? ? *.資源(resource),包括圖標(biāo)(icon),光標(biāo)(cursor),字符串(string)等 ? ? ? ? ? ? *.GDI對(duì)象(GDI ? object),包括位圖(bitmap),畫(huà)刷(brush),元文件(metafile),調(diào)色板(palette),畫(huà)筆(pen),區(qū)域(region),以及設(shè)備描述表(device ? context)。 ? ? ? ? ? ? ? ? ? WINDOWS程序中并不是用物理地址來(lái)標(biāo)識(shí)一個(gè)內(nèi)存塊,文件,任務(wù)或動(dòng)態(tài)裝入模塊的,相反的,WINDOWS ? API給這些項(xiàng)目分配確定的句柄,并將句柄返回給應(yīng)用程序,然后通過(guò)句柄來(lái)進(jìn)行操作。 ? ? ? ? ? ? ? ? ? 在<<WINDOWS編程短平快>>(南京大學(xué)出版社)一書(shū)中是這么說(shuō)的:句柄是WONDOWS用來(lái)標(biāo)識(shí)被應(yīng)用程序所建立或使用的對(duì)象的唯一整數(shù),WINDOWS使用各種各樣的句柄標(biāo)識(shí)諸如應(yīng)用程序?qū)嵗?#xff0c;窗口,控制,位圖,GDI對(duì)象等等。WINDOWS句柄有點(diǎn)象C語(yǔ)言中的文件句柄。 ? ? ? ? ? ? ? ? ? 從上面的2個(gè)定義中的我們可以看到,句柄是一個(gè)標(biāo)識(shí)符,是拿來(lái)標(biāo)識(shí)對(duì)象或者項(xiàng)目的,它就象我們的姓名一樣,每個(gè)人都會(huì)有一個(gè),不同的人的姓名不一樣,但是,也可能有一個(gè)名字和你一樣的人。從數(shù)據(jù)類(lèi)型上來(lái)看它只是一個(gè)16位的無(wú)符號(hào)整數(shù)。應(yīng)用程序幾乎總是通過(guò)調(diào)用一個(gè)WINDOWS函數(shù)來(lái)獲得一個(gè)句柄,之后其他的WINDOWS函數(shù)就可以使用該句柄,以引用相應(yīng)的對(duì)象。在WINDOWS編程中會(huì)用到大量的句柄,比如:HINSTANCE(實(shí)例句柄),HBITMAP(位圖句柄),HDC(設(shè)備描述表句柄),HICON(圖標(biāo)句柄)等等,這當(dāng)中還有一個(gè)通用的句柄,就是HANDLE,比如下面的語(yǔ)句: ? ? ? ? ? ? ? ? ? HINSTANCE ? hInstance; ? ? ? ? ? 可以改成: ? ? ? ? ? ? ? ? ? HANDLE ? hInstance; ? ? ? ? ? ? ? ? ? 上面的2句語(yǔ)句都是對(duì)的。 ? ? ? ? ? ? ? ? ? 一個(gè)WINDOWS應(yīng)用程序可以用不同的方法獲得一個(gè)特定項(xiàng)的句柄。許多API函數(shù),諸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一個(gè)句柄值。另外,WINDOWS也能通過(guò)應(yīng)用程序的引出函數(shù)將一個(gè)句柄作為參數(shù)傳送給應(yīng)用程序,應(yīng)用程序一旦獲得了一個(gè)確定項(xiàng)的句柄,便可在WINDOWS環(huán)境下的任何地方對(duì)這個(gè)句柄進(jìn)行操作。其實(shí)句柄的大量使用已經(jīng)影響到了每一個(gè)WINDOWS的程序設(shè)計(jì)。 ? ? ? ? ? ? ? ? ? 句柄只有當(dāng)唯一的確定了一個(gè)項(xiàng)目的時(shí)候,它才開(kāi)始有意義。句柄對(duì)應(yīng)著項(xiàng)目表中的一項(xiàng),而只有WINDOWS本身才能直接存取這個(gè)表,應(yīng)用程序只能通過(guò)API函數(shù)來(lái)處理不同的句柄,舉個(gè)例子來(lái)說(shuō)吧!比如:我們可以為我們的應(yīng)用程序申請(qǐng)一塊內(nèi)存塊,通過(guò)調(diào)用API函數(shù)GlobalAlloc,來(lái)返回一個(gè)句柄值: ? ? ? ? ? ? ? ? ? hMem=GlobalAlloc(......); ? ? ? ? ? ? ? ? ? 其實(shí)現(xiàn)在hMem的值只是一個(gè)索引值,不是物理地址,應(yīng)用程序還不能直接存取這塊內(nèi)存。這兒還有一個(gè)話外題,就是,一般情況下我們?cè)诰幊痰臅r(shí)候,給應(yīng)用程序分配的內(nèi)存都是可以移動(dòng)的或者是可以丟棄的,這樣能使有限的內(nèi)存資源充分利用,所以,在某一個(gè)時(shí)候我們分配的那塊內(nèi)存的地址是不確定的,因?yàn)樗强梢砸苿?dòng)的,所以得先鎖定那塊內(nèi)存塊,這兒應(yīng)用程序需要調(diào)用API函數(shù)GlobalLock函數(shù)來(lái)鎖定句柄。如下: ? ? ? ? ? ? ? ? ? lpMem=GlobalLock(hMem); ? ? ? ? ? ? ? ? ? 這樣應(yīng)用程序才能存取這塊內(nèi)存。?? HANDLE ? Handle ? to ? an ? object. ? ? ? HDC ? ? ? ? Handle ? to ? a ? device ? context ? (DC). ? ? ? HWND ? ? ? Handle ? to ? a ? window.????? ? hWnd是窗體句柄 hDC是設(shè)備場(chǎng)景句柄 hWnd與窗口管理有關(guān) hDC與繪圖API(GDI函數(shù))有關(guān) hWnd是windows給窗口發(fā)送消息(事件)用的 hDC是把窗口繪制在屏幕上用的。 有了hWnd,可以使用API的GetDC()函數(shù)得到與其相關(guān)的hDC: hDC=GetDC(hWnd) 以下示例將在前臺(tái)窗體即當(dāng)前窗體(任何程序)畫(huà)一個(gè)圓: Private Declare Function GetForegroundWindow Lib "user32" () As Long Private Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Private Sub Command1_Click() 'KPD-Team 1998 ??? 'URL: http://www.allapi.net/ ??? 'E-Mail: KPDTeam@Allapi.net ??? Dim Ret As Long ??? Do ??????? 'Get the handle of the foreground window ??????? Ret = GetForegroundWindow() ??????? 'Get the foreground window's device context ??????? Ret = GetDC(Ret) ??????? 'draw an ellipse ??????? Ellipse Ret, 0, 0, 200, 200 ??????? DoEvents ??? Loop End Sub 個(gè)人以為:hdc主要為在控件上繪圖所用,而handle主要是操作控件所用。hdc是一種handle,即hdc<handle,如canvas的handle就是hdc.
總結(jié)
以上是生活随笔 為你收集整理的hdc和hwnd的区别 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。