HDC是控制代碼,CDC是MFC封裝的windows裝置相關的一個類,clientDC是CDC的一個衍生類,產生於對應windows客戶區的對象。 pDC是類指標,HDC是windows控制代碼,通過pDC獲得hDC hDC=pDC->getsafeDC(),通過hdc獲得pDC,CDC *pDC=new CDC(); pDC->attch(hdc);HDC是WINDOWS的一種資料類型,是裝置描述控制代碼。 而CDC是MFC裡的一個類,它封裝了幾乎所有的關於 HDC的操作。 也可以這樣說,HDC定義的變數指向一塊記憶體,這塊 記憶體用來描述一個裝置的相關的內容,所以也可以 認為HDC定義的是一個指標;而CDC類定義一個對象, 這個對象擁有HDC定義的一個裝置描述表,同時也包 含與HDC相關的操作的函數。 這與HPEN和CPen,POINT與CPoint之間的差別是一樣 的。 CreateCompatibleDC 假如你要對螢幕進行比較多的gdi函數操作,如果每一步操作都直接對螢幕dc進行操作,那出現的大多數可能性都是螢幕的閃爍。一個很好的解決方案就是使用記憶體dc,將這些操作全部先在記憶體dc上操作,然後依次性在螢幕上進行操作。 例如:如果你單單使用bitblt在螢幕上拷貝一個圖,那可以直接使用螢幕的dc。但是如果你要先設定背景(fillrect)然後再bitblt的話,這就涉及到兩個螢幕dc的操作,這樣的話螢幕很容易閃爍。 儲存客戶區的資料為bmp圖片 1 先擷取客戶區hdc,hScrDC=getdc()函數。 然後為螢幕裝置表建立一個相容的記憶體裝置描述表 hMemDC = CreateCompatibleDC(hScrDC); 注意:CreateCompatibleDC建立的記憶體DC不能立刻使用,你必須用CreateCompatibleBitmap 建立一個記憶體Bitmap,然後把他SelectObject到記憶體DC中去 物理HDC 裝置底層會擁有顯存等資源,但是相容DC並沒有給映像像素提供記憶體空間,因此相容DC總是和BITMAP配合使用,這樣一來,相容DC就利用BITMAP的映像像素資料空間給自己提供類似於顯存的記憶體空間. 這樣有很多好處,以來我們可以在載入圖片後,在圖片上利用DC的各種繪圖功能.請看如下樣本: 相容DC在建立之初,只有1*1像素的尺寸,SelectObject選擇bitmap以後才可以進行繪圖. 記憶體DC的可見地區是簡單的地區,不像物理DC可見地區可能被其他視窗覆蓋而產生複雜的可見地區.由於DC的任何繪圖都需要考慮在可見地區內繪圖,絕對不能超出可見地區的範圍.因此每個GDI繪圖輸出最終都需要和構成複雜可見地區的每一個巨型地區進行剪裁輸出,因此物理DC的繪圖效果會比相容DC速度慢一些.這也就是我們經常用相容DC進行雙緩衝輸出的一個原因 HDC hdc=GetDC(hwnd); HDC memdc=CreateCompatibleDC(hdc); RECT rc; BITMAP bmp; HBITMAP holdbmp,hbmp=LoadBitmap(hInstDVBRes,MAKEINTRESOURCE(IDB_CLOCK));//從資源載入位元影像 holdbmp=(HBITMAP)SelectObject(memdc,hbmp);//這裡把hbmp的位元影像選擇到相容DC memdc,之後這個相容DC就擁有和 //hbmp同樣大小的繪圖區域,注意超出位元影像返回的GDI輸出都是無效的. GetObject(hbmp,sizeof(BITMAP),&bmp);//這裡擷取位元影像的大小資訊,事實上也是相容DC繪圖輸出的範圍 SetRect(&rc,0,0,bmp.bmWidth,bmp.bmHeight); DrawText(memdc,"Center Line Text" -1,&rc,DT_VCENTER|DT_SINGLELINE|DT_CENTER);//在相容DC中間位置輸出字串 //這樣以來我們就相當於把hbmp這個位元影像加上了文字標註,我們可以把這個增加了文字標註的位元影像儲存起來.一個簡單的影像處理基本就OK了. SelectObject(memdc,holdbmp);//複原相容DC資料. DeleteDC(memdc); //.......... |