1. 程式人生 > >Windows Gdi & CDC和HDC的區別與轉換

Windows Gdi & CDC和HDC的區別與轉換

數據類型 函數封裝 求一個 對象 指向 獲得 矩形 lease released

一,GDI基礎

GDI的繪圖函數基本上都是有狀態的,所有的函數都要求一個HDC類型的句柄。這個HDC的獲得有幾個途徑BeginPaint,GetWindowDC, GetDC.他們的參數都只需要一個HWND就差不多了。記得調用了BeginPaint後要調用EndPaint進行清理,調用GetWindowDC和GetDC後要調ReleaseDC進行清理。

而在MFC代碼中,常常遇到的CDC CPaintDC CWindowDC CClientDC。在這裏稍作解釋。

  CDC :例如用GDI畫矩形要Rectangle(hDC,...),而使用CDC則是dc.Rectangle(...),由此可見CDC主要是把原本需要HDC作為參數的GDI函數封裝了一下,HDC成了它的一個成員變量。

  CPaintDC CWindowDC CClientDC:他們都是從CDC繼承,分別是對上面所說的BeginPaint,GetWindowDC, GetDC調用對進行封裝(CPaintDC構造時調用BeginPaint,析構時調用EndPaint,其余同理)。

  BeginPaint:一般用在對WM_PAINT的響應函數中使用

  GetWindowDC:可獲得整個Window的HDC,而GetDC僅能獲得客戶區的HDC,區別就在於--

  前者有效地繪制區域是整個窗口(邊框、標題欄、客戶區的總和)。
  後者有效地繪制區域僅限於客戶區。

  兩者的坐標系都是相對坐標而非屏幕坐標,原點是(0,0)。即以自己可繪制區域的左上角作為原點。

二,CDC和HDC的區別與轉換

一)區別與聯系

HDC是句柄;CDC是MFC封裝的Windows 設備相關的一個類;CClientDC是CDC的衍生類,產生對應於Windows客戶區的對象

HDC是WINDOWS的一種數據類型,是設備描述句柄。

而CDC是MFC裏的一個類,它封裝了幾乎所有的關於HDC的操作。

也可以這樣說,HDC定義的變量指向一塊內存,這塊 內存用來描述一個設備的相關的內容,所以也可以 認為HDC定義的是一個指針;而CDC類定義一個對象, 這個對象擁有HDC定義的一個設備描述表,同時也包 含與HDC相關的操作的函數。

這與HPEN和CPen,POINT與CPoint之間的差別是一樣的。

二)獲得CDC *

CDC* pDC

pDC=GetDC();

三)獲得hdc

HDC hDC;

1,hDC=GetDC(pCxp->hWnd); // windows api

2,pDC->m_hDC; // mfc CDC class member data

四)轉換

CDC* pDC

HDC hDC;

pDC=Attach(hDC);

hDC=GetSafeHDC(pDC);

pDC->m_hDC==hDC

Windows Gdi & CDC和HDC的區別與轉換