|
|

楼主 |
发表于 2014-7-29 16:47
|
显示全部楼层
为了使用好位块传输,你需要掌握图形光栅方面的知识。其内容和上一期给出的位操作运算在其原理上相同。只是需要进行的并不是一个、两个或四个直接等的数据,而是一个位图数据。位图数据也是以字节来构成的,只是长度要长得多。为了使用光栅运算,你需要有一个自己的表格,以便从中查找并计划光栅方案。以下是Dan的书中的,也是我最喜欢的一个表(详细的中文说明格式的表不如它好用)∶
SRCCOPY Destination = Source
SRCPAINT Destination = Source OR Destination
SRCAND Destination = Source AND Destination
SRCINVERT Destination = Source XOR Destination
SRCERASE Destination = Source AND (NOT Destination)
NOTSRCCOPY Destination = NOT Source
NOTSRCERASE Destination = (NOT Source) AND (NOT Destination)
MERGECOPY Destination = Source AND Pattern
MERGEPAINT Destination = (NOT Source) OR Destination
PATCOPY Destination = Pattern
PATPAINT Destination = (NOT Source) OR Pattern OR Destination
PATINVERT Destination = Pattern XOR Destination
DSTINVERT Destination = NOT Destination
BLACKNESS Destination = 0
WHITENESS Destination = All bits set to 1
可惜,少一个很重要的。可别担心,本老师有办法∶
&H220326 Destination=(NOT Source) AND Detination
注∶以上,Destination指的是目标位图(BitBlt中前一个DC中的),Source是来源位图(BitBlt中的后一个DC中的)。
以下给出一个例子,是我常用的一个函数。它用来实现透明复制位图。你可以在你的程序中直接粘贴使用。它总结了本节给出的内容。
作者(xing) 1999年10月17日 整理备用
功能∶
透明复制位图
参数表∶
hDestDC -------- Long,目标设备场景
x,y ------------ Long,对目标DC中目标矩形左上角位置进行描述的那个点。用目标DC的逻辑坐标表示
nWidth,nHeight - Long,欲传输图象的宽度和高度
hSrcDC --------- Long,源设备场景。如光栅运算未指定源,则应设为0
xSrc,ySrc ------ Long,对源DC中源矩形左上角位置进行描述的那个点。用源DC的逻辑坐标表示
TransColor ----- OLE_COLOR,被透明处理的颜色
Sub TransBlt(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 TransColor As OLE_COLOR)
Dim dl As Long
Dim OrigColor As Long
Dim OrigMode As Long
Dim saveDC As Long
Dim maskDC As Long
Dim invDC As Long
Dim resultDC As Long
Dim hSaveBmp As Long
Dim hMaskBmp As Long
Dim hInvBmp As Long
Dim hResultBmp As Long
Dim hSavePrevBmp As Long
Dim hMaskPrevBmp As Long
Dim hInvPrevBmp As Long
Dim hDestPrevBmp As Long
saveDC = CreateCompatibleDC(hDestDC)
maskDC = CreateCompatibleDC(hDestDC)
invDC = CreateCompatibleDC(hDestDC)
resultDC = CreateCompatibleDC(hDestDC)
'按照规定的格式创建一幅与设备有关位图
hMaskBmp = CreateBitmap(nWidth, nHeight, 1, 1, ByVal 0&)
hInvBmp = CreateBitmap(nWidth, nHeight, 1, 1, ByVal 0&)
'创建一幅与设备有关位图
hResultBmp = CreateCompatibleBitmap(hDestDC, nWidth, nHeight)
hSaveBmp = CreateCompatibleBitmap(hDestDC, nWidth, nHeight)
hSavePrevBmp = SelectObject(saveDC, hSaveBmp)
hMaskPrevBmp = SelectObject(maskDC, hMaskBmp)
hInvPrevBmp = SelectObject(invDC, hInvBmp)
hDestPrevBmp = SelectObject(resultDC, hResultBmp)
'产生Mask图象
OrigColor = SetBkColor(hSrcDC, TransColor)
dl& = BitBlt(maskDC, 0, 0, nWidth, nHeight, hSrcDC, xSrc, ySrc, vbSrcCopy)
TransColor = SetBkColor(hSrcDC, OrigColor)
'invDC的图象将与maskDC图象相反
dl& = BitBlt(invDC, 0, 0, nWidth, nHeight, maskDC, 0, 0, vbNotSrcCopy)
'resultDC的图象将成为被写位置的图象
dl& = BitBlt(resultDC, 0, 0, nWidth, nHeight, hDestDC, x, y, vbSrcCopy)
'resultDC中,需要新写的位置将变为黑色
dl& = BitBlt(resultDC, 0, 0, nWidth, nHeight, maskDC, 0, 0, vbSrcAnd)
dl& = BitBlt(saveDC, 0, 0, nWidth, nHeight, hSrcDC, xSrc, ySrc, vbSrcCopy)
'resultDC中不被写入的颜色成为黑色
dl& = BitBlt(saveDC, 0, 0, nWidth, nHeight, invDC, 0, 0, vbSrcAnd)
'将两幅图合并起来
dl& = BitBlt(resultDC, 0, 0, nWidth, nHeight, saveDC, 0, 0, vbSrcInvert)
'完工后输出
dl& = BitBlt(hDestDC, x, y, nWidth, nHeight, resultDC, 0, 0, vbSrcCopy)
SelectObject saveDC, hSavePrevBmp
SelectObject resultDC, hDestPrevBmp
SelectObject maskDC, hMaskPrevBmp
SelectObject invDC, hInvPrevBmp
DeleteObject hSaveBmp
DeleteObject hMaskBmp
DeleteObject hInvBmp
DeleteObject hResultBmp
DeleteDC saveDC
DeleteDC maskDC
DeleteDC invDC
DeleteDC resultDC
End Sub
|
|