Windows Gdi & CDC和HDC的區別與轉換
一,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的區別與轉換