在VC中顯示位圖常用取BitBlt()方法,它是將壹幅位圖從壹個設備場景復制到另壹個。源和目標DC相互間必須兼容。
雖然此方法的功能是這樣的,但是我壹直沒有理解網上壹些例子代碼,不知道其用到的各DC和位圖如何得到,及它們之間的關系。
今天工作中要將壹些位圖顯示到窗口中,所以重要學習了壹下。
我已經將要用的位圖導入到工程資源中,所以我可以用:
CBitmap cbmp;
cbmp.LoadBitmap(IDB_BMP1);
這樣得到壹個CBitmap對象。
然後:
BITMAP bitmap;
cbmp.GetBitmap(&bitmap);
這樣得到壹個BITMAP對象,之所以要得到此對象是因為從其中可以得到位圖的大小數據。
然後計算得到要在什麽位置顯示此位圖(可以放在壹個CRect rect;對象中)。
然後顯示此位圖,這是最重要的壹步:
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
hOldBitmap = dcMemory.SelectObject(&cbmp);
pDC->BitBlt(rect.left,
rect.top,
bitmap.bmWidth,
bitmap.bmHeight,
&dcMemory,
0,0,
SRCCOPY);
其中pDC是壹個CDC*,是將要在其中顯示位圖的設備環境。
這樣位圖就已經顯示出來了,但是還要釋放資源:
cbmp.DeleteObject();
dcMemory.SelectObject(hOldBitmap);
dcMemory.DeleteDC();
其中,要將臨時設備環境選擇入初始時位圖,否則將不能正確釋放!!
Bitblt作用將某壹內存塊的數據傳送到另壹內存塊,前壹內存塊被稱為"源",後壹內存塊被稱為"目標"圖象程序開發者使用Blit的函數在內存中將某頁面上的壹幅位圖經過壹定的變換轉移到另壹個頁面上
原形說明:
Declare Function BitBlt Lib "gdi32" Alias "BitBlt"(ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
hDestDC As Long, //目標設備環境的句柄
x As Long, //目標設備環境的矩形區域的左上角的x坐標
y As Long, //目標設備環境的矩形區域的左上角的y坐標
nWidth As Long, //目標設備環境的矩形區域的寬度值
nHeight As Long, //目標設備環境的矩形區域的高度值
hSrcDC As Long, //源設備環境的句柄
xSrc As Long, //源設備環境的矩形區域的左上角的x坐標
ySrc As Long, //源設備環境的矩形區域的左上角的y坐標
dwRop As Long, //光柵操作符
dwRop參數是光柵操作代碼(Rop),它是指源位圖與目標位圖以及圖案刷的顏色值進行布爾運算的方式,以下列出了常用的光柵操作碼及含義
BLACKNESS 用黑色填充目標矩形區域.
DSTINVERT 將目標矩形圖象進行反相.
MERGECOPY 將源矩形圖象與指定的圖案刷(Pattern)進行布爾"與"運算.
MERGEPAINT 將源矩形圖形經過反相後,與目標矩形圖象進行布爾"或"運算.
NOTSRCCOPY 將源矩形圖象經過反相後,復制到目標矩形上.
NOTSRCERASE 先將源矩形圖象與目標矩形圖象進行布爾"或"運算,然後再將得圖象進行反相.
PATCOPY 將指定的圖案刷復制到目標矩形上.
PATINVERT 將指定的圖案刷與目標矩形圖象進行布爾"異或"運算.
PATPAINT 先將源矩形圖象進行反相,與指定的圖案刷進行布爾"或"運算,再與目標矩形圖象進行布爾"或"運算SRCAND 將源矩形圖象與目標矩形圖象進行布爾"與"運算.
SRCCOPY 將源矩形圖象直接復制到目標矩形上.
SRCERASE 將目標矩形圖象進行反相,再與源矩形圖象進行布爾"與"運算.
SRCINVERT 將源矩形圖象與目標矩形圖象進行布爾"異或"運算.
SRCPAINT 將源矩形圖象與目標矩形圖象進行布爾"或"運算.
WHITENESS 用白色填充目標矩形區域