【转】Windows编程之hdc和hwnd的区别
在windows編程中類型名前面加H的基本是句柄
常用句柄 :
HBITMAP 保存位圖信息的內存域的句柄
HBRUSH 畫刷句柄
HCTR 子窗口控件句柄
HCURSOR 鼠標光標句柄
HDC 設備描述表句柄
HDLG 對話框句柄
HFONT 字體句柄
HICON 圖標句柄
HINSTANCE 應用程序實例句柄
HMENU 菜單句柄
HMODULE 模塊句柄
HPALETTE 顏色調色板句柄
HPEN 筆的句柄
HWND 窗口句柄
原文地址: https://blog.csdn.net/wumenglu1018/article/details/52832321
我剛學習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是設備描述表的句柄。(犯了錯誤,應該先把句柄是什么說清楚)那么句柄是什么呢?這個解釋得很細,但可能不是很容易理解:http://blog.csdn.net/wenzhou1219/article/details/17659485
在Windows標編程設計中,使用了大量的句柄來標識對象。一個句柄是指使用的一個唯一的整數值,即一個4字節(64位程序中為8字節)長的數值,來標識應用程序中的不同對象和同類中的不同的實例,例如:一個窗口、按鈕、圖標、滾動條、輸出設備、孔健、文件等。應用程序能通過句柄來訪問相應的對象的信息。但是句柄不是指針,程序不能利用句柄來直接閱讀文件中的信息。如果句柄不在I/O文件中,它是毫無用處的。我們來看看另一個好理解的說法:在進程的地址空間中設一張表,表里頭專門保存一些編號和由這個編號對應一個地址,而由那個地址去引用實際的對象,這個編號跟那個地址在數值上沒有任何規律性的聯系,純粹是個映射而已。在Windows系統中,這個編號就叫做"句柄"。
句柄實際上是一種指向某種資源的指針,但與指針又有所不同:HWND是跨進程可見的,而指針從來都是屬于某個特定進程的。指針對應著一個數據在內存中的地址,得到了指針就可以自由地修改該數據。Windows并不希望一般程序修改其內部數據結構,因為這樣太不安全。所以Windows給每個使用GlobalAlloc等函數聲明的內存區域指定一個句柄(本質上仍是一個指針,但不要直接操作它),平時我們只是在調用API函數時利用這個句柄來說明要操作哪段內存。
因為設備描述表中記錄和某設備相關的各種信息,比如對于顯示器來說,記錄了顯示器的尺寸、分辨率,還有當前選擇的畫筆、畫刷、字體等GDI對象的信息。可以將HDC理解做一個設備的表面,比如顯示器的聲明、打印機的表面等等,我們可以使用這個HDC在這些表面上繪制圖形——很多GDI繪圖函數,都需要使用這個HDC作為參數的。
舉例看一下他們分別用到什么地方了吧:
?
HWND hwnd;//窗口句柄char szAppName[] = "window1";//創建窗口hwnd = CreateWindow(szAppName, //窗口類型名TEXT("The First Experiment"), //窗口實例的標題WS_OVERLAPPEDWINDOW, //窗口風格CW_USEDEFAULT, //窗口左上角位置坐標值xCW_USEDEFAULT, //窗口左上角位置坐標值y800, //窗口的寬度600, //窗口的高度NULL, //父窗口的句柄NULL, //主菜單的句柄hInstance, //應用程序實例句柄NULL );//顯示窗口ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);?
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;
作者:Caiaolun
鏈接:https://www.jianshu.com/p/66d9f47975ed
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
總結
以上是生活随笔為你收集整理的【转】Windows编程之hdc和hwnd的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019建行龙支付最新优惠活动!省钱攻略
- 下一篇: 兴业银行虚拟信用卡柜台开卡流程