我自已做一个图片控件我需要我的控件背景透明。也就是说,将一副蓝底白字的图片赋给我的图片控件后,要求我的图片控件只显示白字不显示蓝底,这样就不会把窗体上的背景给挡住。首先我想用控件本身的透明属性
用UserControl.BackStyle = 0这个属性,背景是透明了。
但是
UserControl.MaskColor = RGB(0, 0, 255)
UserControl.MaskPicture = FPic.Picture 之后
显示的图片却成了黑白的了。没有办法我又想,能不能先把控件在窗体上的所在的背景图先截取下来放到控件里面做背景,然后再把赋过来的图片蓝底去掉。这样不就是透明了么。然后我用写了这个函数:
Public Sub ActiveLoad(DstDC As Long, DscX As Integer, DscY As Integer, DscW As Integer, DscH As Integer)Dim ObjDC As Long '外部获取的图片,为黑底白字
Dim BMP As Picture
Dim i As Integer
Dim TmpDC As Long, hAA As Long, hBB As Long TmpDC = CreateCompatibleDC(DstDC)
hAA = CreateCompatibleBitmap(DstDC, DscW, DscH)
hBB = SelectObject(TmpDC, hAA)
ObjDC = CreateCompatibleDC(0)
Set BMP = LoadPicture(App.Path + "\111.bmp")
SelectObject ObjDC, BMP
For i = 1 To 2
BitBlt hdc, 0, 0, 400, 400, ObjDC, 0, 0, vbSrcAnd
BitBlt hdc, 0, 0, DscW, DscH, TmpDC, DscX, DscY, vbSrcInvert
Next i
hAA = SelectObject(TmpDC, hBB)
DeleteObject hBB
DeleteObject hAA
DeleteDC TmpDC
DeleteDC ObjDC
End Sub说明:
DstDC 窗体传送给控件的句柄
DscX 窗体的LEFT
DscY 窗体的TOP
DscW 窗体的高
DscH 窗体的宽结果,背景还是没贴上去。我单独取背景:
BitBlt UserControl.hdc, 0, 0, DscW, DscH, DstDC, 0, 0, vbSrcCopy
时,发现,它把窗体看得见部分全部拷贝下来了,但是我需要的是被控件本身挡住的背景。请问各位,有什么办法可以解决么?
用UserControl.BackStyle = 0这个属性,背景是透明了。
但是
UserControl.MaskColor = RGB(0, 0, 255)
UserControl.MaskPicture = FPic.Picture 之后
显示的图片却成了黑白的了。没有办法我又想,能不能先把控件在窗体上的所在的背景图先截取下来放到控件里面做背景,然后再把赋过来的图片蓝底去掉。这样不就是透明了么。然后我用写了这个函数:
Public Sub ActiveLoad(DstDC As Long, DscX As Integer, DscY As Integer, DscW As Integer, DscH As Integer)Dim ObjDC As Long '外部获取的图片,为黑底白字
Dim BMP As Picture
Dim i As Integer
Dim TmpDC As Long, hAA As Long, hBB As Long TmpDC = CreateCompatibleDC(DstDC)
hAA = CreateCompatibleBitmap(DstDC, DscW, DscH)
hBB = SelectObject(TmpDC, hAA)
ObjDC = CreateCompatibleDC(0)
Set BMP = LoadPicture(App.Path + "\111.bmp")
SelectObject ObjDC, BMP
For i = 1 To 2
BitBlt hdc, 0, 0, 400, 400, ObjDC, 0, 0, vbSrcAnd
BitBlt hdc, 0, 0, DscW, DscH, TmpDC, DscX, DscY, vbSrcInvert
Next i
hAA = SelectObject(TmpDC, hBB)
DeleteObject hBB
DeleteObject hAA
DeleteDC TmpDC
DeleteDC ObjDC
End Sub说明:
DstDC 窗体传送给控件的句柄
DscX 窗体的LEFT
DscY 窗体的TOP
DscW 窗体的高
DscH 窗体的宽结果,背景还是没贴上去。我单独取背景:
BitBlt UserControl.hdc, 0, 0, DscW, DscH, DstDC, 0, 0, vbSrcCopy
时,发现,它把窗体看得见部分全部拷贝下来了,但是我需要的是被控件本身挡住的背景。请问各位,有什么办法可以解决么?
中DscW, DscH,的值是不是太多了,而把窗体的全部都拷下来了?你用
lngR = BitBlt( UserControl.hdc, 0, 0, DscW, DscH, DstDC, 0, 0, vbSrcCopy)
看一下lngR返回复制行的值是多少。你的这段代码调试一下,让BitBlt返回结果值看看怎么样?
For i = 1 To 2
BitBlt hdc, 0, 0, 400, 400, ObjDC, 0, 0, vbSrcAnd
BitBlt hdc, 0, 0, DscW, DscH, TmpDC, DscX, DscY, vbSrcInvert
Next i
up
up
up
up
up
up
up
up
up
up
up
up
up
up
up
up
up
up
up
up
up
up
up
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
(2002-11-15 18:46:07)
VB6直接支持图标和光标文件的背景透明,要想在窗体中放置一个背景透明而且是面积较大的图片时可以用API,当然也可以借助第三方控件来完成。笔者在这里就再介绍另一种方法——掩模覆盖法。
1、实现的原理
掩模覆盖法的原理:先对图片进行加工,保留图片的主体部分,需要透明掉的部分全部描为纯黑色生成源图片,再为这幅源图片制作一幅掩模图,就是将源图片主体部分描成纯黑色而需要透明的部分都描成纯白色。程序运行时将两幅图片在同一位置按不同方法显示在窗体或图片框上,就会显现出一幅背景透明的图片。
2、实现的代码
新建一标准EXE工程,在默认窗体Form1上放置两个图像框控件Image1和Image2,分别加载制作完成的掩码图和源图,两个图像框的其他属性均可取默认值。
程序代码如下:
PrivateSubForm_Load()
DimTU1,TU2AsPicture'定义TU1和TU2为图片对象
DimX0=0:Y0=0asInteger
Image1.Visible=False:SetTU1=Image1
Image2.Visible=False:SetTU2=Image2
AutoRedraw=True
Form1.PaintPictureTU1,x0,y0,,,,,,,&&H8800C6
Form1.PaintPictureTU2,x0,y0,,,,,,,&&H660046
EndSub
上述方法同样适用于在图片框内放置背景透明的图片。
掩模覆盖法优点是不需要附加任何外接控件,缺点是需要为每幅源图分别制作掩模图,工作量较大。**********************************************
原理在上面说清楚了,你需要在程序中根据需要自己生成mask图片