在VC中顯示位圖常用BitBlt()函數,它是將一幅位圖從一個設備場景複製到另一個。源和目標DC相互間必須兼容。雖然此方法的功能是這樣的,但是我一直沒有理解網上一些例子代碼,不知道其用到的各DC和位圖之間的關係。
今天工作中要將位圖顯示到Dialog中,所以重要學習了一下。
我已經將要用的位圖導入到工程資源中,所以我可以用
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP_EIGHTHORSES);
這樣得到一個CBitmap對象。然後,
BITMAP bmInfo;
bitmap.GetBitmap(&bmInfo);
這樣得到一個BITMAP對象,之所以要得到此對象是因爲從其中可以得到位圖的大小數據。
然後計算得到要在什麼位置顯示此位圖(可以放在一個CRect對象中)。
然後顯示此位圖,這是最重要的一步。
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
pOldBitmap = dcMemory.SelectObject(&bitmap);
pDC->BitBlt(rect.left, rect.top, bmInfo.bmWidth, bmInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY);
其中pDC是一個CDC指針,是將要顯示位圖的設備環境。
這樣位圖就已經顯示出來了,但是還要釋放資源。
bitmap.DeleteObject();
dcMemory.SelectObject(pOldBitmap);
dcMemory.DeleteDC();
注意,要將臨時設備環境選擇入初始位圖,否則將不能正確釋放!!
總結:
要在目標設備環境中顯示位圖,不能直接在上面“畫”(目前我是我麼覺得的)。需要創建一個與之相兼容的臨時設備環境,將位圖選擇入臨時設備環境,然後再從臨時設備環境中拷備位圖以顯示到目標設備環境中。而選入這個動作相當與已經將位圖“畫在了臨時設備環境中”(實際上並沒有畫,否則就可以直接選入要畫圖的CDC了),而且選入後位圖在臨時設備環境中的位置是左上角!
效果:
代碼下載:https://download.csdn.net/download/sunriver2000/12182822