Windows程式設計之hdc和hwnd的區別

2021-07-23 18:16:08 字數 1954 閱讀 6912

我剛學習windows程式設計時,對那些控制代碼理解很含糊,尤其是hdc和hwnd。用的很多,但其實還是不知道兩者的真正區別,先來看一下其他博主的理解。

hwnd(handle of window,也可以這麼說:h是型別描述,表示控制代碼;wnd是變數物件描述,表示視窗)是視窗控制代碼,其中包含視窗的屬性。例如,視窗的大小、顯示位置、父視窗。

hdc(handle to device context)是影象的裝置描述表,視窗顯示上下文控制代碼,其中可以進行圖形顯示。

利用hdc=getdc(hwnd),可以獲得乙個視窗的圖形裝置描述表。可以通過releasedc()函式釋放。

hwnd控制代碼是描述乙個視窗的形狀、位置、大小、是否顯示、它的父視窗、兄弟視窗、等等的一組資料結構;  

hdc控制代碼是乙個實實在在的用於具體表現這個視窗時,需要對這個視窗有個場合來實現的地方。

hwnd是窗體控制代碼;hdc是裝置場景控制代碼。

hwnd與視窗管理有關;hdc與繪圖api(gdi函式)有關。

hwnd是windows給視窗傳送訊息(事件)用的;hdc是把視窗繪製在螢幕上用的。

有了hwnd,可以使用api的getdc()函式得到與其相關的hdc:hdc=getdc(hwnd)。

我們看到了哈,hwnd和hdc都是控制代碼,不過前者是hwnd是視窗控制代碼,hdc是裝置描述表的控制代碼。(犯了錯誤,應該先把控制代碼是什麼說清楚)那麼控制代碼是什麼呢?這個解釋得很細,但可能不是很容易理解:

在windows標程式設計設計中,使用了大量的控制代碼來標識物件。乙個控制代碼是指使用的乙個唯一的整數值,即乙個4位元組(64位程式中為8位元組)長的數值,來標識應用程式中的不同物件和同類中的不同的例項,例如:乙個視窗、按鈕、圖示、滾動條、輸出裝置、孔健、檔案等。應用程式能通過控制代碼來訪問相應的物件的資訊。但是控制代碼不是指標,程式不能利用控制代碼來直接閱讀檔案中的資訊。如果控制代碼不在i/o檔案中,它是毫無用處的。我們來看看另乙個好理解的說法:在程序的位址空間中設一張表,表裡頭專門儲存一些編號和由這個編號對應乙個位址,而由那個位址去引用實際的物件,這個編號跟那個位址在數值上沒有任何規律性的聯絡,純粹是個對映而已。在windows系統中,這個編號就叫做"控制代碼"。

控制代碼實際上是一種指向某種資源的指標,但與指標又有所不同:hwnd是跨程序可見的,而指標從來都是屬於某個特定程序的。指標對應著乙個資料在記憶體中的位址,得到了指標就可以自由地修改該資料。windows並不希望一般程式修改其內部資料結構,因為這樣太不安全。所以windows給每個使用globalalloc等函式宣告的記憶體區域指定乙個控制代碼(本質上仍是乙個指標,但不要直接操作它),平時我們只是在呼叫api函式時利用這個控制代碼來說明要操作哪段記憶體。

因為裝置描述表中記錄和某裝置相關的各種資訊,比如對於顯示器來說,記錄了顯示器的尺寸、解析度,還有當前選擇的畫筆、畫刷、字型等gdi物件的資訊。可以將hdc理解做乙個裝置的表面,比如顯示器的宣告、印表機的表面等等,我們可以使用這個hdc在這些表面上繪製圖形——很多gdi繪圖函式,都需要使用這個hdc作為引數的。

舉例看一下他們分別用到什麼地方了吧:

static int nwidth, nheight;

hdc hdc;//定義裝置環境控制代碼  

hbrush hb;//定義畫筆句刷

case wm_lbuttondown://按下滑鼠左鍵則使用者區被刷成灰色

nwidth = getsystemmetrics(sm_cxfullscreen);  //螢幕寬度    

nheight = getsystemmetrics(sm_cyfullscreen); //螢幕高度

hdc=getdc(hwnd);

hb = (hbrush)getstockobject(gray_brush);//灰色畫刷

selectobject(hdc, hb);

rectangle(hdc, 0, 0, nwidth, nheight);//將使用者區重新刷成灰色

deleteobject(hb);//刪除畫刷

return 0;

可能我自己理解得還不是很到位,真誠歡迎各位同仁以及大神們指錯。

Windows程式設計之時間

查msdn可以看到,windows中的時間分為以下幾類 format type description system systemtime year,month,day,hour,second,and millisecond,taken from the internal hardware cloc...

Windows 程式設計之服務 2

除了系統定義的五種控制碼外 還有一種是 service control shutdown 使用者還可自定義控制碼,其取值範圍是128 255。使用者可以通過控制面板中的服務 項向特定服務程式的控制處理函式傳送控制碼,程式設計師可以呼叫系統函式 controlservice 直接向服務程式的控制處理函...

windows程式設計之檔案對映

當我們對檔案進行讀寫操作的時候,我們經常會呼叫readfile和writefile這兩個api,但是如果我們的檔案較大,幾百兆甚至幾g且需要時常修改值b的時候,這時那兩個函式可能就不大好了,這時微軟提供了另外一種方法 檔案對映,來使我們進行檔案操作。handle hfile,檔案控制代碼 lpsec...