通常使用CreateCompatibleBitmap時候都會用到CreateCompatibleDC。而是用CreateCompatibleDC的目的不是為CreateCompatibleBitmap而產生,它更多為了建立內存設備環境起一個繪圖操作與顯示設備之間的緩沖作用,而CreateCompatibleBitmap 是為擴展內存設備環境的圖像空間
CreateComptibleDC在mfc與sdk編程中參數不一樣,前者是CDC*,后者是hdc(通常大多數繪圖在sdk中是hdc,而mfc是cdc*),但作用都一樣,都是為了創建一個與設備環境上下文兼容的內存設備環境(可以理解成一個與設備一樣的環境),但值得注意的是這樣創建出來的內存設備環境的圖像空間尺寸是很小的,通常是1*1像素大小,而且還是單色的(沒想通搞啥,可能為了兼容以前設備或者程序),因此需要調用SelectObject函數來加載位圖bitmap,這樣加載的位圖尺寸大小就相當於了內存設備環境尺寸大小。接下來才可以進行一系列繪圖操作。
對於CreateCompatibleBitmap函數,是為了創建與指定的設備環境相關的設備兼容的位圖。有時候會覺得直接從資源里加載位圖資源即可,何必直接創建呢?但有時是必要的,比如你想直接對屏幕操作,又想避免閃爍。這時候就可以Create一個內存DC,使用CreateCompatibleBitmap產生一個bitmap,然后內存DC使用SelectObject加載bitmap,這樣內存中才有一個固定大小的圖像空間,其次再使用bitblt把屏幕copy到內存DC中,這樣子你可以在內存dc中進行各種繪圖操作。當然你也可以用在內存緩沖中完成對一張圖片的操作(如縮放、透明等),也有必要create一個bitmap
另外參考可以見:
http://blog.csdn.net/hhygcy/article/details/4073975 這個寫得挺詳細的~
http://fengqing888.blog.163.com/blog/static/3301141620091019104353119/ 這個前半部分可以看看即可,后半部分確實沒那么大吸引力~
PS:
1、對於CreateCompatibleBitmap 初始化顏色,我實踐一下,屏幕顯示的是黑色
2、(第二個鏈接中有這樣一段原話,沒有修改)由CreateCompatibleBitmap 函數創建的位圖的顏色格式與由參數hdc標識的設備的顏色格式匹配。該位圖可以選入任意一個與原設備兼容的內存設備環境中。由於內存設備環境允許彩色和單色兩種位圖。因此當指定的設備環境是內存設備環境時,由CreateCompatibleBitmap函數返回的位圖格式不一定相同。然而為非內存設備環境創建的兼容位圖通常擁有相同的顏色格式,並且使用與指定的設備環境一樣的色彩調色板 其實說的不是太清楚,CreateCompatilbeBitmap 參數中可以選擇的hdc可以是內存設備環境或者物理設備環境,而選擇的hdc會決定你所創建bitmap的顏色格式,如果你選擇內存環境,若是是單色的,所創建的bitmap也是單色的;如果是彩色的,也是彩色的。選擇物理設備環境,則是彩色的。其實第一個鏈接就是對其中進行探討,我覺得看到這邊不明白可以直接看msdn:http://msdn.microsoft.com/en-us/library/windows/desktop/dd183488(v=vs.85).aspx 里面很詳細。
具體例子如下: 我們可以使用
HDC hDC2 = CreateCompatibleDC( hDC );
HBITMAP hBM = CreateCompatibleBitmap( hDC, 400, 400 );
SelectObject( hDC2, hBM );
也可以這樣使用:
HDC hDC2 = CreateCompatibleDC( hDC );
HBITMAP hBM = CreateCompatibleBitmap( hDC2, 400, 400 );
SelectObject( hDC2, hBM );
前者code的hdc2的顏色格式應該是彩色,而后者是單色的。