日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【转】Windows编程之hdc和hwnd的区别

發布時間:2023/12/10 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】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的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。