![]() ![]() |
|
如何用VB6创建透明图象 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:45:19 文章录入:杜斌 责任编辑:杜斌 | |
|
|
透过前面的图象看到背景图象,称前面的图象为透明图象,我们见过很多程序和电视节目中都有使用透明图象,而且大家一定会为图象的透明而称奇。究竟透明图象是如何做出来的呢?下面我们将来探讨这种透明图象的制作方法。
End Type ’’API 函数说明 Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As _ Long, ByVal nCount As Long, lpObject As Any) As Long ’’经由对象的Handle取得对象数据结构的API函数 Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long ’’ 此函数将图象绘制到存储器中可避免直 ’’接将图象绘制到屏幕上而造成图象闪烁 Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, _ ByVal nHeight As Long, ByVal nPlanes As Long, _ ByVal nBitCount As Long, lpBits As Any) As Long ’’建立位图对象 Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, _ ByVal nWidth As Long, ByVal nHeight As Long) As Long ’’建立兼容性的位图 Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, _ ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _ ByVal nHeight As Long, ByVal hsourceDC As Long, ByVal xSrc As Long, _ ByVal ySrc As Long, ByVal dwRop As Long) As Long ’’图象转移 Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long ’’删除存储器DC Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long ’’为DC选用对象 Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long ’’删除位图对象 ---- 过程Transparent() 复制源位图到背景的任意 X,Y 位置,使这一区域变成透明。Transparent()接受五个参数:一个将要变成透明的源位图,一个目标 picturebox控件 (PictDest), 一个RGB颜色值,另两个是你想放置原位图的目的地坐标(destX 和 destY,以像素为单位)。
Sub Transparent(ByVal sourceBmp As Long, dest As Control, ByVal _ destX As Integer, ByVal destY As Integer, ByVal TransColor As Long) Const PIXEL = 3 Dim sourceDC As Long ’’源位图 Dim destScale As Long Dim maskDC As Long ’’mask位图 (monochrome) Dim saveDC As Long ’’源位图的备份 Dim resultDC As Long ’’源位图与背景的合并 Dim invDC As Long ’’Mask位图的反向图 Dim OrigColor As Long ’’背景色 Dim Success As Long ’’调用 Windows API的结果 Dim bmp As Bitmap ’’原位图的数据结构说明 Dim hResultBmp As Long ’’源与背景的位图合并 Dim hSaveBmp As Long ’’原位图的拷贝 Dim hSrcPrevBmp As Long Dim hDestPrevBmp As Long Dim hInvBmp As Long ’’反转掩码位图 (monochrome) Dim hPrevBmp As Long Dim hInvPrevBmp As Long Dim hSavePrevBmp As Long Dim hMaskBmp As Long Dim hMaskPrevBmp As Long destScale = dest.ScaleMode ’’保存 ScaleMode以便后面恢复 dest.ScaleMode = PIXEL ’’设置 ScaleMode sourceDC = CreateCompatibleDC(dest.hdc) ’’建立存储器DC saveDC = CreateCompatibleDC(dest.hdc) ’’建立存储器DC invDC = CreateCompatibleDC(dest.hdc) ’’建立存储器DC maskDC = CreateCompatibleDC(dest.hdc) ’’建立存储器DC resultDC = CreateCompatibleDC(dest.hdc) ’’建立存储器DC ’’接受源位图得到它的的宽度和长度 (bmp.Width , bmp.Height) Success = GetObject(sourceBmp, Len(bmp), bmp) ’’创建单色掩码位图 hMaskBmp = CreateBitmap(bmp.Width, bmp.Height, 1, 1, ByVal 0&) hInvBmp = CreateBitmap(bmp.Width, bmp.Height, 1, 1, ByVal 0&) hResultBmp = CreateCompatibleBitmap(dest.hdc, bmp.Width, _ bmp.Height) hSaveBmp = CreateCompatibleBitmap(dest.hdc, bmp.Width, _ bmp.Height) hSrcPrevBmp = SelectObject(sourceDC, sourceBmp) hSavePrevBmp = SelectObject(saveDC, hSaveBmp) hMaskPrevBmp = SelectObject(maskDC, hMaskBmp) hInvPrevBmp = SelectObject(invDC, hInvBmp) hDestPrevBmp = SelectObject(resultDC, hResultBmp) ’’选择位图
Success = BitBlt(saveDC, 0, 0, bmp.Width, bmp.Height, sourceDC, _ 0, 0, vbSrcCopy) ’’制作源位图的拷贝以便后面恢复 OrigColor = SetBkColor(sourceDC, TransColor) Success = BitBlt(maskDC, 0, 0, bmp.Width, bmp.Height, sourceDC, _ 0, 0, vbSrcCopy) TransColor = SetBkColor(sourceDC, OrigColor) Success = BitBlt(invDC, 0, 0, bmp.Width, bmp.Height, maskDC, _ 0, 0, vbNotSrcCopy) ’’拷贝背景图并创建最终的透明位图 Success = BitBlt(resultDC, 0, 0, bmp.Width, bmp.Height, _ dest.hdc, destX, destY, vbSrcCopy) Success = BitBlt(resultDC, 0, 0, bmp.Width, bmp.Height, _ maskDC, 0, 0, vbSrcAnd) Success = BitBlt(sourceDC, 0, 0, bmp.Width, bmp.Height, invDC, _ 0, 0, vbSrcAnd) Success = BitBlt(resultDC, 0, 0, bmp.Width, bmp.Height, _ sourceDC, 0, 0, vbSrcInvert) Success = BitBlt(dest.hdc, destX, destY, bmp.Width, bmp.Height, _ resultDC, 0, 0, vbSrcCopy) ’’在背景上显示透明位图 Success = BitBlt(sourceDC, 0, 0, bmp.Width, bmp.Height, saveDC, _ 0, 0, vbSrcCopy) ’’恢复位图 ’’选择对象以便释放 hPrevBmp = SelectObject(resultDC, hDestPrevBmp) hPrevBmp = SelectObject(sourceDC, hSrcPrevBmp) hPrevBmp = SelectObject(saveDC, hSavePrevBmp) hPrevBmp = SelectObject(invDC, hInvPrevBmp) hPrevBmp = SelectObject(maskDC, hMaskPrevBmp) ’’释放资源 Success = DeleteDC(saveDC) Success = DeleteDC(invDC) Success = DeleteDC(resultDC) Success = DeleteObject(hSaveBmp) Success = DeleteObject(hMaskBmp) Success = DeleteObject(hInvBmp) Success = DeleteDC(sourceDC) Success = DeleteDC(maskDC) Success = DeleteObject(hResultBmp) dest.ScaleMode = destScale ’’恢复 ScaleMode End Sub |
|
![]() ![]() |