1 CDC和HDC的區別與轉換 2 3 4 一、區別與聯系 5 HDC是句柄;CDC是MFC封裝的Windows 設備相關的一個類;CClientDC是CDC的衍生類,產生對應於Windows客戶區的對象 6 HDC是WINDOWS的一種數據類型,是設備描述句柄。 7 而CDC是MFC里的一個類,它封裝了幾乎所有的關於HDC的操作。 8 也可以這樣說,HDC定義的變量指向一塊內存,這塊 內存用來描述一個設備的相關的內容,所以也可以 認為HDC定義的是一個指針;而CDC類定義一個對象, 這個對象擁有HDC定義的一個設備描述表,同時也包 含與HDC相關的操作的函數。 9 這與HPEN和CPen,POINT與CPoint之間的差別是一樣的。 10 11 12 二、獲得CDC * 13 CDC* pDC 14 pDC=GetDC(); 15 16 17 三、獲得hdc 18 HDC hDC; 19 1,hDC=GetDC(pCxp->hWnd); 20 2,pDC->m_hDC; 21 3, 22 MEMDCXP Mdcxp; 23 GetMemDCXP(&Mdcxp); 24 hDC = Mdcxp.hMemDC; 25 4,hDC=::GetDC(HWND handle) 26 27 28 四、轉換 29 CDC* pDC 30 HDC hDC; 31 pDC=Attach(hDC); 32 hDC=GetSafeHDC(pDC); 33 pDC->m_hDC==hDC 34 35 36 37 38 CDC、HDC、pDC 39 1.CDC *pDC和HDC hdc有什么不同,類似的有CWnd *pWnd和HWnd? 40 41 42 pDC是類指針 43 HDC是windows句柄 44 通過pDC獲得hdc: 45 HDC hdc=pDC->GetSafeHdc(); 46 通過hdc獲得pDC: 47 CDC *pDC=new CDC; 48 pDC->Attach(hdc); 49 50 51 2.hDC和CDC有本質區別 52 53 54 HDC是WINDOWS的一種數據類型,是設備描述句柄。而CDC是MFC里的一個類,它封裝了幾乎所有的關於HDC的操作。也可以這樣說,HDC定義的變量指向一塊內存,這內存用來描述一個設備的相關的內容,所以也可以認為HDC定義的是一個指針;而CDC類定義一個對象,這個對象擁有HDC定義的一個設備描述表,同時也包含與HDC相關的操作的函數。這與HPEN和CPen,POINT與CPoint之間的差別是一樣的。 55 56 57 CDC是對hDC的相關操作進行封裝,例如CDC的一個TextOut函數隱去其錯誤檢測,完全可以簡化到這樣程度CDC:TextOut( int x, int y, const CString& str ) 58 { 59 TextOut( m_hDC, x, y, (LPCTSTR)str, str.GetLength() ); 60 } 61 62 63 m_hDC就是CDC的成員變量HDC m_hDC; 64 CDC有一個operator HDC() const { return m_hDC; } 65 你可以把它當成一個HDC使用 66 67 68 3.this是dc輸出目標窗口的指針,通過它可以得到窗口句柄,對象帶參構造這有什么奇怪的呢? 69 70 CPaintDC 無效區dc,相當於BeginPaint, EndPaint 71 CClientDC 客戶區dc,相當於GetDC, ReleaseDC 72 CWindowDC 整窗口dc, 相當於GetWindowDC, ReleaseDC 73 CDC 任何dc, 相當於CreateDC, DeleteDC