天天看點

【Visual C++】繪圖函數BitBlt的使用方法

BitBlt

該函數對指定的源裝置環境區域中的像素進行位塊(bit_block)轉換,以傳送到目标裝置環境。

原型:   

BOOL BitBlt(

    HDC  hdcDest,

    int  nXDest,  int  nYDest,  int  nWidth,  int  nHeight,

    HDC  hdcSrc,

    int  nXSrc,  int  nYSrc,

    DWORD  dwRop);

參數:    

hdcDest:指向目标裝置環境的句柄。

nXDest、nYDest:指定目标矩形區域左上角的X軸和Y軸邏輯坐标

nWidth、nHeight:指定源和目标矩形區域的邏輯寬度和邏輯高度。

hdcSrc:指向源裝置環境的句柄。

nXSrc、nYSrc:指定源矩形區域左上角的X軸和Y軸邏輯坐标。

dwRop:指定光栅操作代碼。這些代碼将定義源矩形區域的顔色資料,如何與目标矩形區域的顔色資料組合以完成最後的顔色。下面列出了一些常見的光栅操作代碼:

描述

BLACKNESS

表示使用與實體調色闆的索引0相關的色彩來填充目标矩形區域,(對預設的實體調色闆而言,該顔色為黑色)。

DSTINVERT

表示使目标矩形區域顔色取反。

MERGECOPY 

表示使用布爾型AND(與)操作符将源矩形區域的顔色與特定模式組合一起。

MERGEPAINT

通過使用布爾型OR(或)操作符将源矩形區域的顔色取反後與目标矩形區域的顔色合并。

NOTSRCCOPY

将源矩形區域顔色取反,拷貝到目标矩形區域。

NOTSRCERASE

使用布爾類型的OR(或)操作符組合源和目标矩形區域的顔色值,然後将合成的顔色取反。

PATCOPY

将特定的模式拷貝到目标位圖上。

PATINVERT

通過使用布爾型XOR(異或)操作符将源和目标矩形區域内的顔色合并。

PATPAINT

通過使用布爾型OR(或)操作符将源矩形區域取反後的顔色值與特定模式的顔色合并。然後使用OR(或)操作符将該操作的結果與目标矩形區域内的顔色合并。

SRCAND

通過使用布爾型AND(與)操作符來将源和目标矩形區域内的顔色合并。

SRCCOPY

将源矩形區域直接拷貝到目标矩形區域。

SRCERASE

通過使用布爾型AND(與)操作符将目标矩形區域顔色取反後與源矩形區域的顔色值合并。

SRCINVERT

通過使用布爾型XOR(異或)操作符将源和目标矩形區域的顔色合并。

SRCPAINT

通過使用布爾型OR(或)操作符将源和目标矩形區域的顔色合并。

WHITENESS

使用與實體調色闆中索引1有關的顔色填充目标矩形區域。(對于預設實體調色闆來說,這個顔色就是白色)。

傳回值:

   如果函數成功,那麼傳回值非零;如果函數失敗,則傳回值為零。調用GetLastError函數擷取擴充錯誤資訊。

說明:

   如果在源裝置環境中可以實行旋轉或剪切變換,那麼函數BitBlt傳回一個錯誤。

   如果存在其他變換(并且目标裝置環境中比對變換無效),那麼目标裝置環境中的矩形區域将在需要時進行拉伸、壓縮或旋轉。

   如果源和目标裝置環境的顔色格式不比對,那麼BitBlt函數将源場景的顔色格式轉換成能與目标格式比對的格式。

   當正在記錄一個增強型圖元檔案時,如果源裝置環境辨別為一個增強型圖元檔案裝置環境,那麼會出現錯誤。

   并不是所有的裝置都支援BitBlt函數。更多資訊,調用GetDeviceCaps 函數,将第二個參數指派為RC_BITBLT來檢視裝置是否支援。(For more information, see the RC_BITBLT raster capability entry in the GetDeviceCaps function, as well as the MaskBlt and StretchBlt functions. )

   如果源和目标裝置環境代表不同的裝置,那麼BitBlt函數傳回錯誤。

   在Windows CE 1.0和1.01版中,參數dwRop隻可以指定為下列值:SRCCOPY、SRCAND、SRCPAINT、SRCINVERT。在Windows CE 2.0及以後版中,參數dwRop可以是任何ROP3代碼值。 

下面是MSDN上的例子:

HBITMAP CopyBitmap( HBITMAP hbm) {

    HDC hdcSrc = CreateCompatibleDC(NULL);

    HDC hdcDst = CreateCompatibleDC(NULL);

    HBITMAP hbmOld, hbmOld2, hbmNew;

    BITMAP bm;

    GetObject(hbm, sizeof(bm), &bm);

    hbmOld = SelectObject(hdcSrc, hbm);

    hbmNew = CreateBitmap( bm.bmWidth, bm.bmHeight, bm.bmPlanes,

        bm.bmBitsPixel,

        NULL);

    hbmOld2 = SelectObject(hdcDst, hbmNew);

    BitBlt(hdcDst, 0, 0, bm.bmWidth, bm.bmHeight, hdcSrc, 0, 0, SRCCOPY);

    SelectObject(hdcSrc, hbmOld);

    SelectObject(hdcDst, hbmOld2);

    DeleteDC(hdcSrc);

    DeleteDC(hdcDst);

    return hbmNew;